为什么将数字数据映射到关键字可以提高 ElasticSearch 中的检索时间

Jak*_*raw 5 indexing performance nosql elasticsearch

我有长期的 SQL 背景——NoSQL(和 ElasticSearch)对我来说非常陌生。

\n

我团队中的一位工程师正在构建一个用于文档存储的新索引,他们已将所有短/整数/长值映射到字符串以在术语查询中使用。

\n

这让我感到惊讶,因为带有 SmallInt/Int/BigInt 键的 SQL 索引的性能比转换为 VarChar(X) 并相应索引的同一组值要好得多。

\n

我被指出这篇文章:https://www.elastic.co/guide/en/elasticsearch/reference/current/number.html

\n

其中有这样的评论:

\n
\n

如果出现以下情况,请考虑将数字标识符映射为关键字:

\n
    \n
  • 您不打算使用范围查询来搜索标识符数据。
  • \n
  • 快速检索很重要。关键字字段上的术语查询搜索通常比数字字段上的术语搜索更快。
  • \n
\n
\n

我很高兴从表面上理解这一点,但我不明白为什么会这样。

\n

假设精确匹配类型查询(例如 ID = 100),任何人都可以谈谈 ElasticSearch(或一般的 NoSQL)的机制,这可以解释为什么针对字符串化数值的查询比直接针对数值的查询更快?

\n

Val*_*Val 2

基本上,关键字存储在倒排索引中,查找速度非常快,这使得查询keyword的理想类型term/s(即精确匹配)

然而,数值存储在BKD 树中(自 ES 5/Lucene 6 起),这比数值的倒排索引 优化range,并且还针对类查询进行了优化。

缺点是在 BKD 树中搜索精确数值的性能低于在倒排索引中查找术语的性能。

因此,如果您的 ID 是数字,并且您计划在范围内查询它们,请将它们映射为数字类型integer,例如 等。但是,如果您计划以术语/精确方式匹配您的 ID,然后将它们存储为具有keyword类型的字符串。