在ElasticSearch

时间:2016-02-12 00:58:51

标签: elasticsearch

一般问题是我在弹性搜索中创建了一个名称/值映射来处理标签的潜在巨大用户输入 - 而不是允许人们只能用新属性创建文档的开放模式。

我有一个弹性搜索映射,如下所示:

           "Tags" : {
              "properties" : {
                 "Value" : {
                    "analyzer" : "keyword",
                    "type" : "string"
                 },
                 "Name" : {
                    "analyzer" : "keyword",
                    "type" : "string"
                 }
              }
           },

记录看起来像这样

           "Tags" : [
              {
                 "Name" : "group",
                 "Value" : "foobar"
              },
              {
                 "Name" : "season",
                 "Value" : "winter"
              }
           ],

我正在尝试使用弹性搜索查询来编写一个只聚合季节条目的脚本。

...  
"script" : "for (int i = 0; i < doc['Tags.Value'].values.length; i++) { 
         if (doc['Tags.Value'].values[i] == 'season') {
              return doc['Tags.Names'].values[i]
          } }"
...

我已经完成了上述脚本的大约200种排列,并且它并没有完全返回我希望看到的结果。

1 个答案:

答案 0 :(得分:0)

您的Tags字段应为nested,以便您可以编写nested个查询,仅选择season代码,然后您只能对这些值进行汇总。如果你有大量的标签,这将允许你抛弃那个表现非常糟糕的脚本。

所以你的映射需要看起来像这样:

       "Tags" : {
          "type": "nested",                    <---- add this
          "properties" : {
             "Value" : {
                "analyzer" : "keyword",
                "type" : "string"
             },
             "Name" : {
                "analyzer" : "keyword",
                "type" : "string"
             }
          }
       },

然后,您的查询应在nested标记名称中包含season子句,以便您的terms聚合可以简单地处理这些值。

{
  "query": {
    "filtered": {
      "filter": {
        "nested": {
          "path": "Tags",
          "filter": {
            "term": {
              "Tags.Name": "season"
            }
          }
        }
      }
    }
  },
  "aggs": {
    "season_tags": {
      "nested": {
        "path": "Tags"
      },
      "aggs": {
        "season_values": {
          "terms": {
            "field": "Tags.Value"
          }
        }
      }
    }
  }
}