Elasticsearch中的多项搜索与RDBMS的比较

4

RDBMS的现状

假设我在一个企业环境中拥有一个传统的RDBMS表,其中包含30-40列,主要用于搜索。 在现实生活中可能有几个表,但让我们保持简单。 我有数十甚至数百个不同的程序,每个程序针对此表执行自己的查询,并查看略微不同的字段集。

为什么现状会带来困扰?

  1. 我们的DBA们竭尽全力确保所有这些不同的查询都能够通过调整索引良好地工作。
  2. 开发人员和DBAs之间的不信任正在酝酿,因为DBAs想知道将要执行哪些新的查询,以便他们可以检查其索引,而开发人员只想尽可能快地推出新功能。
  3. 第二点有时会演变成强制开发人员使用所有静态绑定查询,以便DBAs确保有机会先评估性能。

呃...

与ES索引相比如何?

因此,假设我在elasticsearch索引中索引了所有30-40个列,那么我可以以与一组RDBMS索引大致相同的方式搜索单个词或多个词吗?


这个想法在这里有一些详细解释,但并不是很令人满意:https://dev59.com/0ljUa4cB1Zd3GeqPR3sn - Jonathan Schneider
你的问题的简短答案是“是”。尽管性能问题很难在抽象中回答,因为ES调优与RDBMS调优非常不同。虽然如此,它速度相当快,我认为你应该能够做到。试试吧! - Dave S.
1个回答

5
假设我在elasticsearch索引中索引了所有30-40个列,那么搜索一个或多个词条是否与RDBMS索引集合的性能差不多?简而言之,是的。在Elasticsearch中,最好的方法是使用filter进行过滤,假设这些字段/列包含“枚举”类型的数据(例如状态,性别,部门等),并且您不想使用全文搜索来查询它们。(添加全文搜索很简单,但需要您提前考虑诸如适当的分析器、用户搜索模式等主题。)假设您在这里使用term筛选器:
curl localhost:9200 -d '{
  "query" : {
    "filtered" : {
      "filter" : {
        "term" : {
          "department" : "marketing"
        }
      }
    }
  }
}'

现在,terms筛选器生成一个位集,存储特定文档是否与此筛选器匹配的信息(1/0)。这个位集有三个重要特点:a)非常紧凑,b)非常可缓存,c)允许位集操作结合筛选器。
Elasticsearch将使用筛选器缓存来加速对此筛选器的访问。
筛选器和位集的好处在于,如果您进行稍微不同的查询:
curl localhost:9200 -d '{
  "query" : {
    "filtered" : {
      "filter" : {
        "bool" : {
          "must": [
            "term" : {
              "department" : "marketing"
            },
            "term" : {
              "status" : "active"
            }
          ]
        }
      }
    }
  }
}'

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

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

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


优秀的信息将术语过滤器与位集链接到过滤器缓存中。现在更清晰了,谢谢! - Jonathan Schneider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接