本节书摘来华章计算机《深入理解Elasticsearch(原书第2版)》一书中的第1章 ,第1.1.4节,[美]拉斐尔·酷奇(Rafal Ku) 马雷克·罗戈任斯基(Marek Rogoziski)著 张世武 余洪淼 商旦 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.1.4 Lucene查询语言

Elasticsearch提供的一些查询类型(query type)支持Apache Lucene的查询解析语法,因此,我们应该深入了解Lucene的查询语言。

  1. 理解基本概念
    在Lucene中,一个查询(query)通常被分割为词项与操作符。Lucene中的词项可以是单个的词,也可以是一个短语(用双引号括起来的一组词)。如果查询被设置为要被分析,那么预先选定的分析器将会对查询中的所有词项进行处理。

一个查询也可以包含布尔操作符。布尔操作符连接多个词项,使之构成从句(clause)。有以下这些布尔操作符。
AND:它的含义是,文档匹配当前从句当且仅当AND操作符左右两边的词项都在文档中出现。例如,我们想执行“apache AND lucene”这样的查询,只有同时包含“apache”和“lucene”这两个词项的文档才会被返回给用户。
OR:它的含义是,包含当前从句中任意词项的文档都被视为与该从句匹配。例如,我们执行“apache OR lucene”这样的查询,任意包含词项“apache”或词项“lucene”的文档都会返回给用户。
NOT:它的含义是,与当前从句匹配的文档必须不包含NOT操作符后面的词项。例如,我们执行“lucene NOT elasticsearch”这样的查询,只有包含词项“lucene”且不包含词项“elasticsearch”的文档才会被返回给用户。
除了前面介绍的那些操作符以外,我们还可以使用以下这些操作符。
+:它的含义是,只有包含了“+”操作符后面词项的文档才会被认为与从句匹配。例如,我们想查找那些必须包含“lucene”但是“apache”可出现可不出现的文档,可执行如下查询:“+lucene apache”。
–:它的含义是,与从句匹配的文档,不能出现“-”操作符后的词项。例如,我们想查找那些包含了“lucene”但是不包含“Elasticsearch”的文档,可以执行如下查询:“+lucene -elasticsearch”。
如果查询中没有出现前面提到过的任意操作符,那么默认使用OR操作符。
除了前面介绍的内容之外,有一件事情值得一提:可以使用圆括号对从句进行分组,以构造更复杂的从句,例如:

2. 在字段中查询
就像Elasticsearch的处理方式那样,Lucene中所有数据都存储在字段(field)中,而字段又是文档的组成单位。为了实现针对某个字段的查询,用户需要提供字段名称,再加上冒号以及将要在该字段中执行查询的从句。如果你想查询所有在“title”字段中包含词项“Elasticsearch”的文档,可执行以下查询:

也可以在一个字段中同时使用多个从句,例如,如果你想查找所有在“title”字段中同时包含词项“Elasticsearch”和短语“mastering book”的文档,可执行如下查询:

当然,上面的查询也可以写成下面这种形式:

3. 词项修饰符
除了使用简单词项和从句的常规字段查询以外,Lucene允许用户使用修饰符(modifier)修改传入查询对象的词项。毫无疑问,最常见的修饰符就是通配符(wildcard)。Lucene支持两种通配符:?和*。前者匹配任意一个字符,而后者匹配多个字符。
 请记住,出于对性能的考虑,通配符不能作为词项的第一个字符出现。
除通配符之外,Lucene还支持模糊(fuzzy and proximity)查询,办法是使用“~”字符以及一个紧随其后的整数值。当使用该修饰符修饰一个词项时,意味着我们想搜索那些包含该词项近似词项的文档(所以这种查询称为模糊查询)。~字符后的整数值确定了近似词项与原始词项的最大编辑距离。例如,当我们执行查询writer~2,意味着包含词项writer和writers的文档都可以被视为与查询匹配。
当修饰符~用于短语时,其后的整数值用于告诉Lucene词项之间多大距离是可以接受的。例如,我们执行如下查询:

在title字段中包含mastering Elasticsearch的文档被视为与查询匹配,而包含mastering book Elasticsearch的文档则被认为不匹配。而如果我们执行下面这个查询:

title:"mastering Elasticsearch"~2,

则这两个文档都被认为与查询匹配。
此外,还可以使用^字符并赋以一个浮点数对词项加权(boosting),从而提高该词项的重要程度。如果都被加权,则权重值较大的词项更重要。默认情况下词项权重为1。可以参考2.1节进一步了解什么是权重值(boost value),以及其在文档评分中的作用。
我们也可以使用方括号和花括号来构建范围查询。例如,我们想在一个数值类型的字段上执行一个范围查询,执行如下查询即可:

上面查询的返回文档的price字段的值大于等于10.00并小于等于15.00。
当然,我们也可以在字符串类型的字段上执行范围查询(range query),例如:name:[Adam TO Adria]
上面查询的返回文档的name字段中,包含了按字典顺序介于Adam 和Adria之间(包括Adam和Adria)的词项。
如果想执行范围查询同时又想排除边界值,则可使用花括号作为修饰符。例如,我们想查找price字段值大于等于10.00但小于15.00的文档,可使用如下查询:

如果想执行一边受限而另一边不做限制的范围查询,例如,查找price字段值大于等于10.00的文档,可使用如下查询:

4. 特殊字符处理
很多应用场景中,也许你想搜索某个特殊字符(这些特殊字符包括+、–、&&、||、!、(,)、{}、[]、^、"、~、*、?、:、、/),需要先使用反斜杠对这些特殊字符进行转义。例如,你可能想搜索abc"efg这个词项,需要按如下方式处理:abc"efg

《深入理解Elasticsearch(原书第2版)》一1.1.4 Lucene查询语言相关推荐

  1. 深入理解ElasticSearch(原书第2版)

    为了方便人们从海量信息中快速检索出内容,搜索引擎应运运出.ElasticSearch是一个款基于apache lucene 的开源搜索引擎,它具有开源,分布式,准实时,restful,便于二次开发等特 ...

  2. 虚拟内存(深入理解计算机系统原书第3版9节读书笔记)

    深入理解计算机系统(原书第3版)读书笔记,其实就是嚼碎了原文然后把一部分挑了出来摘要,免得读着读着忘了 文章目录 前言 一.物理和虚拟寻址 二.地址空间 三.虚拟内存作为缓存的工具 1.DRAM缓存的 ...

  3. Linux设备驱动程序(第三版)/深入理解计算机系统(原书第2版)/[Android系统原理及开发要点详解].(韩超,梁泉)百度云盘下载

    文档下载云盘连接:http://pan.baidu.com/s/1dDD2sgT 更多其他资料,请关注淘宝:http://shop115376623.taobao.com/ http://item.t ...

  4. 《深入理解Elasticsearch(原书第2版)》——第2章 查询DSL进阶 2.1 Apache Lucene默认评分公式解释...

    本节书摘来自华章计算机<深入理解Elasticsearch(原书第2版)>一书中的第2章,第2.1节,作者 [美]拉斐尔·酷奇(Rafal Ku)马雷克·罗戈任斯基(Marek Rogoz ...

  5. 《深入理解Elasticsearch(原书第2版)》——1.4 小结

    本节书摘来自华章计算机<深入理解Elasticsearch(原书第2版)>一书中的第1章,第1.4节,作者 [美]拉斐尔·酷奇(Rafal Ku)马雷克·罗戈任斯基(Marek Rogoz ...

  6. 《深入理解Elasticsearch(原书第2版)》一1.3 在线书店示例

    本节书摘来自华章出版社<深入理解Elasticsearch(原书第2版)>一书中的第1章,第1.3节,作者[美]拉斐尔·酷奇(Rafal Ku) 马雷克·罗戈任斯基(Marek Rogoz ...

  7. 《深入理解Elasticsearch(原书第2版)》一2.2 查询改写

    本节书摘来自华章出版社<深入理解Elasticsearch(原书第2版)>一书中的第2章,第2.2节,作者[美]拉斐尔·酷奇(Rafal Ku) 马雷克·罗戈任斯基(Marek Rogoz ...

  8. 深入理解Elasticsearch(原书第2版)》一1.2 何为Elasticsearch

    本节书摘来华章计算机<深入理解Elasticsearch(原书第2版)>一书中的第1章 ,第1.2节,[美]拉斐尔·酷奇(Rafal Ku) 马雷克·罗戈任斯基(Marek Rogozis ...

  9. 《深入理解Elasticsearch(原书第2版)》一2.3.3 把查询模板保存到文件

    本节书摘来华章计算机<深入理解Elasticsearch(原书第2版)>一书中的第2章 ,第2.3.3节,[美]拉斐尔·酷奇(Rafal Ku) 马雷克·罗戈任斯基(Marek Rogoz ...

  10. 《深入理解Elasticsearch(原书第2版)》一第1章

    本节书摘来华章计算机<深入理解Elasticsearch(原书第2版)>一书中的第1章 ,[美]拉斐尔·酷奇(Rafal Ku) 马雷克·罗戈任斯基(Marek Rogoziski)著 张 ...

最新文章

  1. php中final关键字
  2. MySQL基本操作及乱码问题的解决方法
  3. 《CUDA高性能并行计算》----2.2 需要知道的CUDA API和C语言拓展
  4. NO.2_python_scrapy_反爬虫(随机请求头IP代理)取消链接去重
  5. std::map的insert和下标[]访问
  6. tcp协议的主要功能是什么_计算机网络 | 一文搞懂什么是TCP/IP协议
  7. 非空约束 mysql
  8. 安杰文高等计算机与生产技术学校,法国留学院校推荐:安杰文高等计算机与生产技术学校...
  9. 以下关于组装微型计算机的叙述 不正确的是,昆明理工大学 计算机系统练习题...
  10. 第四(装饰器、迭代器、生成器)
  11. 2020-11-18 Ubuntu 安装 Chrome
  12. 问题集录--新手入门深度学习,选择TensorFlow 好吗?
  13. CCNA学习指南记录
  14. Java基础SE.03.Java面向对象
  15. 高通 MSM 8916与MSM8926芯片的区别
  16. 如何撰写优秀的谷歌AD广告标题?
  17. 微信小程序及其兼容性
  18. Vue npm install失败报错errno -4058
  19. 计算机连接公用网络受限,电脑连接无线网络受限怎么解决【解决方法】
  20. IE无法打开网页的问题

热门文章

  1. 深入浅出Pytorch函数——torch.arange
  2. 【分布式版本控制系统Git】| Git 分支操作、Git 团队协作机制、GitHub 操作
  3. set在MATLAB中什么意思,matlab中set函数怎么用,具体的,中文的?
  4. 搜狗输入法切换全角半角
  5. 如何画双层pcb板_双层pcb板布线规则(操作技巧与案例分析)
  6. webdriver.Chrome.set_network_conditions:Chrome网络仿真设置。
  7. 一次探索:基于香农熵预测DNA中编码序列,python实现。
  8. ADNI数据集几个使用小技巧 【1】
  9. VB-Word添加页眉页脚
  10. 预装WIN8改装WIN7之BIOS设置