首页 > 解决方案 > 如何对弹性搜索中的数组子字段使用术语?

问题描述

我正在研究弹性搜索并在搜索查询中使用术语。请查看以下示例索引数据:

"_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,因为嵌套字段名称是动态的?只有字段名称映射是不变的。

标签: elasticsearch

解决方案


"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"字段。这里的关键字意味着,该字段的内容与您在索引期间传递的内容完全相同。

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

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

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

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

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

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

未指定字段的多匹配查询将默认为映射对象下的所有字段


推荐阅读