)我们在进行网购的时候会在搜索框输入要购买的物品比如这样:
在输入到你的关键字进行搜索的时候它会将相关匹配的信息进行返回,并且对关键子进行高亮处理,就像这样:
其实这个关键子检索在原来看来是一个模糊查询,进行对数据库模糊查询来达到搜索的效果,但实际上不是的,因为对数据库的模糊查询会对数据库进行全文检索,所以对于数据量大的业务,比如网购,那么多数据进行一次查询是多么恐怖的事情,而且也占用大量资源与时间,可能结果出来了,你也失去兴趣不想买了,这个问题呢我们可以通过solr技术来解决,来对solr索引进行检索,返回数据,达到我们想要的效果。那么什么是solr呢?
认识solr之前,认识几个名词概念,
1.什么叫做全文检索:
什么叫做全文检索呢?这要从我们生活中的数据说起。 我们生活中的数据总体分为两种:结构化数据和非结构化数据。
1)结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。 2)非结构化数据:指不定长或无固定格式的数据,如邮件,word 文档等。
非结构化数据又一种叫法叫全文数据。 按照数据的分类,搜索也分为两种:
1) 对结构化数据的搜索:如对数据库的搜索,用 SQL 语句。 2) 对非结构化数据的搜索:如利用 windows 的搜索也可以搜索文件内容,Linux 下的 grep 命令,再如用 Google 和百度可以搜索大量内容数据。
2那么什么是solr:
Solr 是基于 Lucene 的面向企业搜索的 web 应用 ;Solr 是一个独立的企业级搜索应用服务器,它对外提供类似于 Web-service 的 API 接口。用户可以通过 http 请求,向搜索引擎服务器提交一定格式的 XML 文件,生成索引;也可以通过 Http Get 操作提出查找请求,并得到 xml/json 格式的返回结果。Solr 是一个高性能,采用 Java5 开发,基于 Lucene 的全文搜索服务器。同时对其进行了扩展,提供了比 Lucene 更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文检索引擎。文档通过 Http 利用 XML 加到一个搜索集合中。查询该集合也是通过 http 收到一个XML/JSON 响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提供一套强大 Data Schema 来定义字段,类型和设置文本分析,提供基于 Web 的管理界面等。
solr的控制页面如上,这里有一个问题:solr是由国外人开发的,它本身没有中文的分词的解析器,所以要使用solr对中文进行解析,需要配置中文分词器(IK Analyzer)
1.首先在你的solr服务器上面上传中文分词器 jar 包,以及配置文件 。2.将中文分词器的配置文件以及 jar 包拷贝到 Solr 所对应的目录下 将配置文件需要放到classes目录下。 在solr中的WEB-INF下时没有classes目录的。我们需要先创建一个
Jar包放到WEB-INF/lib目录下。
3.接着是对schema.xml中配置中文分词器
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
这样就可以加上中文解析器。
schema.xml 是用来定义索引数据中的域的,包括域名称,域类型,域是否索引,是否分词,是否存储等等。 它里的标签及概念如下:
(1)索引库中的 Field :<field>:定义域
- <field name="_version_" type="long" indexed="true" stored="true"/>
- name:表示域的名称,是强制必须有的属性
- type:域类型的名称,与fieldType元素的name属性值对应,是强制必须有的属性 indexed:是否参与检索。true即表示需要对该域进行索引。默认值为false stored:是否将field域中的内容存储到文档域,简单通俗的来说,就是你这一个 field需不需要被当作查询结果返回。
- required:表示这个域是否是必须要在document中存在,默认值为false,如果此配置项设为true,则你的document中必须要添加此域,否则你创建索引时会抛异常。
(2)索引库中的 FieldType
- <fieldType>:定义域的类型
- <fieldType name="string" class="solr.StrField" sortMissingLast="true" />
- Name:域类型的名称,作为域类型标识符存在,在定义域(Field)时使用的类型(FieldType)属性就是域类型的名称。
- Class:域类型的数据类型,该属性指向的是solr中的已定义的类型,或者是用户定义的类型,域类型中的数据会被初始化成class执行类类的对象。 sortMissingFirst/sortMissingLast:控制当排序域的值不存在时该文档(Document)所在队列的位置。true是则在队头/队尾
(3)索引库中的 CopyField
- <copyField>:复制域。可实现更新与查询分离
- <copyField source="item_title" dest="item_keywords"/>
- Source:源域 Dest:目标域
solr中的索引机制:
(1)正排索引(正向索引)
- 正排索引是以文档的 ID 为关键字,索引文档中每个字的位置信息,查找时扫描索引中每个文档中字的信息直到找出所有包含查询关键字的文档。
- 但是在查询的时候需对所有的文档进行扫描以确保没有遗漏,这样就使得检索时间大大延长,检索效率低下。
- 尽管正排索引的工作原理非常的简单,但是由于其检索效率太低,除非在特定情况下,否则实用性价值不大。
正排索引从文档编号找词
(2)倒排索引(反向索引)
- 对数据进行分析,抽取出数据中的词条,以词条作为 key,对应数据的存储位置作为 value,实现索引的存储。这种索引称为倒排索引。
- 当 solr 存储文档时,solr 会首先对文档数据进行分词,创建索引库和文档数据库。所谓的分词是指:将一段字符文本按照一定的规则分成若干个单词。倒排索引是从词找文档编号
solr的管理页面的内容:
Dashboard(仪表盘) :
访问 http://localhost:8080/solr 时,出现该主页面,可查看到 solr 运行时间、solr 版本,系统内存、虚拟机内存的使用情况
Logging(日志) :显示solr运行出现的异常或错误
Core Admin (core 管理) :主要有Add Core(添加核心), Unload(卸载核心),Rename(重命名核心),Reload(重新加载核心),Optimize(优化索引库) Add Core 是添加 core:主要是在 instanceDir 对应的文件夹里生成一个 core.properties文件
Java Properties:可查看到 java 相关的一些属性的信息
Thread Dump :查看每个线程的详细信息,以及状态信息
Core Selecter(core 选择器) :
overview(概览):包含基本统计如当前文档数;和实例信息如当前核心的配置目录