本文参考官方提供api提炼出来的html
https://www.elastic.co/guide/en/elasticsearch/reference/current/search.htmlgit
Elasticsearch提供基于JSON的完整查询DSL(域特定语言)来定义查询。将Query DSL视为查询的AST(抽象语法树),由两种类型的子句组成:github
叶查询子句中寻找一个特定的值在某一特定领域,如 match
,term
或 range
查询。这些查询能够单独使用。sql
复合查询子句包装其余叶子或复合查询,用于以逻辑方式(例如bool
或dis_max
查询)组合多个查询 ,或者更改其行为(例如 constant_score
查询)。api
查询子句的行为有所不一样,具体取决于它们是在 查询上下文仍是过滤器上下文中使用。缓存
Query和filterelasticsearch
query子句的行为取决于它是在查询上下文中仍是在过滤器上下文中使用:ide
query性能
查询上下文中使用的查询子句回答了问题“ 此文档与此查询子句的匹配程度如何?“除了判断文档是否匹配以外,查询子句还计算_score表示文档相对于其余文档的匹配程度。网站
查询上下文是有效每当查询子句被传递给一个query参数,如query该参数search的API。
filter
在过滤器上下文中,查询子句回答问题“ 此文档是否与此查询子句匹配?“答案是简单的是或否 - 没有计算得分。过滤器上下文主要用于过滤结构化数据,例如
Elasticsearch会自动缓存常用的过滤器,以加快性能。
只要将查询子句传递给filter 参数(例如查询中的filter或mustnot参数, bool查询中的filter参数 constantscore或filter聚合), 过滤器上下文就会生效。
GET / _search { “query” :{ “bool” :{ “必须” :[ { “匹配” :{ “title” :“搜索” }}, { “match” :{ “content” :“Elasticsearch” }} ],“过滤器” :[ { “term” :{ “status” :“已发布” }}, { “range” :{ “publish_date” :{ “gte” :“2015-01-01” }}} ] } } }
Match All
最简单的查询,匹配全部文档,给他们全部_score 的1.0。
GET /_search { "query": { "match_all": { "boost" : 1.2 } } }
match_none
这是match_all查询的反转,它不匹配任何文档。
GET /_search { "query": { "match_none": {} } }
Full text queries
高级全文查询一般用于在全文字段(如电子邮件正文)上运行全文查询。他们了解如何分析被查询的字段,并在执行以前将每一个字段 analyzer(或search_analyzer)应用于查询字符串。
Match
用于执行全文查询的标准查询,包括模糊匹配和短语或邻近查询。
GET /_search { "query": { "match" : { "message" : "this is a test" } } }
Match查询类型为boolean。这意味着文本是可分析的,分析过程根据提供的文本构造布尔查询。该operator标志能够设置为or或and用来控制布尔子句(默认为or)。should可使用minimumshouldmatch 参数设置要匹配的最小可选子句数。若是要检索的field,是not_analyzed类型的,那么match query也至关于term query。
所述analyzer能够被设置为控制哪一个分析器将在文本上执行的分析过程。它默认为字段显式映射定义或默认搜索分析器。
该lenient参数能够设置为true忽略形成的数据类型不匹配的异常,如想查询的数字字段与文本查询字符串。默认为false。
Fuzziness
fuzziness容许基于被查询的字段类型进行模糊匹配。
prefixlength和maxexpansions能够在这种状况下,以控制模糊处理来设定。若是设置了模糊选项,则查询将使用toptermsblendedfreqs${maxexpansions} 其重写方法,该fuzzyrewrite参数容许控制如何重写查询。
默认状况下容许模糊转置(ab→ ba),但能够经过设置fuzzy_transpositions为禁用false。
GET /_search { "query": { "match" : { "message" : { "query" : "this is a test", "operator" : "and" } } } }
Zero terms query
若是使用的分析器删除了像stop过滤器那样的查询中的全部标记,则默认行为是根本不匹配任何文档。为了更改zerotermsquery可使用的选项,它接受 none(默认)而且all对应于match_all查询。
GET /_search { "query": { "match" : { "message" : { "query" : "to be or not to be", "operator" : "and", "zero_terms_query": "all" } } } }
Cutoff frequency
匹配查询支持cutoff_frequency容许指定绝对或相对文档频率,其中高频项被移动到可选子查询中,而且仅在or运算符或全部子项中的低频率(低于截止值)项之一时进行评分 。在and 运营商匹配的状况下的低频项。
此查询容许stopwords在运行时动态处理,与域无关,而且不须要停用文件。它能够防止评分/迭代高频术语,而且只有在更重要/更低频率的术语与文档匹配时才考虑这些术语。然而,若是全部查询项都高于给定cutoff_frequency的查询,则会自动将查询转换为纯的conj(and)查询以确保快速执行。
GET /_search { "query": { "match" : { "message" : { "query" : "to be or not to be", "cutoff_frequency" : 0.001 } } } }
Synonyms
match查询支持使用synonym_graph标记过滤器进行多项同义词扩展。使用此过滤器时,解析器会为每一个多项同义词建立一个短语查询。如下同义词:"ny, new york" would produce:(ny OR ("new york"))
GET /_search { "query": { "match" : { "message": { "query" : "ny city", "auto_generate_synonyms_phrase_query" : false } } } }
Match phrase
与match查询相似,但用于匹配精确短语或单词邻近匹配。match_phrase查询分析文本,并建立一个phrase查询出来的分析文字。短语查询slop以任何顺序匹配最多可配置(默认为0)的术语。转置条款的斜率为2。
analyzer能够被设置为控制哪一个分析器将在文本上执行的分析过程。它默认为字段显式映射定义或默认搜索分析器。
GET /_search { "query": { "match_phrase" : { "message" : { "query" : "this is a test", "analyzer" : "my_analyzer" } } } }
Match Phrase Prefix
像match_phrase查询同样,可是在最后一个单词上进行通配符搜索。
它还接受一个max_expansions参数(默认值50),该参数能够控制最后一个术语将被扩展的后缀数量。强烈建议将其设置为可接受的值以控制查询的执行时间。
GET /_search { "query": { "match_phrase_prefix" : { "message" : { "query" : "quick brown f", "max_expansions" : 10 } } } }
Multi match
multi_match查询基础上的match查询 ,容许多领域的查询。
GET /_search { "query": { "multi_match" : { "query": "Will Smith", "fields": [ "title", "*_name" ] } } }
若是未fields提供,则multimatch查询默认为index.query.defaultfield 索引设置,而索引设置默认为。提取映射中符合术语查询条件的全部字段,并过滤元数据字段。而后组合全部提取的字段以构建查询。
multi_match查询在内部执行的方式取决于type 参数,该参数能够设置为:
|
(默认)查找与任何字段匹配的文档,但使用 |
|
查找与任何字段匹配的文档,并组合 |
|
对待字段与 |
|
|
|
|
Common Terms Query
common terms query将所述查询术语分为两组:更重要(即低频率而言)和不过重要的(即,高频率而言这将先前已停用词)。
首先,它搜索与更重要的术语匹配的文档。这些术语出如今较少的文档中,对相关性有较大影响。
而后,它对不过重要的术语执行第二次查询 - 这些术语常常出现而且对相关性的影响很小。可是,它不是计算全部匹配文档的相关性分数,而是仅计算_score
已经与第一个查询匹配的文档。经过这种方式,高频项能够改善相关性计算,而无需支付性能不佳的成本。
若是查询仅包含高频术语,则单个查询将做为AND
(链接)查询执行,换句话说,全部术语都是必需的。即便每一个单独的术语与许多文档匹配,术语组合也会将结果集缩小到最相关的范围。单个查询也能够做为OR
特定的 查询执行minimum_should_match
,在这种状况下,应该使用足够高的值。
根据条件将术语分配给高频或低频组 cutoff_frequency
,能够将其指定为绝对频率(>=1
)或相对频率(0.0 .. 1.0
)。(请记住,文档频率是按照每一个分片级别计算的,如博客文章中所述, 相关性已被破坏。)
也许这个查询最有趣的属性是它自动适应域特定的停用词。例如,在视频托管网站上,常见的术语如"clip"
或"video"
将自动表现为停用词而无需维护手动列表。
GET /_search { "query": { "common": { "body": { "query": "nelly the elephant as a cartoon", "cutoff_frequency": 0.001, "low_freq_operator": "and" } } } }
等价
GET /_search { "query": { "bool": { "must": [ { "term": { "body": "nelly"}}, { "term": { "body": "elephant"}}, { "term": { "body": "cartoon"}} ], "should": [ { "term": { "body": "the"}}, { "term": { "body": "as"}}, { "term": { "body": "a"}} ] } } }
Query String Query
支持紧凑的Lucene 查询字符串语法,容许您在单个查询字符串中指定AND | OR | NOT条件和多字段搜索。仅限专家用户。
GET /_search { "query": { "query_string" : { "default_field" : "content", "query" : "this AND that OR thus" } } }
query_string
高层参数包括:
参数 | 描述 |
---|---|
|
要解析的实际查询。参见查询字符串语法。 |
|
若是未指定前缀字段,则查询字词的默认字段。默认为 |
|
若是未指定显式运算符,则使用默认运算符。例如,使用默认运算符 |
|
用于分析查询字符串的分析器名称。 |
|
分析器的名称,用于分析查询字符串中的引用短语。对于这些部件,它将覆盖使用 |
|
设置时, |
|
设置为 |
|
控制模糊查询将扩展到的术语数。默认为 |
|
|
|
设置模糊查询的前缀长度。默认是 |
|
设置为 |
|
设置短语的默认斜率。若是为零,则须要精确的短语匹配。默认值是 |
|
设置查询的提高值。默认为 |
|
默认为 |
|
默认状况下,不分析查询字符串中的通配符。经过将此值设置为 |
|
限制容许建立的regexp查询的自动机状态数。这能够防止太难(例如指数级硬)的regexp。默认为10000。 |
|
一个值,用于控制生成的布尔查询中应该匹配的“should”子句的数量。它能够是绝对值( |
|
若是设置为 |
|
时区应用于与日期相关的任何范围查询。另见 JODA时区。 |
|
附加到查询字符串的引用部分的字段的后缀。这容许使用具备不一样分析链的字段进行精确匹配。看看这里为一个完整的例子。 |
|
是否应为多项同义词自动生成短语查询。默认为 |
|
[ |
Simple Query String Query
一种更简单,更健壮的query_string
语法版本,适合直接向用户公开。
使用SimpleQueryParser解析其上下文的查询。与常规query_string
查询不一样,simple_query_string
查询永远不会抛出异常,并丢弃查询的无效部分
GET /_search { "query": { "simple_query_string" : { "query": "\"fried eggs\" +(eggplant | potato) -frittata", "fields": ["title^5", "body"], "default_operator": "and" } } }
simple_query_string
高层参数包括:
参数 | 描述 |
---|---|
|
要解析的实际查询。请参阅下面的语法。 |
|
要执行解析查询的字段。默认为 |
|
若是未指定显式运算符,则使用默认运算符。例如,使用默认运算符 |
|
在建立复合查询时,强制分析器用于分析查询的每一个术语。 |
|
标志指定 |
|
是否应自动分析前缀查询的条款。若是 |
|
若是设置为 |
|
要返回的文档必须匹配的最小子句数。有关 |
|
附加到查询字符串的引用部分的字段的后缀。这容许使用具备不一样分析链的字段进行精确匹配。看看这里为一个完整的例子。 |
|
是否应为多项同义词自动生成短语查询。默认为 |
|
[ |
|
设置模糊查询的前缀长度。默认是 |
|
控制模糊查询将扩展到的术语数。默认为 |
|
设置为 |