弹性搜索与RDBMS中的多项搜索

时间:2013-03-04 14:51:17

标签: elasticsearch

使用RDBMS

的现状

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

为什么现状会受到伤害

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

    这与ES索引相比如何?

    因此,假设我将弹性搜索索引中的所有30-40列都编入索引,我是否能够以与一组RDBMS索引大致相同的方式搜索一个或多个词?

1 个答案:

答案 0 :(得分:4)

  

因此,假设我将弹性搜索索引中的所有30-40列都编入索引,我是否能够以与一组RDBMS索引大致相同的方式搜索一个或多个词?

简而言之,是的。

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

假设您在此处使用term过滤器:

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

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

Elasticsearch将使用filter cache来加快对此过滤器的访问。

关于过滤器和位集的好处是,如果你要做一个稍微不同的查询:

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

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

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

过滤器缓存的统计信息是Nodes Stats API

的一部分