搭建企业级搜索服务Solr

·什么是Solr?

Solr是基于lucene搭建的java搜索引擎服务端,是一个搜索中心式的程序。

·Solr的组成:

Solr由一个服务端程序,若干个搜索模块core,和一套java客户端组件Solrj组成。core运行在服务端之上,可以把一个core理解成一个网站的搜索服务提供者,虽然一个core里面可以配置多个网站,但并不建议这么做。所有的core都存放在一个目录下,这个目录叫做solrHome,这是Solr安装中必须配置的一个文件夹目录。

·Solr的特性:

Solr支持lucene的所有功能,而且通过http和java接口的方式完整的包装了这些功能。Solr添加了DataImport数据导入,UI管理界面,在线core管理,搜索集群等企业级特性。Solr支持非常多的索引数据源,有数据库、数据文件(如CSV)、甚至还有HTTP、RSS、EMAIL这样的数据源。这使得Solr无论是应对新开发的系统还是为旧系统添加全文检索都变得十分简单。

·Solr服务端的安装:

Solr自大于4.7.2的版本之后要求必须使用jdk1.7以上和相应的servlet容器。我们这里使用的是4.7.2版本。Solr的官方包的dist目录下有一个war文件,解压它到任意Servlet容器,为工程添加example\lib\ext下的所有包,这是日志所必须的,将example/resources下的 log4j.properties 文件复制到WEB-INF/classes目录中作为日志配置文件。

Solr在其安装包example目录下提供了若干solrHome的文件夹,每个solrHome文件夹都包含了一些可以装载的core,我们可以找一个简单的solr文件夹并将其设置为solrHome。solrHome的设置方法有设置JNDI环境变量、虚拟机环境变量两种方法。JNDI变量可以设置在Context配置段中,也可以设置在web.xml中。都必须设置绝对路径。在我的工程结构中solrHome目录就在我的工程目录下,因此我采用自定义Filter设置虚拟机环境变量System.setProperty("solr.solr.home","...")的方式来设置solrHome。

启动容器,访问这个web工程可以看到Solr的UI管理界面。UI左边是菜单,Core Admin可以动态卸载和安装一些core。菜单下面是目前已安装的core列表。选择相应的core,可以看到有分词测试(Analysis)、数据源索引(DataImport)、查询测试(Query)

·数据库core安装:

example目录下有个example-DIH目录,把它设置成solrHome。这个目录包含数据库数据源的core,名字是db,这个core支持以配置sql的方式扫描数据库、建立索引。使用这个core需要我们把dist目录下包含dataimport字眼的两个jar包放到工程目录下。

db core包含两个主要的配置文件:db-data-config.xml数据库配置、schema.xml索引字段配置。

db-data-config.xml是配置数据库数据源和扫描SQL的地方,它负责连接数据库,执行SQL并且把数据列映射到索引文件的字段上。注意在配置field时列名是大小写敏感的。如果使用oracle数据库,因为oracle默认使用大写列名,就必须把column写成大写的。某些时候,我们的数据里面会包含CLOB字段和一些富文本字段,Solr提供一些transformers转换器,可以在保存索引前把这些字段进行预处理。比如可以把CLOB转换成String的ClobTransformer,可以剪除所有HTML标记的HTMLStripTransformer。我们也可以用java或脚本语言定义自己的transformers。

schema.xml配置了索引文件里面的字段类型types,和业务所需的字段fields。我们可以配置自定义的字段类型,比如在用到第三方分词包时,我们可以自定义一个field然后指定它们的分词器,停止词过滤器等。业务字段field可以配置其是否为索引字段index或存储字段store,对于某些只需要存储但不需要查询的字段时有用。field可以指定为multiValued类型的,这时一个field可以以数组的形式存储多个数据库字段的值,配合copyField元素,可以方便地应对多个字段的查询需求。比如a
like ... OR b like ...这样的查询需求就可以把ab合为一个字段c,然后以 c like ...的形式进行查询。

数据库的core安装完后,在Solr的主界面上可以找到DataImport菜单,在那里可以执行清理、新增、删除、优化索引的操作。

·分词包安装:

提到lucene就不得不提到它强大的扩展分词包。笔者开始主要在庖丁解牛、mmseg4j和IKAnalyzer几款间选择。庖丁解牛由于太长时间没有更新已经不能适用新版的lucene。mmseg4j自带搜狗词库,网上对它的反响不错,不过mmseg1.9.1在solr4.7.2下运行时有bug让我不得不修改它的源代码。而且mmseg不支持停止词,按网上的说法配置field type的filter元素,在测试Query时完全看不出任何效果,不知道mmseg作者为什么要取消停止词的功能,毕竟大众在使用搜索引擎时并没有那么专业,他们会添加大量对搜索引擎无意义的词进去,比如“为什么.....”,“怎么样.....”,从而干扰搜索引擎。因此笔者最终采用IKAnalyzer(以下简称IK)。

IK的更新比较迅速,可以完美支持笔者的solr版本。IK的安装很简单,只要复制IKAnalyzer.cfg.xml,stopword.dic以及一个jar包到classpath下即可。接下来在scheme里面配置IK的一个字段类型,将field的类型指向它,就可以在Query测试中看到搜索结果了。IK支持自定义停止词库和扩展词库。如果是某些专业性的网站,比如教育网站、农业网站、学科网站,建议配置相应的扩展词库,可大大提升分词的准确性。

·客户端Solrj的安装:

Solr提供了一个java的客户端包Solrj供客户端程序使用,复制dist\solrj-lib下的所有包到客户端工程下即可。客户端有SolrSever、SolrQuery、QueryResponse、SolrDocumentList几个核心的类。

SolrSever是服务端,其query(SolrQuery query)方法接受一个查询请求,并返回QueryResponse,QueryResponse中包含了搜索用时getElapsedTime,和结果集getResults。getResults返回SolrDocumentList,这里面以键值对形式包含所有查询结果,以及总条数getNumFound。SolrDocumentList实现了List接口,这一点可以方便我们进行API隔离封装。

SolrQuery 是构造查询条件的类,Solr有一套自己的查询语法:主要包括“字段名:值”这样的字段描述;连接和补充字段的逻辑符号如OR、AND、~(模糊)、^(权重);查询结果排序、分页、过滤(在结果中查询)、分组等功能。将这些组成一个queryString查询字符串传给SolrQuery就可以进行查询。当然也可以把这些条件使用单独的API方法进行设置(类似Hibernate的Criteria API查询)。

由于Solr服务端的QueryParser没有对查询的关键词进行分词,所以我们会发现Solr的关键词查询都是“精确查询”的,这显然不符合需求。所以我们有必要在客户端调用solr的分词接口进行分词后再进行查询。Solrj的java接口里面没有分词接口,我们可以调用SolrServer的getClient方法来获得一个HttpClient对象,然后调用对应http接口进行分词。在url里面加上wt=json,可以指定http接口返回数据格式为json。

·补充:

Solr不同版本间的API和配置方法略有不同,本文所使用的Solr版本是4.7.2,环境是Tomcat6.0,JDK1.6

时间: 2024-10-17 17:11:46

搭建企业级搜索服务Solr的相关文章

搜索服务solr 一二事(1) - solr-5.5 使用自带Jetty或者tomcat 搭建单机版搜索服务器

solr,什么是solr,就是你要吃的东西“馊了”,不能吃了,out of date~ 嘛...开个玩笑,发音就是‘搜了’,专门用于搜索的一个开源框架,lunce就不说了,不好用,麻烦 来讲讲solr吧 目前最新更新的是6.0,4月7-8号更新的,哥不太喜欢用新出来的版本,多多少少会有bug,centos7出来后我至今使用的是6.5(实在无法忍受7啊...西吧) 6.0我也试着装了,但是会报错,日志文件找不到,自己新建一个也不行,去官方的jira看看,发现的确有这么一个bug,但是已经close

企业级搜索应用服务器solr介绍

简介 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果: 特点 Solr是一个独立的企业搜索服务器REST-like API. 你把文件(称为"索引") 通过XML.JSON.CSV通过HTTP或二进制. 你查询它通过HTTP GET和接收XML.JSON.CSV或二进制的结果. 高级全文搜索功

从零搭建ES搜索服务(一)基本概念及环境搭建

前言 本系列文章最终目标是为了快速搭建一个简易可用的搜索服务.方案并不一定是最优,但实现难度较低. 背景 近期公司在重构老系统,需求是要求知识库支持全文检索. 我们知道普通的数据库like方式效果及性能都不好,所以另寻出路,确定通过 Elasticsearch (下文简称「 ES 」)搜索引擎实现. 技术选型 因公司之前购买了阿里云的ES服务且版本为 5.5.3 ,下文选用的技术框架均基于此版本. ① Elasticsearch 5.5.3 一个基于Lucene的搜索服务器,提供了分布式的全文搜

搜索服务Solr集群搭建 使用ZooKeeper作为代理层

上篇文章搭建了zookeeper集群 那好,今天就可以搭建solr搜服服务的集群了,这个和redis 集群不同,是需要zk管理的,作为一个代理层 安装四个tomcat,修改其端口号不能冲突.8080~8083 如果是正式环境下,则分别使用4台linux作为节点 修改server.xml文件修改端口号,总共3个 以上步骤,在tomcat03,tomcat04上重复执行,但是3个端口一定要注意不能重复 向tomcat下部署solr 把单机版的solr工程复制到tomcat下即可 solr在别的机子上

第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第八天】(solr服务器搭建、搜索功能实现)

https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结[第五天] 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结[第六天] 第04项目:淘淘商城(SpringMVC+Spring+Mybatis)[第七天](redis缓存) 第04

利用SOLR搭建企业搜索平台 之——MultiCore

Solr Multicore 是 solr 1.3 的新特性.其目是一个solr实例,可以有多个搜索应用. 下面着手来将solr给出的一个example跑出来.这篇文章是基于<利用SOLR搭建企业搜索平台 之——运行solr>,有不明白的请参见http://lianj-lee.javaeye.com/blog/424383 1. 找到solr下载包中的example文件夹,在它的下面有个multicore文件夹,将这个文件夹下面的所有东西copy到 c:/solr-tomcat/solr下面.

全文搜索技术——Solr

1.   学习计划 1. Solr的安装及配置 a)    Solr整合tomcat b)    Solr后台管理功能介绍 c)    配置中文分析器 2. 使用Solr的后台管理索引库 a)    添加文档 b)     删除文档 c)    修改文档 d)    查询文档 3. 使用SolrJ管理索引库 a)    添加文档 b)    修改文档 c)    删除文档 d)    查询文档 4. 电商搜索案例实现 a)    案例分析 b)    案例实现 2.   需求分析 使用Solr实

开放搜索服务OpenSearch

开放搜索服务系统架构:从系统.平台到开放服务 搜索是各类网站和数据类APP的标配功能.目前开发者一般基于开源搜索系统,例如ElasticSearch.Solr.Sphinx等自己搭建搜索服务,系统定制.开发和维护成本都非常高.云搜索是一种结构化数据搜索托管服务,开发者将数据上传至云端,云端进行数据处理和索引构建,开发者再通过API使用云端搜索服务.云搜索极大降低了搜索服务使用门槛,也极大降低开发运维成本.开放搜索服务OpenSearch是阿里巴巴研发的一款云搜索服务,允许开发者对索引结构.数据处

搜索技术---solr

solr 企业站内搜索技术选型 在一些大型门户网站.电子商务网站等都需要站内搜索功能,使用传统的数据库查询方式实现搜索无法满足一些高级的搜索需求,比如:搜索速度要快.搜索结果按相关度排序.搜索内容格式不固定等,这里就需要使用全文检索技术实现搜索功能. 单独使用Lucene实现 单独使用Lucene实现站内搜索需要开发的工作量较大,主要表现在:索引维护.索引性能优化.搜索性能优化等,因此不建议采用. 使用Google或Baidu接口  通过第三方搜索引擎提供的接口实现站内搜索,这样和第三方引擎系统