`
jgsj
  • 浏览: 962196 次
文章分类
社区版块
存档分类
最新评论

Solr配置搜索服务

 
阅读更多

背景

我用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" class="solr.BoolField" sortMissingLast="true"/>
<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>
		<version>5.1.18</version>
	</dependency>
	<dependency>
		<groupId>IKAnalyzer</groupId>
		<artifactId>IKAnalyzer</artifactId>
		<version>2012u6</version>
		<scope>system</scope>
		<systemPath>${project.basedir}/lib/IKAnalyzer2012_u6.jar</systemPath>
	</dependency>
	<dependency>
		<groupId>org.apache.lucene</groupId>
		<artifactId>lucene-analyzers</artifactId>
		<version>3.6.0</version>
	</dependency>
	<dependency>
		<groupId>org.apache.solr</groupId>
		<artifactId>solr-solrj</artifactId>
		<version>3.6.0</version>
	</dependency>
	<dependency>
		<groupId>org.apache.httpcomponents</groupId>
		<artifactId>httpclient</artifactId>
		<version>4.1.3</version>
	</dependency>
	<dependency>
		<groupId>org.apache.httpcomponents</groupId>
		<artifactId>httpmime</artifactId>
		<version>4.1.3</version>
	</dependency>
</dependencies>
最后会依赖到下面这些jar包:



有了solr服务,有了中文分词,有了solrj,搭建自己的solr搜索服务平台就没什么问题了。最后给出一些相关基础资料,方便使用solr:

Solrj:http://wiki.apache.org/solr/Solrj

Solr Tutorial:http://lucene.apache.org/solr/api-3_6_1/doc-files/tutorial.html

Solr中文网:http://www.solrcn.com



分享到:
评论

相关推荐

    solr配置搜索引擎平台

    solr配置搜索引擎平台 一、 SOLR搭建企业搜索平台 二.... 三,,,,

    Solr高级搜索+tomcat整合服务器

    Solr如何进行索引和搜索 索引:客户端(可以是浏览器可以是java程序)发送post请求到solr服务器,发给solr服务器一个文档(xml、json),就可以进行一个添加索引删除索引、修改索引的操作。 搜索:客户端(可以是...

    solr搜索服务器安装配置

    solr搜索服务器安装配置--资料备份

    solr搜索引擎服务

    sorl搜索引擎安装与文件,Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。

    solr 企业搜索引擎教程

     后台缓存热启:当一个新的搜索器被打开时,可配置的搜索将它热启,避免第一个结果慢 下来,当热启时,当前搜索器处理目前的请求(???)。  后台自动热启:当前搜索器缓存中最常访问的项目在新的搜索器中再次生成,能够在...

    solr5.5.4全文搜索服务器

    Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是...

    企业级搜索引擎solr教程

    tomcat7下实现solr4.3的部署与配置,配置中文服务器。通过solrj实现索引的创建,修改,删除,查询。并实现httpclienct创建、修改索引,检索信息等。

    Solr服务器

    Solr服务器是基于solr搭建的一个服务器,服务器配置全部实现。可用于全局搜索。

    Solr5.3.1搜索引擎搭建详细教程(包括集成mysql、添加中文分词、添加同义词、查询语法等)

    Solr 5.3.1搜索引擎搭建详细教程(包括集成mysql、添加中文分词、添加同义词、查询语法等)

    solr搜索培训

    Solr的特性包括:高级的全文搜索功能 专为高通量的网络流量进行的优化 基于开放接口(XML和HTTP)的标准 综合的HTML管理界面 可伸缩性-能够有效地复制到另外一个Solr搜索服务器 使用XML配置达到灵活性和适配性 可...

    solr导航搜索工具+文档+配置代码

    solr导航搜索工具+文档+配置代码里面有详细的讲解和已经配好的代码如果用我只需改成自己的地址就可以留言我可回复教学

    solr服务器的搭建

    Solr服务器采用java5开发的,是基于Lucene全文搜索的。 要想搭建Solr,首先进行java环境的配置,安装对应的jdk以及tomcat,在此就不多讲。 以下是在jdk1.7和tomcat1.7的环境下搭建最新版本的solr4.10.3。

    solr 配置 以及建立索引

    在tomcat中配置solr,以及solr 全文搜索建立索引的相关方法总结

    Solr入门配置说明

    Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的...

    solr安装到Linux系统

    在Linux系统上如何搭建了solr搜索服务,同时运用到项目中

    java进阶Solr从基础到实战

    在本套课程中,我们将全面的讲解Solr,从Solr基础到Solr高级,再到项目实战,基本上涵盖了Solr中所有的知识点。 主讲内容 章节一:Solr基础(上) 1. 环境搭建 2. 核心讲解 3. 数据导入 4. 各种中文分析器 章节二:...

    solr服务器的搭建与配置实例

    Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的...

    搜索引擎solr环境配置、分词及索引操作

    搜索引擎solr环境配置、分词及索引操作

    SOLR搭建企业搜索平台

    主要介绍了如和用solr搭建搜索平台的详细步骤,同时对配置文件进行了详细介绍。 运行容器:Tomcat6.0.20 Solr版本:apache-solr-1.4.0 分词器:mmseg4j-1.6.2 词库:sogou-dic

    solr配置和solrj使用(demo)

    Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http G Solret操作提出查找请求,并得到XML...

Global site tag (gtag.js) - Google Analytics