查询与过滤器

时间:2013-01-30 03:03:49

标签: elasticsearch

我看不到何时应该使用查询或过滤器或两者的某种组合的任何描述。他们之间有什么区别?有人可以解释一下吗?

7 个答案:

答案 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" }}}}
}'

返回包含hellosam的文档。 文档未评分

"hits" : [
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world!"
     }
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world! I am Sam."
     }
   ...

除非您需要全文搜索或评分,否则首选过滤器是因为Elasticsearch会自动缓存经常使用的过滤器,以加快性能。见Elasticsearch: Query and filter context.

答案 4 :(得分:10)

基本上,当您想要通过评分对文档执行搜索时,会使用查询。 过滤器用于缩小使用查询获得的结果集。过滤器是布尔值。

例如,假设你有一个类似于zomato的餐馆索引。 现在,您要搜索提供' pizza' 的餐馆,这基本上是您的搜索关键字。

因此,您将使用查询查找包含" pizza" 的所有文档,并获得一些结果。

现在说你想要提供披萨的餐厅名单,并且评级为至少4.0。

因此,您需要在查询中使用关键字" pizza" ,并将评级过滤器应用为4.0。

过滤器通常应用于通过查询索引获得的结果。

答案 5 :(得分:5)

Filters - >这份文件符合吗?二进制是或否回答

Queries - >这份文件符合吗?它的匹配程度如何?使用得分

答案 6 :(得分:0)

查询:计算分数;因此他们可以返回按相关性排序的结果。 过滤器:不计算得分,而是使其更快,更容易缓存。