ElasticSearch 查询语言 DSL

2019-11-23  本文已影响0人  癞痢头

在 elasticSearch 中,共有两种查询:1. url 搜索 2. DSL查询语言

这篇文章主要来说明 DSL 查询的原理和语法。

DSL 搜索查询

Elasticsearch提供了基于JSON的完整查询DSL(Domain Specific Language[特定于域的语言])来定义查询。将查询DSL视为查询的AST(Abstract Syntax Tree[抽象语法树]。

它由两种子句组成:

相同的查询条件的结果依赖于他们的上下文环境,elasticSearch 的DSL 主要提供两种上下文环境 : query[查询上下文] 和 filter[过滤器上下文]。

filter 和 query 上下文

注意了, DLS关键是要搞清楚 filter 和 query 的差别

默认情况下, ElaticSearch通过相关性得分(查询和文档的匹配程度)来对结果排序。
相关性得分是一个正浮点数,在_search API 中以 _score 字段返回。_score 值越大,相关性越高。
每种字段以不同的方式计算_score, _score的计算也根据查询条件运行于 filter 或者 query 而不同。

在 query 上下文中, 一个查询条件主要解决的问题是: 条件和文档的匹配程度有多高。除了解决匹配度的问题, 还会计算一个相关性程度,作为元数据 _score 返回。

在 filter 上下文中, 一个查询条件主要解决的问题是: 条件和文档是否匹配。通常结果是匹配和不匹配,这主要用于过滤结构化数据。

一条过滤语句会询问每个文档的字段值是否包含着特定值:

  1. status 字段中是为 "published" ?
  2. created 的日期范围是否在 2013 到 2014 ?

不论是把查询条件传递给 bool下的 filter 或者 must 参数等, 还是在 聚合中的filter, filter都会起作用

查询语句不仅要查找相匹配的文档,还需要计算每个文档的相关性,所以一般来说查询语句要比 过滤语句更耗时,并且查询结果也不可缓存。

幸亏有了倒排索引,一个只匹配少量文档的简单查询语句在百万级文档中的查询效率会与一条经过缓存 的过滤语句旗鼓相当,甚至略占上风。 但是一般情况下,一条经过缓存的过滤查询要远胜一条查询语句的执行效率。

过滤语句的目的就是缩小匹配的文档结果集,所以需要仔细检查过滤条件。

复合查询

全文搜索查询

    POST _search
{
  "query": {
    "intervals" : {
      "my_text" : {
        "all_of" : {
          "ordered" : true,
          "intervals" : [
            {
              "match" : {
                "query" : "my favorite food",
                "max_gaps" : 0,
                "ordered" : true
              }
            },
            {
              "any_of" : {
                "intervals" : [
                  { "match" : { "query" : "hot water" } },
                  { "match" : { "query" : "cold porridge" } }
                ]
              }
            }
          ]
        }
      }
    }
  }
}
    {
        "query":{
            "match": {
                <field_name>: {     // field_name 是match 的 top-level 参数
                    "query" : ""     // 查询内容
                    "analyzer":   "" // 分词器
                    "operator" "OR[默认], AND" //用于解释 query中的bool逻辑
                    ..... 
                }
            }
        }
    }

-match phrase prefix query

短语前缀查询, 查询文本的最后一项是单词的前缀

```
    GET /_search
    {
        "query": {
            "match_phrase_prefix" : {
                "message" : {
                    "query" : "quick brown f"
                }
            }
        }
    }

```

GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "Will Smith",
      "type":       "best_fields",
      "fields":     [ "first_name", "last_name" ],      // field 可以是很多个
      "operator":   "and" 
    }
  }
}


term-level 查询

查询结构化数据中的精确值, term-level 不对搜索文本进行分析, 它匹配精确的值。

        GET /_search
    {
        "query": {
            "ids" : {
                "values" : ["1", "4", "100"]
            }
        }
    }
GET /_search
{
    "query": {
        "prefix": {
            "user": {
                "value": "ki"
            }
        }
    }
}


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


上一篇 下一篇

猜你喜欢

热点阅读