elasticsearch 查询与过滤器,elasticsearch,elasticsearch" /> elasticsearch 查询与过滤器,elasticsearch,elasticsearch" />

elasticsearch 查询与过滤器

elasticsearch 查询与过滤器,elasticsearch,elasticsearch,我看不到任何关于何时应该使用查询、过滤器或两者结合的描述。他们之间有什么区别?有人能解释一下吗?区别很简单:过滤器是缓存的,不会影响分数,因此比查询更快。也看看。假设一个查询通常是用户键入的,并且非常不可预测,而过滤器帮助用户缩小搜索结果的范围,例如使用facet。这是官方文档所说的: 作为一般规则,应使用过滤器而不是查询: 对于二进制是/否搜索 用于查询精确值 一般来说,应使用查询而不是筛选器: 用于全文搜索 其中结果取决于相关性得分 基本上,当您希望对文档执行带有评分的搜索时,会使

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

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

这是官方文档所说的:

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

  • 对于二进制是/否搜索
  • 用于查询精确值

一般来说,应使用查询而不是筛选器:

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

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

例如,假设您有一个类似zomato的餐厅索引。 现在,您需要搜索提供“比萨饼”的餐厅,这基本上是您的搜索关键字

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

比如说,现在你想要一份提供比萨饼且评级至少为4.0的餐厅名单

因此,您需要做的是在查询中使用关键字“pizza”,并将筛选应用于评级为4.0


所发生的情况是,过滤器通常应用于通过查询索引获得的结果。

除此之外,几乎没有其他内容。 首先应用过滤器,然后对查询结果进行处理。为了存储每个文档的二进制真/假匹配,使用了称为位集数组的东西。 此位集数组位于内存中,将在第二次查询筛选器时使用。这样,使用位集数组数据结构,我们就能够利用缓存的结果

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

但是你可以用,来克服这个。当您针对一个更热的API使用过滤器注册查询时,它将确保在新段上线时针对新段执行该查询。因此,我们将从第一次执行本身获得一致的速度。

一个示例(自己尝试) 假设索引
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
) 文档
“你好,世界!我是山姆。”
的得分高于
“你好,世界!”
,因为前者与查询中的两个词都匹配对文档进行评分。

"hits" : [
   ...
     "_score" : 0.74487394,
     "_source" : {
       "name" : "Hello world! I am Sam."
     }
   ...
     "_score" : 0.22108285,
     "_source" : {
       "name" : "Hello world!"
     }
   ...
筛选器:文档是否与查询匹配 过滤器
hello sam
(使用关键字
Filter
) 返回包含
hello
sam
的文档文档未评分

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


除非您需要全文搜索或评分,否则首选过滤器,因为经常使用的过滤器将由Elasticsearch自动缓存,以提高性能。请参见过滤器此文档是否匹配?二进制是或否回答


查询
->此文档是否匹配?它配得怎么样?使用评分

自从Elasticsearch版本2以来,过滤器和查询已经合并,任何查询子句都可以用作过滤器或查询(取决于上下文)。与版本1一样,过滤器是缓存的,如果评分不重要,则应使用过滤器


来源:

查询:计算分数;因此,他们能够返回按相关性排序的结果。
过滤器:不计算分数,使其更快、更易于缓存。

对,如果用户正在进行谷歌类型的搜索,那么我会使用查询吗?如果他们从下拉列表中选择可能的值(例如,发票计数>50),那么这将是一个过滤器?是的,这完全正确。任何时候,您需要通过某种度量来限制整个文档集,通常情况下,过滤器是合适的。因此,可能根据年龄、长度、大小等因素,etcMy解决方案在同一个请求中使用过滤器和查询,并且在测试数据库中速度非常快。我们将很快获取实时数据,看看它的速度有多快。@Zach说得非常清楚,在多租户系统中,租户/身份验证信息似乎是添加到每个查询中的过滤器(即过滤查询)。是吗?@Scott是的,我会这么做。您还可以设置过滤的别名,以便“用户别名”始终应用适当的过滤器。使管理更容易,不需要更改代码来更新查询、查询中的额外错误等。事实上,官方文档不是很清楚,似乎出现了一个带有更高级解释的页面:值得注意的是,在ES 2.0中,因此针对查询和过滤器所说和编写的大部分内容将不再适用。还要检查宣布此更改的列表。当我要删除文档时,是否应尽可能使用筛选器?我不希望在删除文档时将其缓存,您不需要任何分数,也不需要进行全文搜索。这将是一个过滤器,因为您只需要做出删除/不删除的决定。你不能提供一个请求主体的例子吗?很有趣!我没有意识到在查询之前会出现过滤器。过滤器的缓存现在更有意义了,但并不总是如此。过滤分数查询和常量分数查询之间的基本和主要区别。常量分数始终首先执行查询,然后对其应用过滤器。即使是已筛选的查询也有一些设置,查询可以通过这些设置执行
curl localhost:9200/myindex/_search?pretty  -d '
{
  "query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'
"hits" : [
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world!"
     }
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world! I am Sam."
     }
   ...