【问题标题】:MySQL query to Elasticsearch queryMySQL 查询到 Elasticsearch 查询
【发布时间】:2016-07-07 19:35:16
【问题描述】:

我正在尝试为 Elasticsearch 查询获得最佳性能。
我需要类似于这个 MySQL 查询的东西:

SELECT * FROM table WHERE field_a IN ('value1', 'value2') AND field_b = value

field_a 的值的数量可能介于 1 到 20 之间。 所有字段都需要完全匹配。

现在我正在使用查询:

{
   "query" : {
      "constant_score" : { 
         "filter" : {
            "bool" : {
              "should" : [
                 { "term" : {"field_a" : "value1"}}, 
                 { "term" : {"field_a" : "value2"}} 
              ],
              "must" : {
                 "term" : {"field_b" : "value"} 
              }
           }
         }
      }
   }
} 

此时索引有大约 3000 万个文档,此查询在 0.04 秒到 0.06 秒内返回结果(通过 cURL)。
有没有更好的方法来获得我需要的结果?

更新
field_a 是一个未分析的字符串。
field_b 是一个整数。

【问题讨论】:

  • field_a 的值是数字吗?如果是这样,您可以使用gtlt 运算符进行大范围检查。
  • 你真的需要一个恒定的分数块吗?无论如何,您都在使用过滤器块,因此得分对您来说无关紧要
  • @AvihooMamka field_a 不是数字。
  • @shiladitya 该查询是根据 Elasticsearch 官方网站上发布的示例创建的。

标签: elasticsearch elasticsearch-2.0


【解决方案1】:

如果您有一个希望 field_a 与之比较的值列表,您可以使用以下查询:

{
   "query" : {
      "constant_score" : { 
         "filter" : {
            "bool" : {
              "should" : [
                 { "terms" : {"field_a" : ["value1", "value2", "etc..."]}} 
              ],
              "must" : {
                 "term" : {"field_b" : "value"} 
              }
           }
         }
      }
   }
} 

【讨论】:

  • 刚刚测试过这个。它没有提高性能,但更容易阅读。我会用它。
【解决方案2】:

必须为 field_a 和 field_b 创建索引。不要在查询中使用 * - 它会降低性能。而是 * - 编写您需要的字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    相关资源
    最近更新 更多