结构化查询Query DSL

Query DSL——Query Domain Special Language

什么是结构化查询

结构化查询是一种灵活的、多表现形式的查询语言
ES在一个简单的JSON接口中用结构化查询来展现Lucene的绝大多数能力
使用结构化查询,需要传递query参数

GET /_search
{
  "query":{}
}

空查询-{}-在功能上等同于使用match_all查询子句,匹配所有的文档

GET /_search
{
  "query":{
        "match_all":{}
}
}

查询子句

叶查询子句:在特定的字段上查找特定的值。如:match、term、range子句,这些查询可以自己使用

{
  "query":{
        "match":{
                 "tweet":"elasticsearch"
        }
    }
}

合并多子句

合并多子句(复合查询子句):包含其他叶查询或复合查询子句,以合理的方式结合多条查询(如bool或dis_max查询),或者改变查询行为(比如constant_score查询)

{
  "query": {
    "bool": {
      "must": { "match": {"interests": "music"}},
      "must_not": {"match": {"about": "swimming"}}
    }
  }
}

查询和过滤

查询和过滤的区别

一条过滤语句会询问每个文档的字段值是否包含着特定值
查询语句会询问每个文档的字段值与特定值的匹配程度如何

查询语句会计算每个文档与查询语句的相关性,给出一个相关性评分_score,并且按照相关性对匹配到的文档进行排序

什么时候使用

原则上来说,使用查询语句做全文搜索或其他需要相关性评分的时候,剩下的全部用过滤语句

匹配所有的查询

match_all

match_all匹配所有文档

POST http://localhost:9200/megcorp/employee/_search
{
  "query": {
    "match_all": {}
  }
}

match_all的boost参数可以用来改变_score


结构化查询Query DSL_第1张图片

match_none

match_none是match_all查询相反的语句,不匹配文档

POST http://localhost:9200/megcorp/employee/_search
{
  "query": {
    "match_none": {}
  }
}

全文本搜索

在文本字段上执行全文搜索

match

match查询接受文本/数字/日期的查询,分析参数并组成查询条件

POST http://localhost:9200/megcorp/employee/_search
{
  "query": {
    "match": {
      "about": "collect"
    }
  }
}

默认的标准查询类型,分析文本并组成一个布尔查询。operator参数可以设置为or或者and来控制布尔子句(默认为or)。用于匹配的should子句(可选)的最小数量可以使用minimum_should_match参数来设置

模糊匹配
POST http://localhost:9200/megcorp/employee/_search
{
  "query": {
    "match": {
      "about": {
        "query": "go swimming",
        "operator": "and"
      }
    }
  }
}
零索引词查询

zero_terms_query,修改其值为no或all,来控制是否匹配所有文档或不匹配文档

POST http://localhost:9200/megcorp/employee/_search
{
  "query": {
    "match": {
      "about": {
        "query": "go swimming",
        "operator": "and",
        "zero_terms_query": "all"
      }
    }
  }
}

match_phrase

短语查询分析文本并创建短语查询,根据短语匹配查询,默认不执行分析查询

POST http://localhost:9200/megcorp/employee/_search
{
  "query": {
    "match_phrase": {
      "about": "go swimming"
    }
  }
}

可以设置analyzer参数来控制将要在文本上执行分词的分词器,默认是字段映射中定义的分词器

match_phrase_prefix

可以对文本最后一个字段进行前缀匹配

#匹配字段about值中前缀为I love to go的文档
POST http://localhost:9200/megcorp/employee/_search
{
  "query": {
    "match_phrase_prefix": {
      "about": "I love to go"
    }
  }
}

multi_match

在标准查询的基础上支持多字段查询

POST http://localhost:9200/megcorp/employee/_search
{
  "query": {
    "multi_match": {
      "query": "I love to go",
      "fields": [
        "about",
        "interests"
      ]
    }
  }
}

支持通配符

POST http://localhost:9200/megcorp/employee/_search
{
  "query": {
    "multi_match": {
      "query": "go",
      "fields": [
        "about", "*_name"
      ]
    }
  }
}

个别字段可以用caret(^)加权

#about字段比*_name重要3倍
POST http://localhost:9200/megcorp/employee/_search
{
  "query": {
    "multi_match": {
      "query": "go",
      "fields": [
        "about^3",
        "*_name"
      ]
    }
  }
}

common_terms

query_string

使用语法分析器来分析内容进行查询

#default_field:指定要查询的字段,默认是_all
#query:实际被解析的查询
POST http://localhost:9200/megcorp/employee/_search
{
  "query": {
    "query_string": {
      "default_field": "about",
      "query": "go AND to"
    }
  }
}

多字段执行query_string的意义在于可以使用OR子句扩展每个查询索引词

simple_query_string

系统提供了简化语法来进行查询,简化查询不会抛出异常,而且会丢弃查询无效部分

POST http://localhost:9200/megcorp/employee/_search
{
  "query": {
    "simple_query_string": {
      "query": "\"go\"",
      "analyzer": "snowball",
      "fields": [
        "about^5",
        "_all"
      ],
      "default_operator": "and"
    }
  }
}

字段查询

term

根据指定字段中包含的指定内容查询

POST http://localhost:9200/megcorp/employee/_search
{
  "query": {
    "term": {
      "interests": "music"
    }
  }
}

terms

多字段查询
过滤文档,文档字段匹配任何提供的索引词

POST http://localhost:9200/megcorp/employee/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "terms": {
          "interests": ["music","yoga"]
        }
      }
    }
  }
}

range

范围查询
根据指定字段包含的值(日期、数字或字符串)范围查找文档
Lucene查询类型取决于字段类型,对于字符串类型字段,使用TermRangeQuery;对于数字/日期类型字段,使用NumericRangeQuery

POST http://localhost:9200/megcorp/employee/_search
{
  "query": {
    "range": {
      "age": {
        "gt": 25
      }
    }
  }
}

范围查询接受的参数如下:

  • gte——大于或等于
  • gt——大于
  • lte——小于或等于
  • lt——小于
  • boost——设置查询的加权值,默认1.0

日期型字段范围
当在日期型字段上运行范围查询,可以使用名为“日期匹配”的分段来指定范围。

POST http://localhost:9200/megcorp/employee/_search
{
  "query": {
    "range": {
      "create_time": {
        "gte": "now-3d/d"
      }
    }
  }
}
  • +1h - add one hour
  • -1d - subtract one day
  • /d - round down to the nearest day


    结构化查询Query DSL_第2张图片
POST http://localhost:9200/megcorp/employee/_search
{
  "query": {
    "range": {
      "create_time": {
        "gte": "2019-05-07 00:00:00||/M"
      }
    }
  }
}

exists

查找指定字段包含任何非空值的文档

POST http://localhost:9200/megcorp/employee/_search
{
  "query": {
    "exists": {
      "field": "about"
    }
  }
}

匹配查询的文档:
{ "about": "jane" }
{ "about": "" }
{ "about": "-" }
{ "about": ["jane"] }
{ "about": ["jane", null ] }
不匹配查询的文档:
{ "about": null }
{ "about": [] }
{ "about": [null] }
{ "foo": "bar" }

prefix

前缀查询,匹配文档,字段包含拥有特定前缀的索引词(不分词)

POST http://localhost:9200/megcorp/employee/_search
{
  "query": {
    "prefix": {
      "interests": "mu"
    }
  }
}

wildcard

匹配文档,字段匹配通配符表达式(不分词)
通配符:*,匹配任意字符
通配符:?,匹配任何单个字符

{
  "query": {
    "wildcard": {
      "interests": "re*ing"
    }
  }
}

regexp

正则查询,字段匹配正则表达式

{
  "query": {
    "regexp": {
      "interests": "re.*ing"
    }
  }
}

fuzzy

模糊查询对字符串字段使用基于编辑距离的相似性,以及数字型和日期型字段的正负范围进行匹配

{
  "query": {
    "fuzzy": {
      "last_name": "Li"
    }
  }
}

高级用法,其中:
fuzziness:最大编辑距离,默认AUTO
prefix_length:不会被模糊化的最初字符数量,可以用来减少必须审查的索引词数量,默认是0
max_expansions:模糊查询将要扩展的索引词最大数量,默认是50

{
  "query": {
    "fuzzy": {
      "last_name": {
        "value": "Li",
        "boost": 1,
        "fuzziness": 2,
        "prefix_length": 0,
        "max_expansions": 100
      }
    }
  }
}

type

根据匹配提供的映射类型查询

{
  "query": {
    "type": {
      "value": "employee"
    }
  }
}

其中:value值为映射类型名

ids

获取只拥有提供的主键的文档
注意:查询使用_uid字段

{
  "query": {
    "ids": {
      "type": "employee",
      "values": [1,2,7]
    }
  }
}

其中:
type字段是可选的,也可以接受数组形式的值;如果没有指定类型,所有定义在索引映射中的类型都会被尝试。

复合查询

常数得分查询

https://www.elastic.co/guide/en/elasticsearch/reference/5.5/query-dsl-constant-score-query.html

布尔查询

获取匹配其他查询的布尔值的文档。基于一个或多个布尔子句的使用,每个子句都有一类事件:

  • must——必须出现在匹配文档中,并且会影响匹配得分
  • filter——必须出现在匹配文档中,匹配得分将会被忽略
  • should——应该出现在匹配文档中,在布尔查询中如果没有must或filter子句,文档必须匹配一个或多个should子句。
  • must_not——必须不出现在匹配文档中

tips
如果查询用于过滤内容而且有should子句,那么至少有一个should子句被匹配

{
  "query": {
    "bool": {
      "must": {
        "term": {
          "about": "to"
        }
      },
      "filter": {
        "term": {
          "type": "info"
        }
      },
      "must_not": {
        "range": {
          "age": {
            "gte": 40,
            "lt": 50
          }
        }
      },
      "should": {
        "term": {
          "about": "build"
        }
      },
      "minimum_should_match": 1,
      "boost": 1
    }
  }
}

你可能感兴趣的:(结构化查询Query DSL)