Solr全文检索服务
一、企业站内搜索技术选型
?在一些大型门户网站、电子商务网站等都需要站内搜索功能,使用传统的数据库查
询方式实现搜索无法满足一些高级的搜索需求,比如:搜索速度要快、搜索结果按
相关度排序、搜索内容格式不固定等,这里就需要使用全文检索技术实现搜索功能。
1.使用Lucene实现?什么是Lucene ?
?Lucene是一个基于Java的全文信息检索工具包,它不是一个完整
的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene
目前是Apache Jakarta(雅加达) 家族中的一个开源项目。也是目前
最为流行的基于Java开源全文检索工具包。目前已经有很多应用程
序的搜索功能是基于Lucene ,比如Eclipse 帮助系统的搜索功能。
Lucene能够为文本类型的数据建立索引,所以你只要把你要索引的
数据格式转化的文本格式,Lucene 就能对你的文档进行索引和搜索
●单独使用Lucene实现站内搜索需要开发的工作量较大,主要表现在:索
引维护、索引性能优化、搜索性能优化等,因此不建议采用。
2.使用Google或Baidu接口?
●通过第三方搜索引擎提供的接口实现站内搜索,这样和第三方引擎系统依
赖紧密,不方便扩展,不建议采用。
3.使用Solr实现? Solr是什么?
?Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于
Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语
言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。
?Solr可以独立运行,运行在Jetty、Tomcat等这些Servlet容器中,
Solr 索引的实现方法很简单,用 POST 方法向 Solr 服务器发送一
个描述 Field 及其内容的 XML 文档,Solr根据xml文档添加、删
除、更新索引。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr
返回Xml、json等格式的查询结果进行解析,组织页面布局。Solr
不提供构建UI的功能,Solr提供了一个管理界面,通过管理界面可
以查询Solr的配置和运行情况。
●基于Solr实现站内搜索扩展性较好并且可以减少程序员的工作量,因为
Solr提供了较为完备的搜索引擎解决方案,因此在门户、论坛等系统中
常用此方案。
●Solr的特点:
1.基于标准的开放接口:Solr搜索服务器支持通过XML、JSON和HTTP查
询和获取结果。
2.易管理:Solr可以通过HTML页面管理,Solr配置通过XML完成。
3.可伸缩性:能够有效地复制到另外一个Solr搜索服务器。
4.灵活的插件体系:新功能能够以插件的形式方便的添加到Solr服务器
上。
5.强大的数据导入功能:数据库和其他结构化数据源现在都可以导入、映
射和转化。
?Solr 与Lucene的架构图
?Solr与 Lucene的区别
1. Solr与Lucene 并不是竞争对立关系,恰恰相反Solr 依存于Lucene,因为Solr
底层的核心技术是使用Lucene 来实现的。
2. Solr和Lucene的本质区别有以下三点:搜索服务器,企业级和管理。Lucene本
质上是搜索库,不是独立的应用程序,而Solr是。Lucene专注于搜索底层的建设,
而Solr专注于企业应用。Lucene不负责支撑搜索服务所必须的管理,而Solr负责。
所以说,一句话概括Solr是Lucene面向企业搜索应用的扩展。
二、Solr的安装配置
下载solr的解压包并解压
https://www.sodocs.net/doc/311236840.html,/solr/
此教程使用的是solr5.0
bin:solr的运行脚本
contrib:solr的软件/插件,用于增强solr的功能。
dist:该目录包含build过程中产生的war和jar文件,以及相关的依赖文件。
docs:solr的API文档
example:solr工程的例子目录:
example/solr:该目录是一个包含了默认配置信息的Solr的Core目录。
example/multicore:该目录包含了在Solr的multicore中设置的多个
Core目录。
licenses:solr相关的一些许可信息
server:solr的服务配置信息以及solr的实例项目。
?运行环境
1.solr 需要运行在一个Servlet容器中,Solr5.0要求jdk使用1.7以上,Solr
默认提供Jetty(java写的Servlet容器),本教程使用Tocmat作为Servlet
容器,环境如下
●Solr : solr5.0
●Jdk :jdk1.7.0_72
●Tomcat:apache-tomcat-7.0.53
?Solr与tomcat整合
加载solr在启动时依赖jar(jar包就在contrib与dist文件夹中)
1.SolrHome是Solr运行的主目录,目录中包括了运行Solr实例所有的配置文
件和数据文件,Solr实例就是SolrCore,一个SolrHome可以包括多个SolrCore (Solr实例),每个SolrCore提供单独的搜索和索引服务。
说明:
Cmfz_solr:叫做一个Solr运行实例SolrCore,SolrCore名称不固定,一个solr 运行实例对外单独提供索引和搜索接口。
solrHome中可以创建多个solr运行实例SolrCore。一个solr的运行实例对应一个索引目录。conf是SolrCore的配置文件目录。data目录存放索引文件需要创建。
◆手动创建solr实例(cmfz_solr)
◆Solrconfig.xml,在cmfz_solr的conf目录下,它是SolrCore运行的配置文件
solr工程部署
1. 拷贝jar包
2. 拷贝日志配置文件
3. 修改tomcat webapps下的webapp\solr\WEB-INF\web.xml文件
a) 配置solrhome
启动tomcat,访问http:localhost:9999/solr 进入solr管理页面
Solr core 介绍
1.Analysis(重点)
2.Dataimport
a)可以定义数据导入处理器,从关系数据库将数据导入到Solr索引库中。
3.Document(重点)
a)通过此菜单可以创建索引、更新索引、删除索引等操作,界面如下:
/update表示更新索引,solr默认根据id(唯一约束)域来更新Document的内容,如果根据id值搜索不到id域则会执行添加操作,如果找到则更新。
/delete 表示删除索引
4.Query(重点)
通过/select执行搜索索引,必须指定“q”查询条件方可搜索。
三、Solr的索引
?Scheam.xml
1.schema.xml,在SolrCore的conf目录下,它是Solr数据表配置文件,它定义
了加入索引的数据的数据类型的。主要包括FieldTypes、Fields和其他的一
些缺省设置。
?FieldType域类型定义
1.下边“text_general”是Solr默认提供的FieldType,通过它说明FieldType
定义的内容:
FieldType子结点包括:name,class,positionIncrementGap等一些参数:Name: 是FieldType的名字
Class:是Solr提供的包solr.TextField,solr.TextField 允许用户通过分析器来定制索引和查询,分析器包括一个分词器(tokenizer)和多个过滤器
(filter)
positionIncrementGap:可选属性,定义在同一个文档中此类型数据的空白间隔,避免短语匹配错误,此值相当于Lucene的短语查询设置slop值,根据经验设
置为100。
在FieldType定义的时候最重要的就是定义这个类型的数据在建立索引和进行查
询的时候要使用的分析器analyzer,包括分词和过滤
搜索分析器中:使用solr.StandardTokenizerFactory标准分词器,
solr.StopFilterFactory停用词过滤器,这里还用到了
solr.SynonymFilterFactory同义词过滤器。
2.Field定义
在fields结点内定义具体的Field,filed定义包括name,type(为之前定义过的各种FieldType),indexed(是否被索引),stored(是否被储
存),multiValued(是否存储多个值)等属性。
如下:
multiValued:
该Field如果要存储多个值时设置为true,solr允许一个Field存储多个值,比如存储一个用户的好友id(多个),商品的图片(多个,大图和小图),通过使用solr查询要看出返回给客户端是数组。
a)uniqueKey:
Solr中默认定义唯一主键key为id域,如下:Solr在删除、更新索引时使用id域进行判断,也可以自定义唯一主键。注意在创建索引时必须指定唯一约束。
b)copyField复制域:
copyField复制域,可以将多个Field复制到一个Field中,以便进行统一的检索:比如,输入关键字搜索title标题内容content,定义title、content、text 的域:
根据关键字只搜索text域的内容就相当于搜索title和content,将title和content复制到text中,如下:(注意:该field的mutiValued 必须为true)
c)dynamicField(动态字段)
动态字段就是不用指定具体的名称,只要定义字段名称的规则,例如定义一个dynamicField,name 为*_i,定义它的type为text,那么在使用这个字段
的时候,任何以_i结尾的字段都被认为是符合这个定义的,例如:name_i,gender_i,school_i等。
···
?创建索引
1.通过solr的管理页面操作
?搜索索引
1.通过solr的管理页面操作
索引维护
使用/update进行索引维护,进入Solr管理界面SolrCore下的Document下:
?删除索引
四、Analyzer 中文分词器?安装中文分词器
1.下载ik相关jar
solr-analyzer-extra-5.1.0.jar
注意:ext.dic和stopword.dic必须保存成无BOM的utf-8类型。
2.修改schema.xml文件配置
3.测试
如果不使用solr默认的分词,可以自定义一套符合业务的field,指定自定义的
FieldType
五、dataimport-handler(数据引入)
?导入相关jar
?加入相关配置
1.手动创建data-config.xml
参数说明:
DataSource:数据源
必须有一个id域,这里使用Solr默认的id域,域值是从关系数据库查询的id列值。
Field中的column对应表中的列,相对来说name对应着schema.xml中的field 配置完成之后重启tomcat
测试:
六、Solr的搜索
?requestHandler
1.Solr的所有操作都是基于HTTP接口,以下是对接口请求的相关配置
t> ?查询语法 通过/select搜索索引,Solr制定一些参数完成不同需求的搜索 1.q –查询字符串,必须填写,如果查询所有*:* 例如id:1 2.fq - (filter query)过虑查询,作用:在q查询符合结果中同时是fq查询 符合的,例如: 也可以在q 查询条件中使用例如 也可以使用“*”表示无限, 例如: 20以上:age:[20 TO *] 20以下:age:[* TO 20] 3.sort 排序