Solr 全文搜索服务器


       项目中使用的搜索引擎的模块,之前是其他同事开发的,感觉有点小缺陷,需要人工去录入索引,更新,重做索引等!于是自己动手搭建了套,找了相关资料,折腾了下。在这里总结记录下来,一是给自己加深印象  二是给需要帮助的朋友提供一个参考!


一  介绍

Apache Solr (读音: SOLer) 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。Apache Solr 中存储的资源是以 Document 为对象进行存储的。每个文档由一系列的 Field 构成,每个 Field 表示资源的一个属性。Solr 中的每个 Document 需要有能唯一标识其自身的属性,默认情况下这个属性的名字是 id,在 Schema 配置文件中使用:<uniqueKey>id</uniqueKey>进行描述。


Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提 供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。





二  下载

http://mirror.bit.edu.cn/apache/lucene/solr/4.2.0/

 我下载的版本是:solr-4.2.0.tgz  111MB

打开目录结构:



三  部署

linux 服务器 tomcat 路径: /usr/local/tomcat_solr

1、将 solr-4.2.0\example  下的 solr 打包放到  /usr/local/tomcat_solr

2、将 solr-4.2.0\dist   下的solr-4.2.0.war 改名为 solr.war 放到 /usr/local/tomcat_solr/webapps

3、 进入/usr/local/tomcat_solr/conf/Catalina/localhost目录,创建solr.xml   内容如下:

<Context docBase="/usr/local/tomcat_solr/webapps/solr.war" debug="0" crossContext="true">
<Environment name="solr/home" type="java.lang.String" value="/usr/local/tomcat_solr/solr" override="true" />
</Context>
4、重启tomcat_solr 输入:  http://localhost:8080/solr/  出现如下界面,ok,证明你配置成功了。


四 根据项目需要配置solr。

     添加索引,solr 有2种录入索引的方式,我这里介绍通过dataimport 自动录入索引。

cd  /usr/local/tomcat_solr/solr/collection1/conf

1、打开,solrconfig.xml 在<config> 节点下增加:

<requestHandler   name = "/dataimport"   class = "org.apache.solr.handler.dataimport.DataImportHandler" >
<lst   name="defaults">
<str   name="config">data-config.xml</str>
</lst>
</requestHandler>

2、注意,刚copy过去目录中是没有 dataimport相关jar包的,没给打包到项目中,我在配置的时候就漏掉了,启动时报 找不到class,

将:solr-4.2.0\dist  下的:solr-dataimporthandler-4.2.0.jar   solr-dataimporthandler-extras-4.2.0.jar  由于我用的是mysql数据,还需要找一个mysql驱动

mysql-connector-java-5.1.15-bin.jar 一起放到   /usr/local/tomcat_solr/webapps/solr/WEB-INF/lib


3、第一步中配置引用了 data-config.xml ,在/usr/local/tomcat_solr/solr/collection1/conf 下创建data-config.xml 内容如下:


<dataConfig>
  <dataSource type="JdbcDataSource" 
              driver="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/cms" 
              user="root" 
              password="root"/>
  <document>
   <entity name="movie" pk="id" 
query="select  m.id,name,director,protagonist,genre,mold,area,years,imageUrl,pinyin from t_ever_movie m , t_ever_movie_url u where m.status=1 and u.status=1 and u.movie_id=m.id and  deleteDate is null "
deltaImportQuery="select  m.id,name,director,protagonist,genre,mold,area,years,imageUrl,pinyin from t_ever_movie m , t_ever_movie_url u where m.status=1 and u.status=1 and u.movie_id=m.id and  deleteDate is null and m.id='${dataimporter.delta.id}'"
deltaQuery="select  m.id,name,director,protagonist,genre,mold,area,years,imageUrl,pinyin from t_ever_movie m , t_ever_movie_url u where m.status=1 and u.status=1 and u.movie_id=m.id and  deleteDate is null and enteringDate>'${dataimporter.last_index_time}'"
>
<field column="id" name="id"/> 
<field column="name" name="name"/> 
<field column="director" name="director"/> 
<field column="protagonist" name="protagonist"/> 
<field column="genre" name="genre"/> 
<field column="mold" name="mold"/> 
<field column="area" name="area"/> 
<field column="years" name="years"/> 
<field column="imageUrl" name="imageUrl"/>
<field column="pinyin" name="pinyin"/>
<entity name="inner"  
query="select providerCode from t_ever_movie_url where movie_id ='${movie.id}' and status=1 group by providerCode">  
<field column="providerCode" name="providerCode"/>  
</entity>  
</entity>
  </document>
</dataConfig>

参数说明:


dataSource 应该都不用说,知道是配置的什么吧!
entity   下面配置的是需要录入索引的数据,solr提供了多表联合查询的操作。
${movie.id} 就是t_ever_movie 中的参数。 
providerCode 会有多个,在配置schema.xml 的时候需要设置为 multiValued="true"


4、配置schema.xml。

a、下载分词jar:

https://code.google.com/p/ik-analyzer/downloads/detail?name=IK%20Analyzer%202012FF_hf1.zip&can=2&q=

将 IKAnalyzer.cfg.xml,IKAnalyzer2012FF_u1.jar,stopword.dic 拷贝到 /usr/local/tomcat_solr/webapps/solr/WEB-INF/lib下面

schema.xml 的schema 节点下的types 节点中加入分词:

 <fieldType name="text_ik" class="solr.TextField">    
        <analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>    
        <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>    </fieldType>


b、配置fields,在fields 节点下配置:

   <field name="name" type="text_general" indexed="true" stored="true"/>
   <field name="director" type="text_general" indexed="true" stored="true"/>
   <field name="protagonist" type="text_general" indexed="true" stored="true"/>
   <field name="genre" type="text_general" indexed="true" stored="true"/>
   <field name="mold" type="text_general" indexed="true" stored="true"/>
   <field name="area" type="text_general" indexed="true" stored="true"/>
   <field name="years" type="text_general" indexed="true" stored="true"/>
   <field name="providerCode" type="text_general" indexed="true" stored="true" multiValued="true"/>

c、配置copyField 在 uniqueKey 属性下面配置:


        <copyField source="name" dest="text"/>
	<copyField source="director" dest="text"/>
	<copyField source="protagonist" dest="text"/>
	<copyField source="genre" dest="text"/>
	<copyField source="mold" dest="text"/>
	<copyField source="area" dest="text"/>
	<copyField source="years" dest="text"/>
	<copyField source="providerCode" dest="text"/>

 

ok,到这里配置基本上已经完成! 注意查看日志。重启tomcat_solr

访问http://localhost:8080/solr/dataimport?command=full-import将数据全部导入solr服务器进行索引

http://localhost:8080/solr/dataimport?command=delta-import增量导入数据

http://localhost:8080/solr/dataimport?command=status可以查看运行状态

当修改data-config.xml文件配置时http://localhost:8080/solr/dataimport?command=reload-config可以进行重新加载配置文件


最后,也是我比较喜欢的可以定时更新 和重录索引。

crontab -e
*/1 * * * *  curl http://localhsot:8080/solr/dataimport?command=delta-import > /tmp/solr.tmp 2>&1


录入索引后,监视、记录和统计数据

用于监视、记录和统计数据的 Solr 管理选项

菜单名

URL

描述

Statistics

http://localhost:8080/solr/admin/stats.jsp

Statistics 管理页提供了与 Solr 性能相关的很多有用的统计数据。这些数据包括:

关于何时加载索引以及索引中有多少文档的信息。

关于用来服务查询的 SolrRequestHandler 的有用信息。

涵盖索引过程的数据,包括添加、删除、提交等的数量。

缓存实现和 hit/miss/eviction 信息

Info

http://localhost:8080/solr/admin/registry.jsp

有关正在运行的 Solr 的版本以及在当前实现中进行查询、更新和缓存所使用的类的详细信息。此外,还包括文件存于 Solr subversion 存储库的何处的信息以及对该文件功能的一个简要描述。

Distribution

http://localhost:8080/solr/admin/distributiondump.jsp

显示与索引发布和复制有关的信息。更多信息,请参见 “发布和复制” 一节。

Ping

http://localhost:8080/solr/admin/ping

向服务器发出 ping 请求,包括在 solrconfig.xml 文件的 admin 部分定义的请求。

Logging

http://localhost:8080/solr/admin/logging.jsp

让您可以动态更改当前应用程序的日志记录等级。更改日志记录等级对于调试在执行过程中可能出现的问题非常有用。

properties

http: //localhost:8080/solr/admin/get-properties.jsp

显示当前系统正在使用的所有 Java 系统属性。Solr 支持通过命令行的系统属性替换。有关实现此特性的更多信息,请参见 solrconfig.xml 文件。

Thread dump

http://localhost:8080/solr/admin/threaddump.jsp

thread dump 选项显示了在 JVM 中运行的所有线程的堆栈跟踪信息。




常用  
q - 查询字符串,必须的。  
fl - 指定返回那些字段内容,用逗号或空格分隔多个。  
start - 返回第一条记录在完整找到结果中的偏移位置,0开始,一般分页用。  
rows - 指定返回结果最多有多少条记录,配合start来实现分页。  
sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(inStock desc, price asc)表示先 “inStock” 降序, 再 “price” 升序,默认是相关性降序。  
wt - (writer type)指定输出格式,可以有 xml, json, php, phps, 后面 solr 1.3增加的,要用通知我们,因为默认没有打开。  
fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找关键字mm,并且date_time是20081001到20091031之间的。官方文档:http://wiki.apache.org/solr/CommonQueryParameters  
不常用  
q.op - 覆盖schema.xml的defaultOperator(有空格时用"AND"还是用"OR"操作逻辑),一般默认指定  
df - 默认的查询字段,一般默认指定  
qt - (query type)指定那个类型来处理查询请求,一般不用指定,默认是standard。  
其它  
indent - 返回的结果是否缩进,默认关闭,用 indent=true|on 开启,一般调试json,php,phps,ruby输出才有必要用这个参数。  
version - 查询语法的版本,建议不使用它,由服务器指定默认值。 



[Solr的检索运算符]
 “:” 指定字段查指定值,如返回所有值*:*²
 “?”²表示单个任意字符的通配
 “*” 表示多个任意字符的通配(不能在检索的项开始使用*或者?符号)²
 “~”²表示模糊检索,如检索拼写类似于”roam”的项这样写:roam~将找到形如foam和roams的单词;roam~0.8,检索返回相似度在0.8以上的记录。
²邻近检索,如检索相隔10个单词的”apache”和”jakarta”,”jakarta apache”~10
 “^”²控制相关度检索,如检索jakarta apache,同时希望去让”jakarta”的相关度更加好,那么在其后加上”^”符号和增量值,即jakarta^4 apache
 布尔操作符AND、||²
 布尔操作符OR、²&&
 布尔操作符NOT、!、-²(排除操作符不能单独与项使用构成查询)
 “+” 存在操作符,要求符号”+”后的项必须在文档相应的域中存在²
 ( ) 用于构成子查询²
² [] 包含范围检索,如检索某时间段记录,包含头尾,date:[200707 TO 200710]
 {}²不包含范围检索,如检索某时间段记录,不包含头尾
date:{200707 TO 200710}
 " 转义操作符,特殊字符包括+ -² && || ! ( ) { } [ ] ^ ” ~ * ? : "






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值