当前位置:  编程技术>综合
本页文章导读:
    ▪用Solr搭建搜索服务      背景 我用Lucene3.6,为php语言搭建的平台提供一套搜索服务,但是lucene只是个提供索引操作的库,需要一个web-service来提供给java外的语言,使之可以通过http方式发送搜索请求并得到如json, xml.........
    ▪tomcat HTTP Status 403 - Access to the requested resource has been denied      1、找到你的tomcat安装路径——conf——tomcat-user.xml文件将你登录名用户修改一下 修改前: <tomcat-users>   <role rolename="manager"/>   <role rolename="admin"/>   &nb.........
    ▪printf函数使用—针对不同数据类型的输出结果详解       #include<stdio.h> #include<string.h> int main() { char c, s[20], *p; int a=1234, *i; float f=3.141592653589; double x=0.12345678987654321; p="How do you do"; .........

[1]用Solr搭建搜索服务
    来源: 互联网  发布时间: 2013-11-05

背景

我用Lucene3.6,为php语言搭建的平台提供一套搜索服务,但是lucene只是个提供索引操作的库,需要一个web-service来提供给java外的语言,使之可以通过http方式发送搜索请求并得到如json, xml格式的查询结果集数据。而Solr是一个二次包装了Lucene库的搜索服务容器,兼容lucene的api,可以在jetty或者Tomcat这样的容器里以web服务的方式启动并提供一套自己的索引建立,更新,删除,查询接口,以及更高级更全面的接口服务。


关于Solr

Solr版本随着lucene版本的更新而兼容更新,目前已经发布4.0,我使用的是3.6版本。在配置中文分词库以及使用Solrj来访问solr服务的时候,也因为版本比较新,遇到了一些问题,我会在下面详细说明。我初步感受,Solr和lucene有以下一些区别:

Solr的索引建立主要有通过xml文件读取需要建索引的数据、通过solrj用api来addDocument,此外还有读取CVS文件,获取post来的json数据以及直接从数据库读(DIH)。来讲讲主要的索引建立方法。其实通过Solrj用api里的类和函数来建索引是类似于Lucene的做法的,差别是两者的api长的不一样。但凡使用过lucene的人,就会觉得solrj的关键类和使用方法还是一目了然,比如下面这样:

String url = "http://localhost:8080/solr";
SolrServer server = new HttpSolrServer(url);
SolrQuery query = new SolrQuery();
SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField( "id", "id1", 1.0f );
doc1.addField( "name", "doc1", 1.0f );
doc1.addField( "price", 10 );
SolrInputDocument doc2 = new SolrInputDocument();
doc2.addField( "id", "id2", 1.0f );
doc2.addField( "name", "doc2", 1.0f );
doc2.addField( "price", 20 );
Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
docs.add( doc1 );
docs.add( doc2 );
server.add( docs ); 
server.commit();

下载solr后,在 {solr.home}/example/exampledocs 内会有一些xml,就是通过第一种建索引的方式用xml文件导入数据。比如下面这样:

<add><doc>
  <field name="id">3007WFP</field>
  <field name="name">Dell Widescreen UltraSharp 3007WFP</field>
  <field name="manu">Dell, Inc.</field>
  <field name="cat">electronics</field>
  <field name="cat">monitor</field>
  <field name="features">30" TFT active matrix LCD, 2560 x 1600, .25mm dot pitch, 700:1 contrast</field>
  <field name="includes">USB cable</field>
  <field name="weight">401.6</field>
  <field name="price">2199</field>
  <field name="popularity">6</field>
  <field name="inStock">true</field>
  <!-- Buffalo store -->
  <field name="store">43.17614,-90.57341</field>
</doc></add>
这两者都有个共同的问题,关于不同Filed的分词,STORE,Analyze是怎么处理的?

solr有两个重要的配置文件:scheme.xml和solrconfig.xml

scheme.xml主要配置:

每个fieldtype来自哪个类,是solr自带的主要类型,还是你自己要加入的类,比如中文分词的类,各举一个例子:

<fieldType name="string" class="solr.StrField" sortMissingLast="true" />
<fieldType name="boolean" code" ><fieldType name="text_ik" class="solr.TextField"> 
      <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> 
</fieldType>
上面第二个配置是我加的中文分词,使用的是IKAnalyzer,版本是2012u6,最新的版本。配置了filedtype之后,要在scheme.xml里配置将要建立的索引字段的类型和信息:

<field name="goods_id" type="string" indexed="false" stored="true"/>
<field name="brand_name" type="text_ik" indexed="true" stored="true"/>
这样应该解释清楚了。至于,solrconfig.xml,主要是一些系统依赖,缓存配置,各种http的requestHandler的请求处理类等。

总结,就是solr的索引配置主要在xml里,甚至数据也可以写成xml,然后在cmd里添加数据文件,这就是封装了lucene的结果,比lucene更高层一点,而我认为这样的配置不怎么方便,我的选择是把自己用lucene建出来的索引块直接丢到solr索引目录里,并在scheme.xml里添加好字段,包括配置好中文分词工具,因为solr和lucene是兼容的,而包装到来的效果就是api不够底层。
再举几个小的方面,其实也可以说是solr比lucene进步的地方。lucene源码里,core包之外的随后整合的附加功能包highlighting在solr里是已经配置完整,并且solr的搜索url里可以整合排序和高亮等要求,给几个例子(hl是highlighting缩写):

q=video&sort=score desc
q=video&sort=inStock asc, score desc
q=video card&fl=name,id&hl=true&hl.fl=name,features

solr其实就是把lucene包装之后,变成了一个web的服务,放在容器里run起来后,可以通过http访问,作为一个中间件的服务存在。如果你自己做,也就是把lucene开发好之后写一些servlet的东西,也放在tomcat,jetty里面跑,然后接受url,做相应的response。solr的搜索请求和数据导入方式比较多样,适合不同开发者选用方便的特性适应需求,在Solr Tutorial里可以看到。


Solr的安装和配置

网上有很多资料,Solr3.6版本的配置也没有什么特别的。下载解压之后,可以选择直接进入 {solr.home}/example 目录,用 java -jar start.jar在8983端口启动服务,是在jetty容器里启动的,在 {solr.home}/example 子目录下已经为你部署好了jetty,jsp的jar包以及环境配置。你也可以启动自己的tomcat,把solr.war放到tomcat的webapp目录下,注意的是需要在 {tomcat.home}/conf/Catalina/localhost 下手动加一个solr.xml文件,作用是指向你的{solr.home}路径,让tomcat找到你要启动的web服务。比如我的:

<Context docBase="E:\softs2\apache-tomcat-6.0.36\webapps\solr.war" debug="0" crossContext="true" >
   <Environment name="solr/home" type="java.lang.String" value="E:\softs2\apache-solr-3.6.2\example\solr" override="true" />
</Context>

启动solr后,通过浏览器就可以访问到你的solr服务,具体别的自己慢慢研究吧。


由于版本而导致的问题并解决方案
首先是中文分词器。我使用的是IKAnalyzer2012_u6版本,IK,庖丁和mmseg是主流的三个支持lucene的分词库。但是中文分词库注定悲剧的地方在于总要跟着国外开源软件的更新走,一旦lucene,solr更新了,某些基础类改变或者接口变动,分词器可能就不再支持了。IKTokenizerFactory继承自solr的BaseTokenizerFactory,但是BaseTokenizerFactory在solr3.6之后版本已经不存在了,如果你按照以前的配置方式在scheme里配置:

<fieldType name="text" class="solr.TextField" > 
  <analyzer type="index"> 
    <tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" useSmart ="false"/> 
  </analyzer> 
  <analyzer type="query">   <tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" useSmart ="false"/> 
  </analyzer> 
</fieldType>
启动solr后报错提示BaseTokenizerFactory类是找不到了的。所以只能这样配置:

<fieldType name="text_ik" class="solr.TextField"> 
      <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/> 
</fieldType> 
再者是solrj版本。我的solr是3.6版本,我在IDE里使用的solrj是3.6.0版本的。通过maven的pom.xml里的Dependencis查找solrj,并自动获取相关包之后,还是会出现问题。原因是HttpSolrServer类还依赖别的包。那就是httpcomponents的httpclient和httpmime包,应该4.1后的版本是可以的,我依赖的是4.1.3。总之最后的pom.xml里的配置是这样的:

<dependencies>
	<dependency>
		<groupId>junit</groupId>
		<artifactId>junit</artifactId>
		<version>3.8.1</version>
			<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId&      
    
[2]tomcat HTTP Status 403 - Access to the requested resource has been denied
    来源: 互联网  发布时间: 2013-11-05

1、找到你的tomcat安装路径——conf——tomcat-user.xml文件将你登录名用户修改一下

修改前:

<tomcat-users>
  <role rolename="manager"/>
  <role rolename="admin"/>
    <user username="admin" password="admin" roles="admin"/>

</tomcat-users>

这种的使用admin/admin登录是有效果的,localhost,但是将localhost换成127.0.0.1就会出现错误

修改后:

<tomcat-users>
  <role rolename="manager"/>
  <role rolename="admin"/>
    <user username="admin" password="admin" roles="manager"/>

</tomcat-users>

这样就可以使用127.0.0.1访问了,

2、问题所在:角色设置问题,后期进一步说明原因

作者:happy513842343 发表于2013-1-5 17:29:35 原文链接
阅读:1 评论:0 查看评论

    
[3]printf函数使用—针对不同数据类型的输出结果详解
    来源: 互联网  发布时间: 2013-11-05
     #include<stdio.h>
     #include<string.h>
     int main()
     {
          char c, s[20], *p;
          int a=1234, *i;
          float f=3.141592653589;
          double x=0.12345678987654321;
          p="How do you do";
          strcpy(s, "Hello, Comrade");
          *i=12;
          c='\x41';
          printf("a=%d\n", a);     /*结果输出十进制整数a=1234*/
          printf("a=%6d\n", a);    /*结果输出6位十进制数a=  1234*/
          printf("a=%06d\n", a);   /*结果输出6位十进制数a=001234*/
          printf("a=%2d\n", a);    /*a超过2位, 按实际值输出a=1234*/
          printf("*i=%4d\n", *i);  /*输出4位十进制整数*i=  12*/
          printf("*i=%-4d\n", *i); /*输出左对齐4位十进制整数*i=12*/
          printf("i=%p\n", i);     /*输出地址i=06E4*/
          printf("f=%f\n", f);     /*输出浮点数f=3.141593*/
          printf("f=6.4f\n", f);   /*输出6位其中小数点后4位的浮点数f=3.1416*/
          printf("x=%lf\n", x);    /*输出长浮点数x=0.123457*/
          printf("x=%18.16lf\n", x);/*输出18位其中小数点后16位的长浮点数x=0.1234567898765432*/
          printf("c=%c\n", c);     /*输出字符c=A*/
          printf("c=%x\n", c);     /*输出字符的ASCII码值c=41*/
          printf("s[]=%s\n", s);   /*输出数组字符串s[]=Hello, Comrade*/
          printf("s[]=%6.9s\n", s);/*输出最多9个字符的字符串s[]=Hello,Co*/
          printf("s=%p\n", s);     /*输出数组字符串首字符地址s=FFBE*/
          printf("*p=%s\n", p);    /* 输出指针字符串p=How do you do*/
          printf("p=%p\n", p);     /*输出指针的值p=0194*/
          getch();
          retunr 0;
     }

作者:sdwuyulunbi 发表于2013-1-5 17:26:12 原文链接
阅读:30 评论:0 查看评论

    
最新技术文章:
▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
java/j2ee iis7站长之家
▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
▪运行skyeye缺少libbfd-2.18.50.0.2.20071001.so问题    ▪sharepoint 2010 使用sharepoint脚本STSNavigate方法实...    ▪让javascript显原型!
▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
▪Deep Copy VS Shallow Copy    ▪iphone游戏开发之cocos2d (七) 自定义精灵类,实...    ▪100个windows平台C++开发错误之八编程
▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3