【发布时间】:2019-04-02 04:48:30
【问题描述】:
我在按_score desc 排序的查询部分得到了想要的查询结果。现在我需要提取每个文档的 3 个字段。我想达到这样的目标:
select distinct field1, field2, field3 from table A;
我刚试过:
1) 使用collapse去除重复值
GET index/_search
{
"collapse" : {
"field" : "filed1.keyword"
}
...
}
但问题是它只会保留filed1 的不同值,而忽略field2 和fiel3 的值。例如,我们有 2 条记录,例如:
[1, "a", "b"], [1, "c", "d"]
使用这种方法我们只能得到一条记录,因为它们具有相同的 field1 值。我想要这三个字段的不同组合值。我们可以使用 inner_hits 来获取第二个字段的 distict 值,但是根据https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-collapse.html:第二级折叠不允许inner_hits。这意味着它不能应用于获取多个字段之间的 dicttinct 值 (>2)。
2) 使用聚合:
GET index/_search
{
"aggs": {
"field1": {
"terms": {
"field": "field1.keyword"
},
"aggs": {
"field2": {
"terms": {
"field": field2.keyword",
"missing": ""
},
"aggs": {
"field3": {
"terms": {
"field": "field3.keyword",
"missing": ""
}
}
}
}
}
}
},
...
}
它返回 [field1, field2, field3] 的不同值,但文档的顺序发生了变化。它们是按 doc_count 而不是 _score 排序的,我们无法在结果中获取 _score 的信息。
那么我们如何在不改变当前顺序的情况下获得不同的组合值(因为我们已经在“查询”部分自定义了文档顺序)?或者我们如何按_score对聚合结果排序?
谢谢!
【问题讨论】:
标签: elasticsearch