如何对elasticsearch中的数组子字段使用术语?

hs1ihplo  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(1)|浏览(320)

我正在研究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?只有字段名Map是常量。

py49o6xq

py49o6xq1#

引用嵌套字段没有问题( "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" 现场。关键字在这里的意思是,这个字段的内容与您在索引期间传递的内容完全相同。
第二件事也是可能的,但需要正确的Map。您需要指定Map是嵌套类型(这意味着其中可能有其他字段)。
您的案例中的简单示例如下:

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

您需要使用这些设置创建索引。
在这种情况下,您的查询可能如下所示:

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

没有指定字段的多重匹配查询将默认为Map对象下的所有字段

相关问题