Elasticsearch Query DSL 的基本查询体

Published:

通用查询结构

查询语句的经典结构:

{
    QUERY_NAME: {
        ARGUMENT: VALUE,
        ARGUMENT: VALUE,...
    }
}

如果针对某个字段,那么结构为:

{
    QUERY_NAME: {
        FIELD_NAME: {
            ARGUMENT: VALUE,
            ARGUMENT: VALUE,...
        }
    }
}

空查询

该查询方式会返回所有文档,所有文档的 _score 分值均为1。

  • 快捷查询

      {}
    
  • 通用查询

      {
          "query": {
              "match_all": {}
          }
      }
    

全文查询 (Full text queries)

该使用elasticsearch内部的analyzer分析后,进行查询,并按照匹配度得出相应的相关性 _score 值,排序后返回。

  • match 查询:
    • 查询字段 message 中涉及到 rock 或 climbing 的文档。

      {
          "query": {
              "match" : {
                  "message" : "rock climbing"
              }
          }
      }
      
    • 为 match 查询提供更多参数

      {
          "query": {
              "match" : {
                  "message" : {
                      "query" : "rock climbing",
                      "operator" : "and",
                      "minimum_should_match": "75%"
                  }
              }
          }
      }
      
  • match_phrase 查询,将短语作为一个整体查询

      {
          "match_phrase" : {
              "about" : "rock climbing"
          }
      }
    
  • multi_match 查询,在多个指定字段查询

      {
          "multi_match": {
              "query":    "full text search",
              "fields":   [ "title", "body" ]
          }
      }
    

精确查询 (Term level queries)

与先分析检索的全文查询不同,该查询方式进行精确匹配并返回查询结果。

  • range 范围查询

      {
          "range": {
              "age": {
                  "gte":  20,
                  "lt":   30
              }
          }
      }
    
  • term 准确查询
    • 必须匹配
      {
          "term": {
              "age": 26
          }
      }
      
    • 出现一个即可:
      {
          "terms": {
              "tag": [
                  "search", "full_text", "nosql"
              ]
          }
      }
      
  • exists 存在查询,查找存在某个字段的文档

      {
          "exists":   {
              "field":    "title"
          }
      }
    
  • missing 不存在查询,查询不存在某字段的文档

      {
          "missing":   {
              "field":    "title"
          }
      }