Elasticsearch支持过滤查询,如term、range、match等,同时也可以使用filter来实现过滤查询的。
语法结构:
{
"query": {
"bool": {
"filter": {
"term": {
"age": 20
}
}
}
}
}
POST /study/_search
# 请求数据
{
"query": {
"bool": {
"filter": {
"term": {
"age": 20
}
}
}
}
}
# 响应数据
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 2,
"successful": 2,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.0,
"hits": [
{
"_index": "study",
"_type": "_doc",
"_id": "SHjOVIIBpyNh4YQ4CVSN",
"_score": 0.0,
"_source": {
"name": "张三",
"age": 20,
"mail": "111@qq.com",
"hobby": "羽毛球、乒乓球、足球"
}
}
]
}
}
查询和过滤的对比:
- 一条过滤语句会询问每个文档的字段值是否包含着特定值。
- 查询语句会询问每个文档的字段值与特定值的匹配程度如何。
一条查询语句会计算每个文档与查询语句的相关性,会给出一个相关性评分 _score,并且按照相关性对匹配到的文档进行排序。 这种评分方式非常适用于一个没有完全配置结果的全文本搜索。
- 一个简单的文档列表,快速匹配运算并存入内存是十分方便的, 每个文档仅需要1个字节。这些缓存的过滤结果集与后续请求的结合使用是非常高效的。
- 查询语句不仅要查找相匹配的文档,还需要计算每个文档的相关性,所以一般来说查询语句要比 过滤语句更耗时,并且查询结果也不可缓存。
建议: 做精确匹配搜索时,最好用过滤语句,因为过滤语句可以缓存数据。