4

RDBMS 的现状

假设在主要用于搜索目的的企业环境中,我有一个包含 30-40 列的旧 RDBMS 表。在现实生活中可能有几张桌子,但让我们保持简单。我有几十个,甚至几百个不同的程序,每个程序都针对这个表执行自己的查询,每个程序都查看一组略有不同的字段。

为什么现状很痛苦

  1. 我们的 DBA 竭尽全力确保所有这些不同的查询都能正常工作,方法是为每个查询定制索引。
  2. 开发人员和 DBA 之间产生了不信任,因为 DBA 想知道将执行哪些新查询,以便他们检查索引,而开发人员只想尽快推出新功能。
  3. 第 2 点有时会归结为强制开发人员使用所有静态绑定查询的努力,以便 DBA 肯定有机会首先评估性能。

啊...

这与 ES 指数相比如何?

因此,假设我在弹性搜索索引中索引了所有 30-40 列,是否真的可以搜索一个词或多个词,其性能大致与一组 RDBMS 索引一样?

4

1 回答 1

5

因此,假设我在弹性搜索索引中索引了所有 30-40 列,是否真的可以搜索一个词或多个词,其性能大致与一组 RDBMS 索引一样?

简而言之,是的。

在 Elasticsearch 中,首选的方法是使用filter,假设这些字段/列包含“枚举”类型的数据(例如statusgenderdepartment等),并且您不想使用全文搜索来查询它们. (添加全文搜索很简单,但需要您提前考虑适当的分析器、用户搜索模式等主题)

假设您在term这里使用过滤器:

curl localhost:9200 -d '{
  "query" : {
    "filtered" : {
      "filter" : {
        "term" : {
          "department" : "marketing"
        }
      }
    }
  }
}'

现在,terms 过滤器会生成一个 bitset,如果特定文档与此过滤器匹配(1/0),则该 bitset 会存储信息。这个 bitset 具有三个重要的特性:a) 它非常紧凑,b) 它非常可缓存,c) 它允许 bitset 操作组合过滤器。

Elasticsearch 将使用过滤器缓存来加快对该过滤器的访问。

过滤器和位集的好处是,如果您要进行稍微不同的查询:

curl localhost:9200 -d '{
  "query" : {
    "filtered" : {
      "filter" : {
        "bool" : {
          "must": [
            "term" : {
              "department" : "marketing"
            },
            "term" : {
              "status" : "active"
            }
          ]
        }
      }
    }
  }
}'

部门字段上的过滤器将被重新使用并从缓存中加载,将在状态字段上创建一个新的缓存位集,下一次,两者都将从缓存中加载并使用位集操作进行评估。

Elasticsearch 提供了一个Warmer API,因此您可以使用已知查询非常有效地“预加载”您的缓存。

过滤器缓存的统计信息是Nodes Stats API的一部分。

于 2013-03-05T08:54:42.583 回答