《艳遇SOLR》9--solr查询--逻辑运算查询

Posted 金沙数据

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《艳遇SOLR》9--solr查询--逻辑运算查询相关的知识,希望对你有一定的参考价值。

在上一篇中,我们讨论了在solr中,文档如何以倒排索引的形式进行存储。solr作为一个企业级搜索引擎,我们在这里不讨论它是如何实现倒排索引的,又是如何维护维护倒排索引字典,到底是存在内存里还是存在磁盘上感兴趣的同学可以通过源码去了解一下。


solr创建索引,将每一个文档分词后,形成一个key-value(词-文档,偏移量等)形式的映射表,按照某种顺序排序(默认的英文是字典书序,中文可以是拼音顺序,笔画顺序),存储在某个地方。今天要讨论的内容是solr在创建索引后,如何查询。


我们仍然使用上一节中的例子,有9个文档,并对这9个文档使用solr创建了索引。我们现在有一个搜索引擎服务器,这个搜索引擎服务器有9条记录。


左侧为书籍名称,右侧是生成的索引


从图中可以看出,每一个文档(每一本书的名字)都被分成了单独的单词存在在了倒排索引中。


使用场景是:要在搜索引擎中检索包含“new home”的文档。


new home
搜索


对于这个搜索请求,我们想要的结果可能有以下三种:


1,查询结果需要同时匹配new和home


2,查询结果只需要匹配new或home


3,查询结果匹配“new home”这个短语


NB:索引的创建和查询需要使用相同的分词器


从上图右侧的倒排索引表中,我们可以得出下图的结果


《艳遇SOLR》9--solr查询--逻辑运算查询


查询的数学模型


1,如果我们想要的结果是所有匹配home或者匹配new的文档

即new or home,得到的结果如下


《艳遇SOLR》9--solr查询--逻辑运算查询




2,如果我们想要的文档是及含有new又含有home的文档

即 new and home


《艳遇SOLR》9--solr查询--逻辑运算查询




3,只含有home不含有new,not new home


《艳遇SOLR》9--solr查询--逻辑运算查询



4,只含有new不含有home,即 new not home


《艳遇SOLR》9--solr查询--逻辑运算查询


在solr中如何表示这种逻辑关系呢?



solr对查询词的处理逻辑


交集


+new +home 或new and home

(字符与字符之间有一个小空格,这个空格很重要)

《艳遇SOLR》9--solr查询--逻辑运算查询

q=+new +home


《艳遇SOLR》9--solr查询--逻辑运算查询

q=new and home



+ 与 AND 的逻辑是相同的。在debug的参数中,我们可以发现,即使是我们使用AND操作,在最终查询时,也转化成了+操作符。


+ 是一个一元的操作符。意味着+后面紧跟着的词必须存在于匹配的文档中。


AND 是一个二进制操作符。意味着AND前后的词都需要存在于匹配的文档中。


所以 +new +home == new AND home 

但是new +home !=new AND home 

理论上new +home查询出的结果要多余new AND home

效果如图


《艳遇SOLR》9--solr查询--逻辑运算查询

q=new +home



并集

与AND相反,solr也支持IOR的二进制查询。OR是solr的默认配置,即查询词如果没有明确的操作符,使用OR查询。

new home 或者new OR home


《艳遇SOLR》9--solr查询--逻辑运算查询

q=new OR home



我们的查询词是new home ,为不是car,该如何告诉solr呢。

solr中使用 - 或 NOT 表示忽略后面的词

new home -car 或 new home NOT car


《艳遇SOLR》9--solr查询--逻辑运算查询

q=new home NOT car


短语查询


上面的例子中,我们都是以单个词来查询的。solr除了单个词查询外,也支持短语查询


"new home" OR "new car"


《艳遇SOLR》9--solr查询--逻辑运算查询

 q="new home" OR "new car"


在这里我们可能会有一些疑惑。我们在前面又说,索引的创建和查询必须使用相同的分词器,而我们在创建索引的时候,将文档都分成了一个一个的单词,那solr是如何进行短语查询的呢。


在上一次分享中,我们有提到倒排索引由两部分构成(词典和文档集合)。在词典中记录了索引词,索引词出现的次数及所索引词出现的位置。


《艳遇SOLR》9--solr查询--逻辑运算查询


从上表中,我们可以得出


《艳遇SOLR》9--solr查询--逻辑运算查询

通过这个位置信息,solr很聪明的发现了new和home是一个词组。(solr在存贮位置信息时并不会像列表中这样存储,而是会采用压缩算法进行压缩。比如差分序列,除了第一个编码外其余存储的是间隔距离,所以4-3=1,间隔距离是1的两个词构成了一个词组)


组表达式


solr可以使用双括号,一元操作符以及二进制操作符组成复杂的查询表达式


《艳遇SOLR》9--solr查询--逻辑运算查询


使用new AND (house OR home)得到的结果,仍有一些不是我们想要的。假如我们是想查询如何buy一个new home上图中2和5并不是我们想要的查询结果。


+(buying purching -renting) +(home house)


《艳遇SOLR》9--solr查询--逻辑运算查询


从上面的查询中我们发现,使用上面的条件进行查询时,“how to buy a new house ”这条记录没有查询出来,我们知道buying是buy的分词,那关于语言学上的词形变换该如何进行搜索呢。将在下一次的文章中,讲述solr的模糊查询


预告:solr模糊查询


小王子说人非常伤心的时候喜欢看日落,有一天他看了44次日落。




《艳遇SOLR》9--solr查询--逻辑运算查询

本文选择《solr in action》54-60页,3.1.4-3.1.6。感谢对金沙数据的关注。任何的翻译都有语言的局限性同时也由翻译者的水平决定了质量,所以希望每一位同学还是能去读一读英文原版书。

长按二维码



微信讨论组





以上是关于《艳遇SOLR》9--solr查询--逻辑运算查询的主要内容,如果未能解决你的问题,请参考以下文章

《艳遇SOLR》10--倒排索引的查询--模糊匹配

《艳遇SOLR》6--通过一个Demo,看看solr提供的功能

《艳遇SOLR》7-- 传统数据库在文本搜索中的劣势

《艳遇SOLR》4--solr6.3.0安装部署

《艳遇SOLR》8--倒排索引

金沙数据-《艳遇SOLR(solr in action)》--2 千呼万唤始出来 犹抱琵琶半遮面