- ES 的 DSL 通常由两种子句组成:
- 针对特定字段匹配特定值的 Leaf query clauses,例如 match, match_all, term 或者 range 查询
- 组合了 Leaf query clauses 或其它复合查询的 Compound query clauses (复合查询),例如 bool 或者 dis_max 查询
上述两种查询在 匹配和过滤(query context or filter context)两种场景中的表现并不一样。
- 匹配和过滤(query context or filter context)
- Query context 除了匹配被检索词,还要计算一个匹配度值。query context 在 query clauses 被赋值给一个 query 参数时生效。
- Filter context 过滤出符合检索条件的文档,并不计算匹配度。常用的 filter 的结果会被 ES 缓存以提高查询效率。filter context 在 query clauses 被赋值给一个 filter 参数时生效。
curl -X GET "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
"query": { /* query 参数,表明这是 query context */
"bool": { /* 组合查询 */
"must": [
{ "match": { "title": "Search" }}, /* 构成组合查询的简单查询 */
{ "match": { "content": "Elasticsearch" }}
],
"filter": [ /* filter 参数,表明这是 filter context */
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
'
- 常见的 Leaf query clauses 查询子句
- “match_all”:{} 匹配所有文档
- “match_none”:{} 不匹配任何文档
- “match”:{“some_filed”:“some text”},match 子句出现在 bool 复合查询下,可以支持 must, must_not,should 等。在 match 查询中,检索词将按照对应字段(“some_field”)的分词方式进行分词后匹配
- “query_string":{“default_field”: “content”, “query”:“this AND that OR thus”}, 该查询将检索词以 AND 或 OR 运算符进行分割,每部分作为一个检索词进行分词匹配,然后将结果按照 AND 或 OR 的运算进行组合
- “term”:{“some_field”:“some text”},检索词不会被分词,会查找 “some_field” 字段包含 “some_text” 索引的文档。
- “terms”:{“some_field”:[“some text 1”, “some text 2”]},检索词之间是或的关系,查找匹配任意检索词的文档
- “range”:{“some_numeric_field”:{“gte”: 10, “lte”:20}},范围过滤,gte 不小于,gt 严格大于,lte 不大于,lt 严格小于
- “wildcard”:{“some_field”: “so*te?t”},检索词不分词,通配符匹配,效率比较低
一般地,查询 text 类型的字段时,应使用 match 类型的查询子句;而 term 查询子句常用来查询 keyword 类型的字段(https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html)。
- Bool Query
bool 查询是常见的组合查询,它由一个或多个布尔查询子句组成,布尔查询子句的常见类型有如 must, filter, should 或 must_not 等。