本文参考官方提供api提炼出来的
https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html
Query DSL
Elasticsearch提供基于JSON的完整查询DSL(域特定语言)来定义查询。将Query DSL视为查询的AST(抽象语法树),由两种类型的子句组成:
- Leaf query clauses
叶查询子句中寻找一个特定的值在某一特定领域,如 match
,term
或 range
查询。这些查询可以单独使用。
- Compound query clauses
复合查询子句包装其他叶子或复合查询,用于以逻辑方式(例如bool
或dis_max
查询)组合多个查询 ,或者更改其行为(例如 constant_score
查询)。
查询子句的行为有所不同,具体取决于它们是在 查询上下文还是过滤器上下文中使用。
Query和filter
query子句的行为取决于它是在查询上下文中还是在过滤器上下文中使用:
query
查询上下文中使用的查询子句回答了问题“ 此文档与此查询子句的匹配程度如何?“除了判断文档是否匹配之外,查询子句还计算_score表示文档相对于其他文档的匹配程度。
查询上下文是有效每当查询子句被传递给一个query参数,如query该参数search的API。
filter
在过滤器上下文中,查询子句回答问题“ 此文档是否与此查询子句匹配?“答案是简单的是或否 - 没有计算得分。过滤器上下文主要用于过滤结构化数据,例如
- 这是否timestamp属于2015年至2016年的范围?
- 在status 字段设置为"published"?
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
高层参数包括:
参数 | 描述 |
---|---|
| 要解析的实际查询。请参阅下面的语法。 |
| 要执行解析查询的字段。默认为 |
| 如果未指定显式运算符,则使用默认运算符。例如,使用默认运算符 |
| 在创建复合查询时,强制分析器用于分析查询的每个术语。 |
| 标志指定 |
| 是否应自动分析前缀查询的条款。如果 |
| 如果设置为 |
| 要返回的文档必须匹配的最小子句数。有关 |
| 附加到查询字符串的引用部分的字段的后缀。这允许使用具有不同分析链的字段进行精确匹配。看看这里为一个完整的例子。 |
| 是否应为多项同义词自动生成短语查询。默认为 |
| [ |
| 设置模糊查询的前缀长度。默认是 |
| 控制模糊查询将扩展到的术语数。默认为 |
| 设置为 |