弹性搜索 |查询和过滤器的区别
Elasticsearch是一个基于 Apache Lucene 的全文搜索和分析引擎。 Elasticsearch 使得对来自多个来源的数据执行数据聚合操作以及对存储的数据执行非结构化查询(例如模糊搜索)变得更加容易。
Elasticsearch 文档看起来像:
{
"first_name": " Kumar",
"last_name":"Gaurav",
"email":"kumar@gmail.com",
"dob":"04-11-1995",
"country":"India"
}
在版本 2 之前,Elasticsearch 分别执行 Queries 和 Filters,之后它们将两者结合并产生更有效的搜索结果。因此,首先我们讨论这两个主题,然后将它们相互比较。
查询:查询计算每个文档与查询的相关程度,并为其分配一个相关性分数,该分数稍后用于按相关性对匹配的文档进行排序。这种相关性的概念非常适合全文搜索,其中很少有完全“正确”的答案。该查询还提出如下问题:
- 这份文件的匹配程度如何?
- Elasticsearch 的创建日期是什么时候?
- lat_lon 字段到指定点的距离是多少?
查询的典型用途是查找与单词全文搜索最匹配的文档,包含单词 run,但也可能匹配 run、running、jog 或 sprint 并包含单词 quick、brown 等。
过滤器:大多数过滤器子句的输出是与过滤器匹配的文档的简单列表。它可以快速计算并且易于在内存中缓存,每个文档仅使用 1 位。这些缓存的过滤器可以有效地用于后续请求。过滤器询问每个文档的是或否问题,并用于包含精确值的字段:
- 创建日期是否在 2013 – 2014 范围内?
- 状态字段是否包含已发布的术语?
- lat_lon 字段是否在指定点的 10km 范围内?
注意:查询子句和过滤子句本质上相似,但用途略有不同。
要点:查询不仅是找到匹配的文档,还计算每个文档的相关性,这通常使查询比过滤器更重。此外,查询结果不可缓存。多亏了倒排索引,一个只匹配几个文档的简单查询的性能可能与跨越数百万个文档的缓存过滤器一样好或更好。但是,一般来说,缓存的过滤器会胜过查询,并且会始终如一地这样做。过滤器的目标是减少查询必须检查的文档数量
查询和过滤器的区别:Queries Filters Queries are slower it returns a calculated score of how well a document matches the query. Filters are faster because they check only if the document matched or not. Queries produce non-boolean values. Filters produce boolean values. Using filters after performing a Query is faster compare to others. But using a Query after filter is not worth it. Queries are not cacheable. Filters are cacheable.
注意:在第 2 版 Query 和 Filter 组合以执行更好的结果后,运行查询然后设置过滤器将帮助您获得所需的实际结果。