ES Term Query
ES 查询使用Query DSL定义查询条件,基本查询结构如下:
{
“query” :
{
“Term 查询” | 文本查询| 符合查询: {}
}
“关联查询”:query object;
}
如果是关联查询,则在关联查询下内嵌普通查询结构
Query 和 Filter:
Query 表示文档和Query 条件的匹配分数,在_score 元数据中记录匹配值
Filter 元素表示过滤,结果只有是或者否。Filter的表现形式为filter或must_not参数
GET /_search { "query": { "bool": { "must": [ { "match": { "title": "Search" }}, { "match": { "content": "Elasticsearch" }} ], "filter": [ { "term": { "status": "published" }}, { "range": { "publish_date": { "gte": "2015-01-01" }}} ] } } } |
Term-level 查询(精确查询)
针对结构化数据的精确查询。和全文查询的区别是 terms 查询不进行文本分析,而是精确匹配查询术语。
Exists Query
文档域是否存在,以下情况域不存在:
- 域为null或[]
- 域的配置index:false
- 域值的长度超过了mapping中ignore_above的设定值
- 域值格式错误, 并且mapping中设置了ignore_malformed
GET /_search { "query": { "bool": { "must_not": { "exists": { "field": "user.id" } } } } } |
Fuzzy Query 相似查询(非通配符模糊查询)
相似查询,包括某个字符不同, 缺失或多出一个字符,两个字符位置颠倒。
GET /_search { "query": { "fuzzy": { "user.id": { "value": "ki" } } } } |
IDS
多个ID查询
GET /_search { "query": { "ids" : { "values" : ["1", "4", "100"] } } } |
Prfix
返回域值包含指定前缀。
GET /_search { "query": { "prefix": { "user.id": { "value": "ki" } } } } |
Range Query
范围查找
GET /_search { "query": { "range": { "timestamp": { "gte": "now-1d/d", "lt": "now/d" } } } } | GET /_search { "query": { "range": { "timestamp": { "time_zone": "+01:00", "gte": "2020-01-01T00:00:00", "lte": "now" } } } } |
Regexp
正则匹配
GET /_search { "query": { "regexp": { "user.id": { "value": "k.*y", "flags": "ALL", "case_insensitive": true, "max_determinized_states": 10000, "rewrite": "constant_score" } } } } |
Term query
精确匹配域值,可以和文本搜索match对比理解。
GET my-index-000001/_search?pretty { "query": { "term": { "full_text": "Quick Brown Foxes!" } } } |
Terms Query
域值匹配其中的多个给定值中的一个或多个。
GET /_search { "query": { "terms": { "user.id": [ "kimchy", "elkbee" ], "boost": 1.0 } } } | GET my-index-000001/_search?pretty { "query": { "terms": { "color" : { "index" : "my-index-000001", "id" : "2", "path" : "color" } } } } |
Terms set query
类似于terms查询, 指定匹配的数量。
PUT /job-candidates/_doc/1?refresh { "name": "Jane Smith", "programming_languages": [ "c++", "java" ], "required_matches": 2 } | PUT /job-candidates/_doc/2?refresh { "name": "Jason Response", "programming_languages": [ "java", "php" ], "required_matches": 2 } | GET /job-candidates/_search { "query": { "terms_set": { "programming_languages": { "terms": [ "c++", "java", "php" ], "minimum_should_match_field": "required_matches" } } } } |
Wildcard query(通配符查询)
GET /_search { "query": { "wildcard": { "user.id": { "value": "ki*y", "boost": 1.0, "rewrite": "constant_score" } } } } |
Rewrite:ES用户影响如何执行fuzzy,prefix,query_string, regexp,wildcard等Apache Lucene无法支持的查询如何实际执行。推荐constant_score, constant_score_boolean, 或 top_terms_boost_N。
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/query-dsl-multi-term-rewrite.html