查询与过滤器

Jon*_*sie 191 elasticsearch

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

jav*_*nna 194

区别很简单:过滤器被缓存并且不会影响分数,因此比查询更快.看看这里也是.假设查询通常是用户键入的内容并且几乎不可预测,而过滤器可帮助用户缩小搜索结果范围,例如使用facet.

  • 是的,如果用户正在进行谷歌类型搜索,那么我会使用查询?如果他们从下拉列表中选择可能的值(例如,发票计数> 50)那么这将是一个过滤器? (18认同)
  • 是的,这是完全正确的.每当您需要通过某个指标限制整个文档集时,通常情况下过滤器是合适的.也许是按年龄,长度,大小等等 (4认同)
  • @activescott是的,这就是我要做的.您还可以设置过滤的别名,以便"用户别名"始终应用适当的过滤器.使管理更容易,不需要更改代码来更新查询,查询中的额外信息等. (4认同)

igo*_*igo 94

这是官方文件说的:

作为一般规则,应使用过滤器而不是查询:

  • 对于二进制是/否搜索
  • 查询确切的值

作为一般规则,应使用查询而不是过滤器:

  • 用于全文搜索
  • 结果取决于相关性得分


sam*_*sam 12

一个例子(自己尝试)

Say索引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!" }'
Run Code Online (Sandbox Code Playgroud)

查询:文档与查询的匹配程度

查询hello sam(使用关键字must)

curl localhost:9200/myindex/_search?pretty  -d '
{
  "query": { "bool": { "must": { "match": { "msg": "hello sam" }}}}
}'
Run Code Online (Sandbox Code Playgroud)

文档的"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!"
     }
   ...
Run Code Online (Sandbox Code Playgroud)

过滤:文档是否与查询匹配

过滤hello sam(使用关键字filter)

curl localhost:9200/myindex/_search?pretty  -d '
{
  "query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'
Run Code Online (Sandbox Code Playgroud)

包含hellosam返回的文档.文件没有评分.

"hits" : [
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world!"
     }
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world! I am Sam."
     }
   ...
Run Code Online (Sandbox Code Playgroud)

除非您需要全文搜索或评分,否则首选过滤器是因为Elasticsearch会自动缓存经常使用的过滤器,以加快性能.请参阅Elasticsearch:查询和过滤上下文.


Vin*_*han 11

几乎没有相同的添加.首先应用过滤器,然后对其结果处理查询.为了存储每个文档的二进制真/假匹配,使用了一个名为bitSet Array的东西.此BitSet数组位于内存中,这将在第二次查询过滤器时使用.这样,使用bitset数组数据结构,我们就可以利用缓存的结果.

还有一点需要注意,过滤器缓存仅在执行请求时创建,因此仅从第二次命中执行,我们实际上获得了缓存的优势.

但是你可以使用更温暖的API来超越它.当您使用过滤器针对较暖的API注册查询时,它将确保在新段生效时对其执行此操作.因此,我们将从第一次执行本身获得一致的速度.


Rah*_*ali 10

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

例如,假设你有一个像zomato这样的餐馆索引.现在您要搜索提供"披萨"的餐馆,这基本上是您的搜索关键字.

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

现在说你想要提供披萨的餐厅列表,并且评级为至少4.0.

因此,您需要做的是在查询中使用关键字"pizza",并将过滤器应用于4.0.

会发生什么情况是过滤器通常应用于通过查询索引获得的结果.


Emm*_*osu 9

Filters->此文件匹配吗?二进制是或否答案

Queries->此文件匹配吗?匹配程度如何?使用计分