Elasticsearch 5多值和多字段搜索

时间:2018-10-19 12:01:31

标签: elasticsearch

我正在尝试对多个字段进行搜索,并且其中一个字段具有多个完全匹配的值。这就是我在SQL中的处理方式。

select * from logs
where order_id IN (123, 456)
and ( message LIKE 'Order fetched%' OR message LIKE 'Tax allocated%');

超级对如何在Elastic 5.x中执行此操作感到困惑

我的映射是这个。

"properties" : {
    "company_id" : { "type" : "long"},
    "order_id" : { "type" : "long"},
    "sku_id" : { "type" : "long"},
    "piece_id" : { "type" : "long"},
    "item_titles_order_id" : { "type" : "long"},
    "type" : { "type" : "keyword"},
    "message" : { "type" : "text"},
    "created" : { "type" : "date", "ignore_malformed" : true, "format" : "yyyy-MM-dd HH:mm:ss" }
}

1 个答案:

答案 0 :(得分:0)

SQL WHERE AND / OR逻辑可以转换为bool queries

SQL IN过滤器可以转换为terms queries,该过滤器可以对未分析的字段进行操作

SQL LIKE运算符可以转换为wildcard queries,它可以对未分析的字段进行操作

将所有内容放在一起,您可以尝试以下操作:

{
  "query": {
    "bool": {
      "must": [  // SQL AND 
        {
          "terms": {  // SQL IN
            "order_id": [123, 456]
          }
        }, 
        {
          "bool": {
            "should": [ // SQL OR
              {
                "wildcard": {  // SQL LIKE
                  "message": "Order fetched*"
                }
              },
              {
                "wildcard": {
                  "message": "Tax allocated*'"
                }
              }
            ]
          }
        }
      ]
    }
  }
}

您可能需要将message字段的类型更改为keyword或为此字段创建keyword类型的子字段。