将简化的ES查询结果传递给SQL

时间:2017-02-08 23:47:14

标签: sql hadoop elasticsearch lucene

这是How to pass ElasticSearch query to hadoop的后续问题。

基本上,我想在ElasticSearch中进行全文搜索,然后将结果集传递给SQL以运行聚合查询。这是一个例子:

让我们说我们搜索"终结者"在具有10B记录的财务数据库中。它有以下匹配:

  • "终结者" (1M结果)
  • "终结者2" (10M结果)
  • " XJ4-227" (1结果==>这里"终结者"在标题的概要中)

我们不会回传10 + M ID,而是会传回以下“缩减查询”。 -

...WHERE name in ('Terminator', 'Terminator 2', 'XJ4-227')

我们如何编写这样的算法来将ES结果集减少到可以发送回SQL的最小可能的过滤器查询? ES是否有任何类型的匹配元数据可以帮助我们解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果您知道哪个" not analyzed" (keyword在5.x)字段适合您的用例,您可以通过terms aggregation获取其不同的值和匹配数。 sum_other_doc_count甚至会告诉您搜索是否导致了太多不同的值,因为只返回前N个。

当然,您可以在多个字段上运行术语聚合,并使用SQL中具有最少不同值的字段。实际上,首先运行cardinality aggregation以了解应该运行术语聚合的字段可能会更有效。

如果您的搜索是纯过滤器,那么应​​该缓存其结果,但请对两个解决方案进行基准测试,因为您的ES群集包含大量数据。