我看不到何时应该使用查询或过滤器或两者的某种组合的任何描述。他们之间有什么区别?有人可以解释一下吗?
答案 0 :(得分:183)
区别很简单:过滤器被缓存,不会影响分数,因此比查询更快。看看here。假设查询通常是用户输入的内容,而且非常难以预测,而过滤器可以帮助用户缩小搜索结果范围,例如使用构面。
答案 1 :(得分:89)
这是官方文件所说的:
作为一般规则,应使用过滤器而不是查询:
- 用于二进制是/否搜索
- 有关确切值的查询
作为一般规则,应使用查询而不是过滤器:
- 进行全文搜索
- 其中结果取决于相关性得分
答案 2 :(得分:11)
几乎没有添加相同的内容。 首先应用过滤器,然后对其结果处理查询。为了存储每个文档的二进制真/假匹配,使用了一个名为bitSet Array的东西。 此BitSet数组位于内存中,这将在第二次查询过滤器时使用。这样,使用bitset数组数据结构,我们就可以利用缓存的结果。
此处需要注意的另一点是,过滤器缓存仅在执行请求时创建,因此仅从第二次命中执行,我们实际上获得了缓存的优势。
但是你可以使用warmer API来超越这个。当您使用过滤器针对较暖的API注册查询时,它将确保在新段生效时对其执行此操作。因此,我们将从第一次执行本身获得一致的速度。
答案 3 :(得分:11)
假设索引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
(使用关键字filter
)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."
}
...
答案 4 :(得分:10)
基本上,当您想要通过评分对文档执行搜索时,会使用查询。 过滤器用于缩小使用查询获得的结果集。过滤器是布尔值。
例如,假设你有一个类似于zomato的餐馆索引。 现在,您要搜索提供' pizza' 的餐馆,这基本上是您的搜索关键字。
因此,您将使用查询查找包含" pizza" 的所有文档,并获得一些结果。
现在说你想要提供披萨的餐厅名单,并且评级为至少4.0。
因此,您需要在查询中使用关键字" pizza" ,并将评级过滤器应用为4.0。
过滤器通常应用于通过查询索引获得的结果。
答案 5 :(得分:5)
Filters
- >这份文件符合吗?二进制是或否回答
Queries
- >这份文件符合吗?它的匹配程度如何?使用得分
答案 6 :(得分:0)
查询:计算分数;因此他们可以返回按相关性排序的结果。 过滤器:不计算得分,而是使其更快,更容易缓存。