六:es 的Query DSL

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

官网地址

1. Query and filter context 查询/过滤

GET /_search
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"        }}, 
        { "match": { "content": "Elasticsearch" }}  
      ],
      "filter": [ 
        { "term":  { "status": "published" }}, 
        { "range": { "publish_date": { "gte": "2015-01-01" }}} 
      ]
    }
  }
}
term和range子句在过滤器上下文中使用。它们将过滤出不匹配的文档,但不会影响匹配文档的分数。

2.Match All Query 匹配全部

最简单的查询,它匹配所有文档,并为它们提供_score 1.0
GET /_search
{
    "query": {
        "match_all": {}
    }
}

3.Full text queries 全文查询

3.1 Match Query 匹配查询

GET /_search
{
    "query": {
        "match" : {
            "message" : "this is a test"
        }
    }
}

3.2 Match Phrase Query 短语查询

match_phrase查询将分析文本,并从分析的文本中创建短语查询。例如:
GET /_search
{
    "query": {
        "match_phrase" : {
            "message" : "this is a test"
        }
    }
}

3.3  Match Phrase Prefix Query 词组前缀查询

match_phrase_prefix与match_phrase相同,只是它允许在文本的最后一项上进行前缀匹配。例如:
GET /_search
{
    "query": {
        "match_phrase_prefix" : {
            "message" : "quick brown f"
        }
    }
}

它接受与短语类型相同的参数。此外,它还接受max_expansions参数(默认值为50),该参数可以控制将最后一项扩展到多少个后缀。强烈建议将其设置为可接受的值,以控制查询的执行时间。例如:
GET /_search
{
    "query": {
        "match_phrase_prefix" : {
            "message" : {
                "query" : "quick brown f",
                "max_expansions" : 10
            }
        }
    }
}

3.4 Multi Match Query 多字段查询

multi_match 查询为能在多个字段上反复执行相同查询提供了一种便捷方式。

multi_match 多匹配查询的类型有多种,其中的三种恰巧与 了解我们的数据 中介绍的三个场景对应,即: best_fields 、 most_fields 和 cross_fields (最佳字段、多数字段、跨字段)。

默认情况下,查询的类型是 best_fields ,这表示它会为每个字段生成一个 match 查询,然后将它们组合到 dis_max 查询的内部,如下:
multi_match查询以match查询为基础,以允许多字段查询:

GET /_search
{
  "query": {
    "multi_match" : {
      "query":    "this is a test", 
      "fields": [ "subject", "message" ]  ---要查询的字段。
    }
  }
}
----------------------------------------------------
字段可以用通配符指定,例如:
GET /_search
{
  "query": {
    "multi_match" : {
      "query":    "Will Smith",
      "fields": [ "title", "*_name" ] 
    }
  }
}
-----------------------------------------------------
可以使用插入号(^)表示法增强各个字段:
GET /_search
{
  "query": {
    "multi_match" : {
      "query" : "this is a test",
      "fields" : [ "subject^3", "message" ] 
    }
  }
}
主题字段的重要性是消息字段的三倍。

3.5 Common Terms Query 常用术语查询

在此示例中,文档频率大于0.1%的单词(例如“ this”和“ is”)将被视为通用术语。

GET /_search
{
    "query": {
        "common": {
            "body": {
                "query": "this is bonsai cool",
                "cutoff_frequency": 0.001
            }
        }
    }
}

3.6 Query String Query 字符串查询

query_string查询可解析输入并在运算符周围拆分文本。每个文本部分彼此独立地进行分析。例如以下查询:
GET /_search
{
    "query": {
        "query_string" : {
            "default_field" : "content",
            "query" : "(new york city) OR (big apple)" 
        }
    }
}
将被分为纽约市和大苹果,然后通过为该领域配置的分析仪对每个部分进行独立分析。

4.Term level queries 词级查询

全文查询将在执行之前分析查询字符串,而术语级查询将对存储在倒排索引中的确切术语进行操作,并在仅对具有normalizer属性的关键字字段执行之前对术语进行规格化。 
这些查询通常用于结构化数据,例如数字,日期和枚举,而不是全文字段。或者,它们允许您在分析过程之前进行低级查询。

4.1Term Query 字词查询

术语查询查找包含倒排索引中指定的确切术语的文档。例如:
POST _search
{
  "query": {
    "term" : { "user" : "Kimchy" } 
  }
}
查找在用户字段的倒排索引中包含确切术语Kimchy的文档。
-----------------------------------------------
PUT my_index
{
  "mappings": {
    "_doc": {
      "properties": {
        "full_text": {
          "type":  "text" 
        },
        "exact_value": {
          "type":  "keyword" 
        }
      }
    }
  }
}

PUT my_index/_doc/1
{
  "full_text":   "Quick Foxes!", 
  "exact_value": "Quick Foxes!"  
}
full_text字段为文本类型,将进行分析。 True_Value字段属于关键字类型,将不会进行分析。

4.2 Terms Query 多字段查询

GET /_search
{
    "query": {
        "terms" : { "user" : ["kimchy", "elasticsearch"]}
    }
}

4.3  Range Query 范围查询

GET _search
{
    "query": {
        "range" : {
            "age" : {
                "gte" : 10,
                "lte" : 20,
                "boost" : 2.0
            }
        }
    }
}

gte

大于或等于

gt

比...更棒

lte

小于或等于

lt

少于

boost

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

4.4 Exists Query 非空查询

返回原始字段中至少具有一个非null的文档:
GET /_search
{
    "query": {
        "exists" : { "field" : "user" }
    }
}
匹配:
{ "user": "jane" }
{ "user": "" } 
{ "user": "-" } 
{ "user": ["jane"] }
不匹配:
{ "user": null }
{ "user": [] } 
{ "user": [null] } 

4.5 Prefix Query 前缀查询

匹配具有包含带有指定前缀(未分析)的术语的字段的文档。前缀查询映射到Lucene PrefixQuery。
以下匹配文档,其中用户字段包含以ki开头的术语:
GET /_search
{ "query": {
    "prefix" : { "user" : "ki" }
  }
}

4.6 Wildcard Query 通配符查询

支持的通配符是*,它匹配任何字符序列(包括空字符),以及?,它匹配任何单个字符。
请注意,此查询的速度可能很慢,因为它需要迭代许多项。
为了防止极慢的通配符查询,通配符术语不应以通配符*或?之一开头
GET /_search
{
    "query": {
        "wildcard" : { "user" : "ki*y" }
    }
}

4.7 Regexp Query正则表达式查询

注意:regexp查询的性能在很大程度上取决于所选的正则表达式
匹配. *之类的内容非常慢,而且无法使用环视正则表达式。如果可能,应在正则表达式开始之前尝试使用长前缀。
诸如.*?+之类的通配符匹配器通常会降低性能
GET /_search
{
    "query": {
        "regexp":{
            "name.first": "s.*y"
        }
    }
}

4.8 Fuzzy Query 模糊查询

模糊查询生成在模糊性指定的最大编辑距离内的匹配术语,然后检查术语字典以找出索引中实际存在的那些生成术语。最终查询最多使用max_expansions个匹配词。
GET /_search
{
    "query": {
       "fuzzy" : { "user" : "ki" }
    }
}

5. Compound queries 复合查询

5.1 Bool Query bool查询

与文档匹配的查询,这些文档与其他查询的布尔组合匹配。
布尔查询映射到Lucene BooleanQuery。它是使用一个或多个布尔子句构建的,每个子句都具有类型的出现。
发生类型为:
POST _search
{
  "query": {
    "bool" : {
      "must" : {
        "term" : { "user" : "kimchy" }
      },
      "filter": {
        "term" : { "tag" : "tech" }
      },
      "must_not" : {
        "range" : {
          "age" : { "gte" : 10, "lte" : 20 }
        }
      },
      "should" : [
        { "term" : { "tag" : "wow" } },
        { "term" : { "tag" : "elasticsearch" } }
      ],
      "minimum_should_match" : 1,
      "boost" : 1.0
    }
  }
}

 

must

子句(查询)必须出现在匹配的文档中,并将有助于得分。

filter

子句(查询)必须出现在匹配的文档中。但是不像 must查询的分数将被忽略。Filter子句在filter上下文中执行,这意味着计分被忽略,并且子句被考虑用于缓存。

should

子句(查询)应出现在匹配的文档中。如果 bool查询在查询上下文中并且具有mustorfilter子句,那么bool即使没有 should查询匹配,文档也将与查询匹配。在这种情况下,这些子句仅用于影响得分。如果bool查询是一个过滤器上下文 或既没有mustfilter则至少一个should查询必须的文件为它匹配匹配bool查询。可以通过设置minimum_should_match参数来明确控制此行为 。

must_not

子句(查询)不得出现在匹配的文档中。子句在过滤器上下文中执行,这意味着计分被忽略,并且子句被视为用于缓存。由于忽略计分,0因此将返回所有文档的分数。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值