我看不到任何关于何时应该使用查询或过滤器或两者的某种组合的描述。它们之间的区别是什么?有人能解释一下吗?
当前回答
一个例子(你自己试试)
说索引myindex包含三个文档:
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hello world!" }'
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hello world! I am Sam." }'
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hi Stack Overflow!" }'
查询:文档与查询匹配的程度
查询hello sam(使用关键字must)
curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "must": { "match": { "msg": "hello sam" }}}}
}'
文档“Hello world!”I am Sam.”的得分比“Hello world!”高,因为前者与查询中的两个单词都匹配。对文档进行评分。
"hits" : [
...
"_score" : 0.74487394,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
"_score" : 0.22108285,
"_source" : {
"name" : "Hello world!"
}
...
筛选:文档是否与查询匹配
过滤hello sam(使用关键字过滤器)
curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'
返回包含hello或sam的文档。文档不记分。
"hits" : [
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world!"
}
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
除非您需要全文搜索或评分,否则首选过滤器,因为Elasticsearch将自动缓存频繁使用的过滤器,以提高性能。参见Elasticsearch:查询和过滤上下文。
其他回答
查询:计算分数;因此,它们能够返回按相关性排序的结果。 过滤器:不计算分数,使他们更快,更容易缓存。
一个例子(你自己试试)
说索引myindex包含三个文档:
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hello world!" }'
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hello world! I am Sam." }'
curl -XPOST localhost:9200/myindex/mytype -d '{ "msg": "Hi Stack Overflow!" }'
查询:文档与查询匹配的程度
查询hello sam(使用关键字must)
curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "must": { "match": { "msg": "hello sam" }}}}
}'
文档“Hello world!”I am Sam.”的得分比“Hello world!”高,因为前者与查询中的两个单词都匹配。对文档进行评分。
"hits" : [
...
"_score" : 0.74487394,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
"_score" : 0.22108285,
"_source" : {
"name" : "Hello world!"
}
...
筛选:文档是否与查询匹配
过滤hello sam(使用关键字过滤器)
curl localhost:9200/myindex/_search?pretty -d '
{
"query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'
返回包含hello或sam的文档。文档不记分。
"hits" : [
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world!"
}
...
"_score" : 0.0,
"_source" : {
"name" : "Hello world! I am Sam."
}
...
除非您需要全文搜索或评分,否则首选过滤器,因为Elasticsearch将自动缓存频繁使用的过滤器,以提高性能。参见Elasticsearch:查询和过滤上下文。
区别很简单:过滤器被缓存,不影响分数,因此比查询快。看看这里。假设一个查询通常是用户键入的并且几乎不可预测的,而过滤器帮助用户缩小搜索结果,例如使用facet。
过滤器->这个文档匹配吗?是或否的二元答案
查询->这个文档匹配吗?匹配度如何?使用得分
官方文件是这么说的:
作为一般规则,应该使用过滤器而不是查询: 用于二进制是/否搜索 用于查询确切的值
作为一般规则,应该使用查询而不是过滤器: 全文检索 结果取决于相关性评分
推荐文章
- ElasticSearch初学者指南
- 显示所有Elasticsearch聚合结果/桶,而不仅仅是10个
- Elasticsearch:最大虚拟内存区域。Max_map_count[65530]太低,至少增加到[262144]
- 查询与过滤器
- Elasticsearch中MUST和SHOULD bool查询的区别
- 将must和OR结合起来查询
- Elasticsearch error: cluster_block_exception [FORBIDDEN/12/index read-only / allow delete (api)], flood stage disk watermark exceeded .日志含义
- 列出ElasticSearch服务器上的所有索引?
- Elasticsearch中的碎片和副本
- ElasticSearch, Sphinx, Lucene, Solr, Xapian。哪种适合哪种用途?
- 从ElasticSearch中删除数据
- 使elasticsearch只返回某些字段?
- Elasticsearch查询返回所有记录
- Solr vs. ElasticSearch