博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《艳遇SOLR》9--solr查询--逻辑运算查询
阅读量:6294 次
发布时间:2019-06-22

本文共 2215 字,大约阅读时间需要 7 分钟。

hot3.png

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

 

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

 

今天要讨论的内容是Solr的查询时时的逻辑运算。

 

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

8.0.png

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

 

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

 

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

 

new home

搜索

 

对于这个搜索请求,可能有如下三种情况:

 

1,搜索词new home被分成new和home,查询结果需要同时匹配new 和home

 

2,搜索词new home被分成new和home,查询结果只需要匹配他们中的一个

 

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

 

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

 

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

 

8.02.png

查询的数学模型

 

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

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

 

8.03.png

 

 

 

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

即 new and home

 

8.04.png

 

 

 

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

 

8.05.png

 

 

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

 

8.06.png

 

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

 

 

solr对查询词的处理逻辑

 

交集

 

+new +home 或new and home

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

8.1.png

q=+new +home

 

8.2.png

q=new and home

 

 

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

 

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

 

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

 

所以 +new +home == new AND home 

但是new +home !=new AND home 

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

效果如图

 

8.3.png

q=new +home

 

 

并集

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

new home 或者new OR home

 

8.4.png

q=new OR home

 

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

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

new home -car 或 new home NOT car

 

8.5.png

q=new home NOT car

 

 

短语查询

 

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

 

"new home" OR "new car"

 

8.6.png

 q="new home" OR "new car"

 

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

 

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

 

8.61.png

 

从上表中,我们可以得出

 

8.6.2.png

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

 

组表达式

 

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

 

8.7.png

 

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

 

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

 

8.8.png

 

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

 

预告:solr模糊查询

 

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

 

 

29123856_mE7p.jpg

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

 

 

 

 

 

 

转载于:https://my.oschina.net/yimiyan/blog/814532

你可能感兴趣的文章
SUSE11修改主机名方法
查看>>
jdk6.0 + Tomcat6.0的简单jsp,Servlet,javabean的调试
查看>>
Android:apk签名
查看>>
2(2).选择排序_冒泡(双向循环链表)
查看>>
MySQL 索引 BST树、B树、B+树、B*树
查看>>
微信支付
查看>>
CodeBlocks中的OpenGL
查看>>
短址(short URL)
查看>>
第十三章 RememberMe——《跟我学Shiro》
查看>>
mysql 时间函数 时间戳转为日期
查看>>
索引失效 ORA-01502
查看>>
Oracle取月份,不带前面的0
查看>>
Linux Network Device Name issue
查看>>
IP地址的划分实例解答
查看>>
如何查看Linux命令源码
查看>>
运维基础命令
查看>>
入门到进阶React
查看>>
SVN 命令笔记
查看>>
检验手机号码
查看>>
重叠(Overlapped)IO模型
查看>>