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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介:

本节书摘来华章计算机《深入理解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操作符。
除了前面介绍的内容之外,有一件事情值得一提:可以使用圆括号对从句进行分组,以构造更复杂的从句,例如:
image

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

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

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

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

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

title:"mastering Elasticsearch"~2,

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

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

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

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

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
2月前
|
存储 固态存储 Java
Elasticsearch中查询性能优化
Elasticsearch中查询性能优化
185 0
|
3月前
Elasticsearch之RestClient查询文档
Elasticsearch之RestClient查询文档
138 1
|
4月前
|
JSON 自然语言处理 数据库
数据库-ElasticSearch入门(索引、文档、查询)
数据库-ElasticSearch入门(索引、文档、查询)
285 0
|
3月前
|
缓存 JSON API
Elasticsearch-05Elasticsearch之查询与过滤
Elasticsearch-05Elasticsearch之查询与过滤
162 0
|
5月前
|
JSON 自然语言处理 数据格式
分布式系列教程(33) -ElasticSearch DSL语言查询与过滤
分布式系列教程(33) -ElasticSearch DSL语言查询与过滤
151 0
|
5月前
分布式系列教程(32) -ElasticSearch条件查询
分布式系列教程(32) -ElasticSearch条件查询
173 0
|
1月前
|
存储 机器学习/深度学习 关系型数据库
为什么Elasticsearch/Lucene检索可以比MySQL快?
为什么Elasticsearch/Lucene检索可以比MySQL快?
25 2
|
2月前
|
缓存 算法 索引
【Elasticsearch专栏 07】深入探索:Elasticsearch的倒排索引如何进行模糊查询和通配符查询
Elasticsearch的倒排索引支持模糊查询和通配符查询,通过特定的算法和数据结构,能够实现对关键词的模糊匹配和通配符匹配。这两种查询类型提供了更灵活的搜索功能,但可能影响查询性能,需结合优化策略使用。
|
2月前
|
缓存 自然语言处理 数据挖掘
一篇文章让你学会Elasticsearch中的查询
一篇文章让你学会Elasticsearch中的查询
137300 118
|
2月前
|
测试技术 定位技术 API
万字长文:一文彻底搞懂Elasticsearch中Geo数据类型查询、聚合、排序
万字长文:一文彻底搞懂Elasticsearch中Geo数据类型查询、聚合、排序
94608 140

热门文章

最新文章