如何对Elasticsearch中的数组子字段使用Term?

时间:2019-01-02 18:04:18

标签: elasticsearch

我正在从事Elasticsearch并在搜索查询中使用术语。请在下面查看样本索引数据:

"_source": {
    "type": "ITEM",
    "primaryKey": "3923",
    "displayName": "Lumia 505",
    "attributes": {
        "n26273": "Lumia 505",
        "n26275": "Mobile"
    },
    "mappings": {
        "Primary Hierarchy": [
            "Nokia"
        ]
    }
}

我要使用下面的查询来针对我的任何搜索文本搜索数据,

{
   "query":{
      "bool":{
         "must":[
            {
               "query_string":{
                  "query":"----MySearchTextHere----",
                  "default_operator":"AND"
               }
            },
            {
               "term":{
                  "type":"item"
               }
            }
         ]
      }
   },
   "size":10,
   "from":0
}

查询:

1.如何在查询中添加术语以搜索作为数组的字段“ mappings.Primary Hierarchy”

2.如何在不提及嵌套字段名称的情况下实现#1,因为嵌套字段名称是动态的?只有字段名称​​ mappings 是常量。

1 个答案:

答案 0 :(得分:0)

在术语查询中引用嵌套字段(在您的情况下为"mappings.Primary Hierarchy")没有问题

{
   "query":{
      "bool":{
         "must":[
            {
               "query_string":{
                  "query":"Nokia",
                  "default_operator":"AND"
               }
            },
            {
               "term":{
                  "mappings.Primary Hierarchy":"nokia"
               }
            }
         ]
      }
   },
   "size":10,
   "from":0
}

这只会被诺基亚成功过滤。如果要完全使用诺基亚(而非术语),则应使用"mappings.Primary Hierarchy.keyword"字段。 Keyword的意思是,该字段的内容与索引期间您传递的内容完全相同。

第二件事也是可能的,但需要适当的映射。您需要指定映射为nested type(这意味着其中可能还有其他字段)。

您的情况下的一个简单示例可能是这样的:

{
    "mappings": {
        "_doc" : {
            "properties" : {
                "mappings" : {
                    "type" : "nested"
                }
            }
        }
    }
}

您需要应用这些设置来创建索引。

在这种情况下,您的查询可能如下所示:

{
  "query": {
    "nested": {
      "path": "mappings",
      "query": {
        "multi_match": {
          "query": "Nokia"
        }
      }
    }
  }
}

Multi match query(未指定任何字段)将默认为映射对象

下的所有字段