ElasticSearch附加的facet数据

时间:2013-08-30 21:58:44

标签: elasticsearch faceted-search facet

我已经将我的弹性搜索实现配置为通过映射中的id来对结果进行分析,当我向用户显示该方面时,我需要能够显示代表它的人类可读名称。我需要的数据都存在于映射中,但我不确定如何将其作为方面的一部分返回。当然有可能吗?

鉴于以下示例,我想让方面给我一些方法来关联thingIdthingName(或者可能需要的任何其他thing属性):

映射

{
  thingId,
  thingName
}

构面查询

{
  "facets":{
    "things":{ "terms":{ "field":"thingId" } }
  }
}    

结果

{
  "hits":{
    "total":3,
    "max_score":1.0,
    "hits":[
      ...
    ]
  },
  "facets":{
    "things":{
      "_type":"terms",
      "missing":0,
      "total":3,
      "other":0,
      "terms":[
        {
          "term":"5",
          "count":1
        },
        {
          "term":"4",
          "count":1
        },
        {
          "term":"2",
          "count":1
        }
      ]
    }
  }
}

修改

关于Solr的

This answer建议我同时使用两个属性(thingNamethingId)然后循环遍历两个方面结果集,假设项目的顺序相同。我不知道会有多可靠,但这是一个选择。

修改2

This answer表示,如果不将两个字段合并为一个值并在其上加以表达,就不可能做我想要的事情:thingId|thingName。不理想。

编辑3

This answer建议将值组合成一个字段并在其上进行分面(如上所述),但它使用术语脚本来实现组合,因此不需要我索引值的组合形式。仍然不完美,但似乎是最糟糕的选择。

1 个答案:

答案 0 :(得分:3)

如果您对使用术语脚本不满意,那么假设您可以使用1.0.0,则可以使用nested aggregations

您的聚合将看起来像这样:

{
    "query": {
        "match_all": {}
    },
    "aggs": {
        "theIds": {
            "terms" : {
                "field": "thingId"
            },
            "aggs":{
                "theNames": {
                    "terms": {
                        "field": "thingName"
                    }
                }
            }
        }
    }
}

响应如下:

"aggregations": {
      "theIds": {
         "buckets": [
            {
               "key": "1",
               "doc_count": 5,
               "theNames": {
                  "buckets": [
                     {
                        "key": "AAA",
                        "doc_count": 3
                     },
                     {
                        "key": "BBB",
                        "doc_count": 3
                     },
                     {
                        "key": "CCC",
                        "doc_count": 2
                     }
                  ]
               }
            },
            {
               "key": "2",
               "doc_count": 2,
               "theNames": {
                  "buckets": [
                     {
                        "key": "AAA",
                        "doc_count": 2
                     }
                  ]
               }
            }
         ]
      }
   }