- Solr索引库
-
- Solr是两部分组成的一部分是web应用,一部分是索引库
-
- web应用就是搭建起来的可视化web
- 索引库就是Solr的搜索库,所有的搜索信息都在索引库内,索引库由域组成(可以理解为数据库中表的字段)
-
- schema.xml 是用来定义索引数据中的域的,包括域名称,域类型,域是否索引,是否分词,是否存储等等。
- Solr是两部分组成的一部分是web应用,一部分是索引库
-
- schema.xml文件的配置项信息
- 如何定义索引库中的 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 中必须要添加此域,否则你创建索引时会抛异常(可以理解为数据表中的not null,是否可以为空)。
- schema.xml文件内提供了默认的域但是这些域并不是每个都符合我们实际,需要在后期开发中进行添加域
![23379bdf5343d33050b5af59c17e1576.png](https://i-blog.csdnimg.cn/blog_migrate/58bcd99a455a00a0e609483f2b1dd23c.png)
- 定义域的类型
- <fieldType>:定义域的类型
<fieldType name="string" class="solr.StrField" sortMissingLast="true" />
- Name:域类型的名称,作为域类型标识符存在,在定义域(Field)时使用的类型
- (FieldType)属性就是域类型的名称。
- Class:域类型的数据类型,该属性指向的是 solr 中的已定义的类型,或者是用户定义的类型,域类型中的数据会被初始化成 class 执行类类的对象。
- sortMissingFirst/sortMissingLast:控制当排序域的值不存在时该文档(Document)所在队列的位置。true 是则在队头/队尾
- 复制域copyField
- <copyField>:复制域。可实现更新与查询分离
-
- <copyField source="item_title" dest="item_keywords"/>
- Source:源域
- Dest:目标域
-
![976b1bb9beefb0fce326d5b611329e9d.png](https://i-blog.csdnimg.cn/blog_migrate/7662717e77110468220a587d32feade8.jpeg)
- 动态域dynamicField
-
- 动态字段允许约定大于配置,为字段指定匹配的字段名称模式。
- 动态设置全局字段匹配
- 优先于Filed域的匹配name属性是必须的
-
![3ef5a13b2f1f54b08dd856f2ab0198ae.png](https://i-blog.csdnimg.cn/blog_migrate/4d0f263fdeca32a9b3b06dfb8097dd12.jpeg)
- Solr分词搜索的原理(索引机制)
- 正排索引(正向索引)
正排索引是以文档的 ID 为关键字,索引文档中每个字的位置信息,查找时扫描索引中每个文档中字的信息直到找出所有包含查询关键字的文档。但是在查询的时候需对所有的文档进行扫描以确保没有遗漏,这样就使得检索时间大大延长,检索效率低下。尽管正排索引的工作原理非常的简单,但是由于其检索效率太低,除非在特定情况下,否则实用性价值不大。正排索引从文档编号找词
- 正排索引可以这么理解,假如现在从100000个网页内查询到一个我们需要的关键字,使用正向索引则需要需要从100000个网页内的第一个网页开始遍历,如果极端的情况我们需要的关键字信息在第100000网页内,那么正向排序的效率可想而知
![831b83e529bbcbff9a458d44202a23c7.png](https://i-blog.csdnimg.cn/blog_migrate/1dfca345ba3d32dbde63bc16f59c1187.jpeg)
- Solr采用的是倒排索引(反向索引)
-
- 当我们使用Sorl搜索服务进行搜索的时候,会以词条为key进行搜索,对应数据存储的位置作为value,实现索引的存储,这种索引称为倒序索引。
- 首先理解几个Solr的关键字
-
- 索引:就是数据储存的编号
- 文档:指的是一document,是一条数据,一条数据称为一个document
- 分词:将一条数据按照一定的规则进行词拆分,如苹果六好贵买不起,可能会被分词为:苹果六、好贵、买不起
-
- 当Solr存储文档(一条数据)的时候,会先将数据进行分词,并且创建索引库和文档数据库,索引库存储分词信息,文档数据库存储文档数据。所谓的分词就是将一个document按照一定的桂策拆分成关键词汇存储在索引库内
- 要明白索引库和文档库的关系,索引库是文档库内的document分词后的信息,Solr要根据索引库内的关键字查询定位到文档库内包含此分词的document并把所有包含此分词的document返回。
-
![b6f0549f89455afe2c518ca611072b78.png](https://i-blog.csdnimg.cn/blog_migrate/28d818efba484e98cbdb8329408b2cec.jpeg)
- 如下面的信息
- 假设下面的信息为我文档库的信息
![8dc00d638e507d65ce69c1f992b2a5cc.png](https://i-blog.csdnimg.cn/blog_migrate/1e0c279157f229152d02125fa985f312.jpeg)
- 索引库信息
- 这为索引库的信息当然根据上面的3条数据分词的结果不可能只有下面的几条
- 再根据上面的分析解释Solr的倒序索引搜索概念
-
- 使用Solr进行倒排索引的时候,它会先创建索引库和文档库,然后对每一条docum进行分词,并加入到索引库中,携带到索引库内的数据分别是关键词和该词所有包含该词的document的序号,Solr进行搜索的时候是搜索索引库内的关键词,然后在根据关键词的索引去文档库内拿到所有包含该关键词的document并进行返回。
-
![51e9e645a2ad0e163e6edcd6ab027d7c.png](https://i-blog.csdnimg.cn/blog_migrate/44223867cb81eb1cba092b257dbc3371.jpeg)
- 注意:Solr并不会对所有的document都进行分词处理,它只会对filed的type属性为text_general的filed进行分词的处理
- 测试分词
![51f91bef270b6f2af7b15e837e63c9a0.png](https://i-blog.csdnimg.cn/blog_migrate/4893d295814c9c1258c30e3b65ca4007.jpeg)
- 非text_general分词是没有任何效果的
![19a47c10e114ae108e107797d3baa8fc.png](https://i-blog.csdnimg.cn/blog_migrate/12de0301f00edf20f2f13b1df6efac01.jpeg)
- 分词效果
- 对英文是根据空格进行单词的区分进行分词
![b0e4aac47281e0af20ceebbcff9fe32e.png](https://i-blog.csdnimg.cn/blog_migrate/854607dff78e358dd0f6893fdc4cae1e.jpeg)
- 对中文呢?
- 将每一个汉字作为一个词,但是这样是是有很大的缺陷的 ,分的太细结果返回的太多照成很多的垃圾数据,并且这种分词效果可能无法找到我们想要的数据,而且很遗憾Solr是老外写的没有支持中文的分词,需要依赖第三包jar包实现中文分词。
![84f1434a9b0fb902746367b2b652334a.png](https://i-blog.csdnimg.cn/blog_migrate/0da3edb778061dbe1e57c68799db27be.jpeg)