Apache Solr 学习
Solr 简介
- Apache Solr 是一个开源的、基于 Java 的信息检索库。 Solr旨在推动涉及非结构化数据,半结构化数据或非结构化和结构化数据混合的强大文档检索或分析应用程序。
- 它对有限的关系,图形,统计,数据分析或存储相关用例提供辅助支持。
- Solr 的查询语法和解析器支持从最简单的关键字搜索, 到对多个字段和分面搜索结果的复杂查询的所有功能。
Solr与数据库的比较
- Solr本身也可以看成数据库,(no sql类型),但它比数据库搜索速度更快,所以在项目中我们一般把搜搜的部分交给solr,就像我们在京东首页所看到的商品信息,并不是来自数据库,而是来源于sorl的索引库。
- 数据库本身不能实现分词效果,而只能使用模糊查询,但是模糊查询非常低效,查询速度比较慢,由于在实际生活中,一般搜索是用的比较多的,这样数据库压力自然就很大,所以我们就让供专业的solr来做搜索功能。
Solr的工作原理
Solr 是基于Lucence开发的企业级搜索引擎技术,而lucence
的原理是倒排索引(反向索引)。
-
倒排索引
也叫反向索引,简单说就是通过给定的关键字,找到包含关键字的文章的索引。注:同理正向索引就是先找到文章,在从文章里找到对应的关键字。可参考:https://blog.csdn.net/u013008898/article/details/116493167
-
全文检索
对内容进行分词,对分词的结果创建索引,然后通过对索引进行搜索的方式就叫全文检索。类似于,通过偏旁部首查询字典,在文档很多的情况下全文检索速度优于顺序检索。
-
顺序检索
按顺序对文档挨个查找,找到包含给定关键字的就记录下来。
例如:“需要在字典中查询钟
字”,
1) 顺序检索 :从字典第一页开始一页一页的检索,直到找到这个字。
2) 全文检索:根据拼音zhong
或偏旁钅
找到所在页码,然后在查询这个字。
Solr 索引创建过程
假设有两篇文章1和2:
文章1的内容为:老超在卡子门工作,我也是。
文章2的内容为:小超在鼓楼工作。
由于lucence
是基于关键词索引查询的,那我们首先要取得这两篇文章的关键词。如果我们把文章看成一个字符串,我们需要取得字符串中的所有单词,即分词。分词时,忽略”在“、”的“之类的没有意义的介词,以及标点符号可以过滤。
我们使用Ik Analyzer
实现中文分词,分词之后结果为:
文章1:
文章2:
接下来,有了关键词后,我们就可以建立倒排索引了。上面的对应关系是:“文章号”对“文章中所有关键词”。倒排索引把这个关系倒过来,变成: “关键词”对“拥有该关键词的所有文章号”。
文章1、文章2 经过倒排后变成:
通常仅知道关键词在哪些文章中出现还不够,我们还需要知道关键词在文章中出现次数和出现的位置,通常有两种位置:
a.字符位置,即记录该词是文章中第几个字符(优点是关键词亮显时定位快);
b.关键词位置,即记录该词是文章中第几个关键词(优点是节约索引空间、词组(phase)查询快),lucene
中记录的就是这种位置。
加上出现频率和出现位置信息后,我们的索引结构变为:
实现时,lucene
将上面三列分别作为词典文件(Term Dictionary)、频率文件(frequencies)、位置文件 (positions)保存。其中词典文件不仅保存有每个关键词,还保留了指向频率文件和位置文件的指针,通过指针可以找到该关键字的频率信息和位置信息。
注:此部分内容为转载,原文请参考下面链接
————————————————
版权声明:本文为CSDN博主「赵晗老师」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qfzhaohan/article/details/121290152
Solr 索引搜索过程
- 将输入的搜索条件进行分词处理。
- 对分词处理结果创建索引。
- 根据索引查询文档id。
- 根据查询到的文档id查询具体文档列表。
- 根据文档出现的频次计算权重,将文档列表按照权重排序后返回。
Solr 中数据存储说明
-
Solr 为了给内容建立索引,所以 Solr 就必须具备数据存储能力。所有需要被搜索的内容都需要存储在 Solr 中,在开发中需要把数据库中数据添加到 Solr 中进行初始化,每次修改数据库中数据还需要同步 Solr 中的数据。
-
Solr 中数据存储是存储在 Document 对象中,对象中可以包含的属性和属性类型都定义在 schema.xml 中。如果需要自定义属性或自定义属性类型都需要修改 schema.xml 配置文件。从 Solr5 开始 schema.xml 更改名称为 managed-schema(没有扩展名)。