我什么时候应该使用查询或过滤器或两者的某种组合都看不到任何描述。它们之间有什么区别?谁能解释一下?
我什么时候应该使用查询或过滤器或两者的某种组合都看不到任何描述。它们之间有什么区别?谁能解释一下?
Answers:
区别很简单:过滤器被缓存并且不影响得分,因此比查询要快。也在这里看看。假设查询通常是用户输入的内容,并且几乎是不可预测的,而过滤器则可以帮助用户缩小搜索结果的范围,例如使用构面。
这是官方文件说的:
通常,应使用过滤器代替查询:
- 用于二进制是/否搜索
- 用于查询精确值
通常,应使用查询代替过滤器:
- 用于全文搜索
- 结果取决于相关性分数
说索引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."
}
...
除此以外,几乎没有其他产品。首先应用过滤器,然后对查询结果进行处理。为了存储每个文档的二进制真假匹配,使用了一个称为bitSet Array的东西。该BitSet数组在内存中,将从第二次查询过滤器开始使用。这样,使用位集数组数据结构,我们可以利用缓存的结果。
这里需要注意的一点是,仅在执行请求时才创建过滤器缓存,因此仅从第二次命中开始,我们实际上就获得了缓存的优势。
但是,您可以使用更暖和的API来解决这个问题。当您针对较暖的API使用过滤器注册查询时,只要有新查询,它将确保针对新细分执行查询。因此,我们将从第一次执行本身获得一致的速度。
基本上,当您要对带有评分的文档执行搜索时,将使用查询。过滤器用于缩小通过查询获得的结果集。过滤器是布尔值。
例如,假设您有一家餐厅索引,例如zomato。现在,您要搜索提供“比萨”的餐厅,这基本上就是您的搜索关键字。
因此,您将使用查询来查找所有包含“ pizza”的文档,并将获得一些结果。
现在说,您想要一家供应比萨饼且评分至少为4.0的餐厅清单。
因此,您需要做的就是在查询中使用关键字“ pizza”,然后将过滤器的评级应用为4.0。
发生的情况是通常将过滤器应用于通过查询索引获得的结果。
Filters
->该文件匹配吗?二进制是或否答案
Queries
->该文件匹配吗?匹配程度如何?使用计分
从Elasticsearch版本2开始,过滤器和查询已合并,并且任何查询子句都可以用作过滤器或查询(取决于上下文)。与版本1一样,过滤器会缓存,如果计分无关紧要,则应使用过滤器。