我已经将我的弹性搜索实现配置为通过映射中的id来对结果进行分析,当我向用户显示该方面时,我需要能够显示代表它的人类可读名称。我需要的数据都存在于映射中,但我不确定如何将其作为方面的一部分返回。当然有可能吗?
鉴于以下示例,我想让方面给我一些方法来关联thingId
到thingName
(或者可能需要的任何其他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建议我同时使用两个属性(thingName
和thingId
)然后循环遍历两个方面结果集,假设项目的顺序相同。我不知道会有多可靠,但这是一个选择。
修改2
This answer表示,如果不将两个字段合并为一个值并在其上加以表达,就不可能做我想要的事情:thingId|thingName
。不理想。
编辑3
This answer建议将值组合成一个字段并在其上进行分面(如上所述),但它使用术语脚本来实现组合,因此不需要我索引值的组合形式。仍然不完美,但似乎是最糟糕的选择。
答案 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
}
]
}
}
]
}
}