设为首页 收藏本站
查看: 1231|回复: 0

[经验分享] Apache Solr采用Java开发、基于Lucene的全文搜索服务器

[复制链接]

尚未签到

发表于 2015-7-18 11:02:38 | 显示全部楼层 |阅读模式
  http://docs.spring.io/spring-data/solr/
  
  首先介绍一下solr:
  Apache Solr (读音: SOLer) 是一个开源、高性能、采用Java开发、基于Lucene的全文搜索服务器,文档通过Http利用XML加到一个搜索集合中,查询该集合也是通过 http收到一个XML/JSON响应来实现。Solr 中存储的资源是以 Document 为对象进行存储的。每个文档由一系列的 Field 构成,每个 Field 表示资源的一个属性。Solr 中的每个 Document 需要有能唯一标识其自身的属性,默认情况下这个属性的名字是 id,在 Schema 配置文件(schema.xml)中使用:id进行描述。solr有两个核心文件,solrconfig.xml和schema.xml。solrconfig.xml是solr的基础文件,里面配置了各种web请求处理器、请求响应处理器、日志、缓存等;schema.xml配置映射了各种数据类型的索引方案,分词器的配置、索引文档中包含的字段也在此配置。
  工作中主要用来分词和搜索,简单的工作原理是:利用分词器对数据源进行分词处理,然后根据分词结果建立索引库;查询的时候,利用分词器对查询语句进行分词,根据查询语句分词的结果在索引库中进行匹配,最后返回结果。
  
  废话少说,下面开始solr之旅吧:
  一.安装JDK和Tomcat

(1):安装jdk  下载jdk安装包,解压到jdk-1.x目录  (2):安装tomcat,下载tomcat安装包,解压到apache-tomcat目录下
  修改tomcat安装目录下的conf目录的server.xml
  找到,加入URIEncoding="UTF-8",为了支持中文。
  设置Java和tomcat环境变量
  
  上面两步比较简单,这里就只简单描述一下,不明白的可以网上查资料。
  
  二. 安装solr
  下载solr包,http://labs.renren.com/apache-mirror/lucene/solr/3.5.0/apache-solr-3.5.0.zip
  
  解压缩到apache-solr目录,把apache-solr/dist目录下的apache-solr-3.5.0.war 复制到$TOMCAT_HOME/webapps目录下,重命名为solr.war
  复制apache-solr/example/solr到tomcat根目录下(如果你想配置多core(实例),就复制apache-solr/example/multicore到tomcat根目录下,不用复制solr了),作为solr/home,以后也可以往该目录添加 core,每个core下面都可以有自己的配置文件。
  在apache-tomcat/conf/Catalina/localhost/下创建solr.xml(跟webapps下的solr项目同名),指定solr.war和solr/home的位置,让tomcat启动时就自动加载该应用。
  solr.xml内容如下:
  
  
  
  
  然后在tomcat的bin目录下执行./startup.sh,启动tomcat
  在地址栏访问http://localhost:8080/solr/
  将会出现solr欢迎界面和admin入口
  
  注:如果出现org.apache.solr.common.SolrException: Error loading class 'solr.VelocityResponseWriter' 异常,最简单的解决方法:找到$TOMCAT_HOME/solr/conf/solrconfig.xml,把注释掉或者enable:false即可。如果一切顺利的话,现在可以看到solr的web管理界面了。不过要想实现分词的功能,得安装一个中文分词器,这里推荐IKAnalyzer或mmseg4j。
  IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包,采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力,采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。优化的词典存储,更小的内存占用。支持用户词典扩展定。
  mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法(http://technology.chtsai.org/mmseg/ )实现的中文分词器,并实现 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。MMSeg 算法有两种分词方法:Simple和Complex,都是基于正向最大匹配。Complex 加了四个规则过虑。官方说:词语的正确识别率达到了 98.41%。mmseg4j 已经实现了这两种分词算法。
  三. 配置中文分词器
  下面分别安装这两个中文分词器,当然选择安装其中一个也是可以的。
  (1)安装IKAnalyzer
  下载地址: http://code.google.com/p/ik-analyzer/downloads/list
  在当前目录下新建IKAnalyzer目录,解压到该目录下:unzip IKAnalyzer2012_u5.zip -d ./IKAnalyzer
  把IKAnalyzer目录下的IKAnalyzer2012.jar文件拷贝到 $TOMCAT_HOME/webapps/solr/WEB-INF/lib/下
  配置schema.xml,编辑$TOMCAT_HOME/solr/conf/schema.xml,在文件中添加下面这个fieldtype
  注:下面的代码中多了很多“”标签,这个是设置字体时iteye编辑器自己生成的。



Xml代码   DSC0000.png

  •   
  •          
  •                
  •                
  •                               
  •                
  •                     
  •                
  •          
  •          
  •                
  •                
  •                
  •                
  •                
  •                
  •                
  •          
  •       
  
  添加一个索引字段field,并应用上面配置的fieldtype



Java代码  

  •    
  
  然后找到这一句:text把它改成game_name
  在浏览器打开http://localhost:8080/solr/admin/analysis.jsp,就可以进行分词处理了。
  IKAnalyzer添加自定义分词词典:词典文件格式为无BOM的UTF-8编码的文本文件,文件扩展名不限,一次可以添加多个词库,每个词库以";"分开。把IKAnalyzer目录下的IKAnalyzer.cfg.xml和stopword.dic拷贝到$TOMCAT_HOME/webapps/solr/WEB_INF/classes目录下,可以自己新建一个mydic.dic文件,然后在IKAnalyzer.cfg.xml里进行配置。
  (2)安装mmseg4j
   下载地址:http://code.google.com/p/mmseg4j/downloads/list
  在当前目录下新建mmseg4j目录,解压到该目录下:unzip mmseg4j-1.8.5.zip -d ./mmseg4j
  把mmseg4j目录下的mmseg4j-all-1.8.5.jar文件拷贝到 $TOMCAT_HOME/webapps/solr/WEB-INF/lib/下
  
  配置schema.xml,编辑$TOMCAT_HOME/solr/conf/schema.xml,在文件中添加下面这个fieldtype



Xml代码  

  •   
  •          
  •               
  •               
  •          
  •       
  •       
  •          
  •               
  •               
  •          
  •       
  •       
  •          
  •               
  •               
  •          
  •       
  
  注意:dicPath的值改成你自己机器上相应的目录。
  然后修改之前添加的filed,让其使用mmseg4j分词器



Xml代码  

  •    
  
  配置mmseg4j分词词典:MMSEG4J的词库是可以动态加载的,词库的编码必须是UTF-8,mmseg4j 默认从当前目录下的 data 目录读取上面的文件,当然也可以指定别的目录,比如我就放在自定义的dict目录下。自定义词库文件名必需是 "words" 为前缀和 ".dic" 为后缀。如:/data/words-my.dic。
  这里直接把mmseg4j/data目录下的所有.dic文件拷贝到$TOMCAT_HOME/solr/dict目录下。共有:4个dic文件,chars.dic、units.dic、 words.dic、 words-my.dic。下面简单解释一下这几个文件的作用。
  1、chars.dic,是单个字,和对应的频率,一行一对,字在全面,频率在后面,中间用空格分开。这个文件的信息是 complex 模式要用到的。在最后一条过虑规则中使用了频率信息。
  2、units.dic,是单位的字,如:分、秒、年。
  3、words.dic,是核心的词库文件,一行一条,不需要其它任何数据(如词长)。
  4、words-my.dic,是自定义词库文件
  在浏览器打开http://localhost:8080/solr/admin/analysis.jsp,就可以看到分词效果了。
  现在,这两种分词方法都已配置好了,想用哪种就把查询的filed的type设置成哪种。
  
  四. 导入文档数据
  现在添加文本搜索的功能,首先导入数据源。
  切换到/home/zhoujh/java/solr/apache-solr/example/exampledocs目录下,该目录下有很多xml文件,随便copy一个,改名位game_data.xml。如:cp hd.xml game_data.xml,修改内容如下:



Xml代码  

  •   
  •   
  •   1  
  •   魔兽世界  
  •   
  •   
  •   2  
  •   仙剑  
  •   
  •   
  •   3  
  •   传奇  
  •   
  •   
  •   4  
  •   极品飞车  
  •   
  •   
  •   5  
  •   轩辕剑  
  •   
  •   
  
  注意:该xml文件必须是UTF-8格式的。
  然后提交到solr,在 /home/zhoujh/java/solr/apache-solr/example/exampledocs目录下执行命令:
  [zhoujh@alexzhou exampledocs]$ java -Durl=http://localhost:8080/solr/update -Dcommit=yes -jar post.jar game_data.xml
  如果输出下面的信息,则导入成功。注:xml文件中要有game_name这个field。如果出错,到$TOMCAT_HOME/logs/下看catalinaxxx.log日志信息
  SimplePostTool: version 1.4
  SimplePostTool: POSTing files to http://localhost:8080/solr/update..
  SimplePostTool: POSTing file game_data.xml
  SimplePostTool: COMMITting Solr index changes..
  检测是否有数据:http://localhost:8080/solr/select/?q=*:*,如果输出信息如下,就成功了。
  




Xml代码  

  •   
  •   
  • 0  
  • 0  
  •   
  • on  
  • 0  
  • *:*  
  • 10  
  • 2.2  
  •   
  •   
  •   
  •   
  • 魔兽世界  
  • 1  
  •   
  •   
  • 仙剑  
  • 2  
  •   
  •   
  • 传奇  
  • 3  
  •   
  •   
  • 极品飞车  
  • 4  
  •   
  •   
  • 轩辕剑  
  • 5  
  •   
  •   
  •   
    不过在现实工作中,一般利用数据库作为数据源,下面我们来配置solr连接数据库源。
  
  五. solr从数据库导入数据
  (1)安装mysql,
  安装完后执行以下命令:启动mysql服务,进入mysql,创建数据库kw_game,创建表game,导入数据



Sql代码  

  • sudo /etc/init.d/mysqld start  
  • mysql -u root -p
  • create database kw_game;  
  • use kw_game;
  • create table game(id int primary key auto_increment,game_name varchar(100),add_time datetime);  
  • insert into game(game_name,add_time) values("魔兽世界",now());  
  • insert into game(game_name,add_time) values("魔兽争霸",now());  
  • insert into game(game_name,add_time) values("传奇世界",now());  
  
  (2)下载 mysql-connector-java-xx-bin.jar(驱动程序)
  把 mysql-connector-java-5.1.20-bin.jar复制到~/java/apache-tomcat7/webapps/solr/WEB-INF/lib/目录下
  cp mysql-connector-java-5.1.20-bin.jar ~/java/apache-tomcat7/webapps/solr/WEB-INF/lib/
  (2)配置solrconfig.xml,添加一个requestHandler



Xml代码  

  •   
  •         
  •           game-data-config.xml  
  •         
  •    
  
  (3)新建一个数据源配置文件game-data-config.xml,内容如下



Java代码  

  •   

  •       

  •       
  •          
  •               
  •               
  •         
  •    

  注: deltaImportQuery、deltaQuery:增量更新时用到,因为在schema.xml中已经有game_name和id字段了,只需在schmema.xml添加add_time字段,格式为date或者string。
  在浏览器输入下面两个地址,导入数据创建索引。
  更新全部: http://localhost:8080/solr/dataimport?command=full-import
  增量更新: http://localhost:8080/solr/dataimport?command=delta-import
  然后检测是否有数据:http://localhost:8080/solr/select/?q=*:*,现在页面上出现的就是你数据库里的数据了。
  注:如果出现了下面异常:
  Error loading class 'org.apache.solr.handler.dataimport.DataImportHandler
  是solrconfig.xml文件中

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-87926-1-1.html 上篇帖子: Solr服务器搭建指南 下篇帖子: 转载:solr MoreLikeThis的原理分析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表