`
wbj0110
  • 浏览: 1610809 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

用Solr搭建搜索服务

    博客分类:
  • 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搭建你的搜索引擎

    标题中的“利用Solr搭建你的搜索引擎”意味着我们将探讨Apache Solr这一开源全文搜索平台的搭建过程。Solr是基于Lucene库的,提供了一个高效、可扩展的搜索和导航功能,广泛应用于各种企业的数据检索需求。 Solr的...

    solr搭建步骤

    Solr 搭建步骤详解 Solr 是一款流行的开源搜索引擎 Server,基于 Lucene 搜索库。... Solr 搭建需要了解 Solr 的版本信息,搭建 Solr 服务,配置 Solr,搭建 Solr 客户端。通过这四步骤, Solr 搭建就完成了。

    SOLR搭建企业搜索平台

    【SOLR搭建企业搜索平台】 SOLR(Apache Solr)是一款开源的企业级全文搜索引擎,基于Lucene库,提供高效、可扩展的搜索和分析功能。本文将详细阐述如何利用SOLR搭建一个企业搜索平台,包括所需环境、配置步骤以及...

    lucene简单介绍及solr搭建使用

    标题“lucene简单介绍及solr搭建使用”涉及了两个主要的开源搜索技术:Lucene和Solr。Lucene是Java开发的一个全文检索库,而Solr则是基于Lucene构建的企业级搜索平台,提供了更高级的功能和管理界面。 **Lucene简介...

    solr服务器的搭建

    Solr服务器搭建是一个重要的步骤,它是Apache Lucene项目的一个企业级搜索平台,广泛应用于全文检索、数据索引和搜索解决方案。下面将详细讲解如何在Java 1.7和Tomcat 1.7环境下搭建Solr 4.10.3单机版。 一、Java...

    solr搭建相关资源

    Solr是中国Apache软件基金会开发的一款高性能、基于Java的全文搜索引擎服务器。它允许用户通过HTTP请求对索引进行...通过理解和应用这些知识,你将能够成功地搭建起一个功能完备的Solr搜索引擎服务,满足各种搜索需求。

    solr4.7服务搭建

    ### Solr 4.7 服务搭建详细指南 #### 一、环境准备 为了搭建 Solr 4.7 服务,我们需要确保以下环境已经准备好: ...通过以上步骤,用户可以成功搭建并配置好 Solr 4.7 服务,实现高效的数据索引和搜索功能。

    solr 搭建和使用

    本教程将详细介绍如何搭建Solr,并进行基本的使用。 一、Solr的安装与配置 1. 下载Solr:首先,你需要从Apache官方网站(http://lucene.apache.org/solr/)下载最新版本的Solr。通常,下载的是一个压缩包文件,如`...

    solr搭建搜索

    标题中的“solr搭建搜索”指的是使用Apache Solr来构建一个全文搜索引擎。Solr是Apache软件基金会的一个开源项目,它提供了高性能、可扩展的搜索和分析能力。在本主题中,我们将深入探讨如何搭建Solr搜索环境以及...

    solr搜索服务器安装配置

    本文详细介绍了Solr搜索服务器的安装配置过程,从环境搭建到具体配置步骤进行了全面的讲解,并提供了常见的问题解决方法。通过本文的学习,读者应该能够掌握如何成功地安装和配置Solr搜索服务器,从而为自己的项目...

    使用lucenesolr搭建Oracle数据库全文搜索服务.docx

    ### 使用Lucene Solr搭建Oracle数据库全文搜索服务 #### 一、基础知识介绍 - **Lucene**: 是一个高性能、全功能的全文检索引擎库。它为开发者提供了构建搜索应用程序所需的工具,但不提供完整的搜索应用。 - **...

    solr配置搜索引擎平台

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

    人工智能-项目实践-搜索引擎-基于solrj开发solr主从搜索引擎服务的dubbo组件

    其次,我们要搭建主从复制的Solr集群,这是为了提高服务的可用性和数据的一致性。主节点负责接收和处理写操作,从节点则同步主节点的数据,保证在主节点故障时能无缝接管服务。Solr的Replication Handler实现了这一...

    SOLR搭建企业搜索平台,步骤清晰,适合初学者

    ### SOLR搭建企业级搜索平台:详尽指南与中文分词集成 #### 一、SOLR概述 SOLR,全称为Search Platform Optimized for Lucene in Java,是Apache Lucene的一个开源全文搜索引擎框架。它能够提供高性能的全文检索...

Global site tag (gtag.js) - Google Analytics