【发布时间】:2021-03-22 06:23:01
【问题描述】:
我最近一直在阅读有关 Lucene 和 Elasticsearch 的文章,似乎以下内容是正确的(如果我错了,请纠正我):
- 前缀查询比术语查询慢
- 后缀查询 (* ing) 比前缀查询 (ing *) 慢
这似乎是一个奇怪的属性组合。也许我需要扩大我正在考虑的数据结构的范围,但是如果一个段的结构类似于哈希表,我可以很容易地看到 1 将是真的(术语查询将是 O(1) 并且前缀查询将需要完整扫描)但是 2 不是真的(前缀和后缀都需要完整扫描)。如果段像排序数组一样布局,我可以很容易地看到 2 将是真的(可以使用二进制搜索 O(log n) 执行前缀查询,并且后缀需要完全扫描)但是 1 将不再为真(术语和前缀查询都需要二分查找)。
我唯一的另一个想法是,可能存在哈希和排序的某种组合来解释这种行为(例如,哈希到某个分区并在该分区内排序)。但是我的理解是 Elasticsearch 按文档标识符进行分区,但倒排索引键是一个术语。因此,一个术语的查询仍然需要将请求发送到所有分区。
谁能给我一些关于这种行为如何/为什么存在的直觉?
注意:
-
https://www.youtube.com/watch?v=T5RmMNDR5XI 建议段的结构类似于排序数组而不是哈希表。
-
我相信 1 是真的原因是 https://medium.com/@mourjo_sen/a-detailed-comparison-between-autocompletion-strategies-in-elasticsearch-66cb9e9c62c4 提到“在生产环境中永远不应该使用类似前缀的查询的最重要原因是它们非常慢。原因是 ES 中的标记是不能直接前缀”
-
我相信 2 为真的原因是 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html 提到“允许在单词开头使用通配符(例如“*ing”)特别重,因为索引中的所有术语都需要检查,以防万一他们匹配
【问题讨论】:
-
补充说明为什么我相信 1 是真的。一定是这样,否则为什么人们会为 EdgeNGrams 烦恼。
标签: elasticsearch search solr lucene inverted-index