要点
1.Solr与Sql数据库的不同
-
1.内容存储的不同 Solr的主要作用是将非结构性的文档转化成为一个索引结构,每个文档可以拥有不同的字段 Mysql将结构化的数据转化为sql数据库中的一条数据,每条数据都拥有相同的字段,
-
2.索引的不同 Slor与Mysql都是将数据先转化为索引,在通过索引数据进行快速的查询 Solr的索引是通过倒排索引进行构建,mysql的索引通过构建红黑树或者hash表
-
3.排序的不同 Solr对返回的结果可以进行相关对排序,那照相关度的顺序进行返回 Mysql只能对字段进行排序
在以文本为中心的搜索场景下,mysql的一些特性反而会影响数据的查找效率
如搜索title为buy home的文档时,mysql的处理情况可以分为以下几种:
select title from book where title='buy home'; //精确查找,只能返回严格匹配的数据 如tilte为buy new home的书籍不能返回
select title from book where title='buy' or title =' home'; //可能返回任何包含buy的书籍
select title from book where title='%buy % home%'; //索引失效,查询慢
2.倒排索引
每一个文档包含多个字段,每个字段包含多个词项,solr为每个字段中的每个词项构建了倒排索引,通过搜索词与索引表的匹配,可以找到包含该搜索词的文档.并且为了能够完成短语搜索,将每一个词项在文档者中出现的位置也进行了标注
查找时可以根据倒排索引表返回数据:以搜索词new home为例
- 1.通过查找包含new 或者home的所有文档
将文档2,4,5,7,8返回
- 2.查找短句"new home"
5文档中,new的词项位置为2,Home的词项位置为3,8文档中,new的词项位置为2,Home的词项位置为3. 词项相连,满足短语查询,返回5,8文档
3.Solr查询的分类与原理
3.1词项查询
3.1.1必备词项
搜索多个词项,要求匹配多个词项,语法要求如下:
new +house
new AND house
符号+是一元运算符,要求其后的查询部分也要出现在文档中,AND是二元操作符,要求左右两边同时成立
3.1.2可选词项
搜素多个词,有一个出现在该字段内即可,语法要求如下:
new house
new OR house
solr默认词项之间为OR操作符
3.1.3排除词项
搜索多个词,要求后面的词项不能出现在文档之中,语法要求如下:
new -house
new NOT house
匹配new的查询文档中删除包括house的文档
可以通过.op命令修改slor的默认词项运算符,solr默认词项之间为OR,可以通过q.op=AND改变默认的词项运算符
/select/?q=new house&q.op=AND
3.1.4词项查询原理
solr根据文档的字段建立了倒排索引如下:
根据倒排索引,solr可以由词项的交并集,进行文档的筛选,赛选的原理如下:
3.2短语查询
所谓的短语查询,就是将多个短语当作一个整体,保证所有的词项在文档中出现的位子顺序,
"new house"
"good job" AND "nice price"
短语查询的关键是如何确定词项的位置,new 与house词项在文档的位置必须相连,才能表示该文档包含"new house"短语.solr在建立倒排索引时,也会保留每个词项在文档中的位置信息,带有术语位置的倒排索引如下:
根据倒排索引可以确定,包含new 或者 house的文档信息如下:
文档5,和8中,new出现的位置为3,house出现的位置为4,所以文档5,8中new 与house相连,5,8文档满足查询要求.
3.3模糊查询
Solr提供了几种模糊匹配查询功能,通过模糊匹配可以完成不精准查询,Solr提供了通配符搜索,模糊搜索(编辑距离搜索),区间搜索,临近搜索等
3.3.1 通配符搜索
通配符搜索可以搜索以某一个或多个固定字符开头的文档,solr支持的通配符有*和?,星号*通配符匹配查询词中的0个或多个字符,问号?只匹配单个字符
- 查询 off*,可以匹配offer,off,office等
- 查询 off?r,可以匹配offer,大不能匹配officer
注意:Solr通配符查询的花销是巨大的,需要遍历该字段下面所有的词项,使用倒排索引中所有的词项与第一个通配符之前的查询词部分进行匹配,如果通配符之前的词越少,则需要匹配的到的词项越多,性能开销越大.
查询 *ing
如果通配符在首位,为了加快搜索的速度,可以在字段的类型分析链中增加ResverseWildcardFilterFactory类,,ReverseWildCardFilterFactory在solr索引两次插入被索引的内容,一次是每个词项的文本,一次是每个词项的反向文本.
索引 card 反向之后 drac
带有*ing首位通配符的查询提交之后,Solr会搜索反向的文本,另外通配符只适合词项搜索,不适合短语搜索
3.3.2 区间搜索
Solr可以在某一个子区间中进行搜索特定的文档.查询使用的符号为[]或者{},[]代表闭区间,{}代表开区间.
yearold:[11 TO 13] 相当于 yearold:(11 12 33) yesrold:{11 TO 33} 相当于 yearold:(12) yearold:{11 TO 13} 相当于 yearold:(12 13)
3.3.3 模糊编辑距离搜索
Solr使用~表示编辑距离搜索,编辑距离表示字符的一次插入,删除,替换,或则位置替换的一次操作.
- abc与ab的编辑距离为 1
- abcd与acbd的编辑距离为 1
- abcd与abce的编辑距离为1
查询时q:abce~2,表示两个编辑距离,abcd~N表示N个编辑距离
3.3.4邻近搜索
编辑距离用于词项搜索,临近距离用于词项搜索,临近距离表示两个词项之间的距离
- 查询
"chief office"~1表示chief与office之间可以有一个单词间隔 - 查询
"ABC DEF"~N表示ABC与DEF之间可以有N个单词间隔