elasticsearch Query DSL(一)

本文参考官方提供api提炼出来的

https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html

Query DSL

Elasticsearch提供基于JSON的完整查询DSL(域特定语言)来定义查询。将Query DSL视为查询的AST(抽象语法树),由两种类型的子句组成:

  • Leaf query clauses

叶查询子句中寻找一个特定的值在某一特定领域,如 matchtermrange查询。这些查询可以单独使用。

  • Compound query clauses

复合查询子句包装其他叶子复合查询,用于以逻辑方式(例如booldis_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 参数,该参数可以设置为:

best_fields

默认)查找与任何字段匹配的文档,但使用 _score最佳字段。见best_fields

most_fields

查找与任何字段匹配的文档,并组合_score每个字段。见most_fields

cross_fields

对待字段与analyzer它们是一个大字段一样。在任何 字段中查找每个单词。见cross_fields

phrase

match_phrase对每个字段 运行查询并使用 _score 最佳字段。见phrasephrase_prefix

phrase_prefix

match_phrase_prefix对每个字段 运行查询并组合_score每个字段。见phrasephrase_prefix

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高层参数包括:

参数 描述

query

要解析的实际查询。参见查询字符串语法

default_field

如果未指定前缀字段,则查询字词的默认字段。默认为index.query.default_field索引设置,而索引设置默认为*。 *提取映射中符合术语查询条件的所有字段,并过滤元数据字段。然后组合所有提取的字段以在没有提供前缀字段时构建查询。

default_operator

如果未指定显式运算符,则使用默认运算符。例如,使用默认运算符OR,查询 capital of Hungary将转换为capital OR of OR Hungary,并且使用默认运算符AND,将相同的查询转换为 capital AND of AND Hungary。默认值为OR

analyzer

用于分析查询字符串的分析器名称。

quote_analyzer

分析器的名称,用于分析查询字符串中的引用短语。对于这些部件,它将覆盖使用analyzer参数或search_quote_analyzer设置设置的其他分析器。

allow_leading_wildcard

设置时,*?允许作为第一个字符。默认为true

enable_position_increments

设置为true在结果查询中启用位置增量。默认为true

fuzzy_max_expansions

控制模糊查询将扩展到的术语数。默认为50

fuzziness

设置模糊查询的模糊性。默认为AUTO。请参阅允许设置的模糊性编辑

fuzzy_prefix_length

设置模糊查询的前缀长度。默认是0

fuzzy_transpositions

设置为false禁用模糊转置(ab→ ba)。默认是true

phrase_slop

设置短语的默认斜率。如果为零,则需要精确的短语匹配。默认值是0

boost

设置查询的提升值。默认为1.0

auto_generate_phrase_queries

默认为false

analyze_wildcard

默认情况下,不分析查询字符串中的通配符。通过将此值设置为true,将尽最大努力分析这些值。

max_determinized_states

限制允许创建的regexp查询的自动机状态数。这可以防止太难(例如指数级硬)的regexp。默认为10000。

minimum_should_match

一个值,用于控制生成的布尔查询中应该匹配的“should”子句的数量。它可以是绝对值(2),百分比(30%)或两者组合

lenient

如果设置为true将导致基于格式的失败(如向数字字段提供文本)将被忽略。

time_zone

时区应用于与日期相关的任何范围查询。另见 JODA时区

quote_field_suffix

附加到查询字符串的引用部分的字段的后缀。这允许使用具有不同分析链的字段进行精确匹配。看看这里为一个完整的例子。

auto_generate_synonyms_phrase_query

是否应为多项同义词自动生成短语查询。默认为true

all_fields

6.0.0 ] 在6.0.0中已弃用。设置default_field*代替执行上可以查询映射检测到的所有字段的查询。_all禁用该字段时将默认使用,并且未default_field指定no (在索引设置或请求正文中)并且未fields指定no 。

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高层参数包括:

参数 描述

query

要解析的实际查询。请参阅下面的语法。

fields

要执行解析查询的字段。默认为index.query.default_field索引设置,而索引设置默认为*。 *提取映射中符合术语查询条件的所有字段,并过滤元数据字段。

default_operator

如果未指定显式运算符,则使用默认运算符。例如,使用默认运算符OR,查询 capital of Hungary将转换为capital OR of OR Hungary,并且使用默认运算符AND,将相同的查询转换为 capital AND of AND Hungary。默认值为OR

analyzer

在创建复合查询时,强制分析器用于分析查询的每个术语。

flags

标志指定simple_query_string要启用的功能。默认为ALL

analyze_wildcard

是否应自动分析前缀查询的条款。如果true尽最大努力分析前缀。但是,某些分析器无法仅根据术语的前缀提供有意义的结果。默认为false

lenient

如果设置为true将导致基于格式的失败(如向数字字段提供文本)将被忽略。

minimum_should_match

要返回的文档必须匹配的最小子句数。有关minimum_should_match选项的完整列表,请参阅 文档。

quote_field_suffix

附加到查询字符串的引用部分的字段的后缀。这允许使用具有不同分析链的字段进行精确匹配。看看这里为一个完整的例子。

auto_generate_synonyms_phrase_query

是否应为多项同义词自动生成短语查询。默认为true

all_fields

6.0.0 ] 在6.0.0中已弃用。设置default_field*代替执行上可以查询映射检测到的所有字段的查询。_all禁用该字段时将默认使用,并且未default_field指定no (在索引设置或请求正文中)并且未fields指定no 。

fuzzy_prefix_length

设置模糊查询的前缀长度。默认是0

fuzzy_max_expansions

控制模糊查询将扩展到的术语数。默认为50

fuzzy_transpositions

设置为false禁用模糊转置(ab→ ba)。默认是true

猜你喜欢

转载自my.oschina.net/u/4008390/blog/2874214