如何在Elasticsearch中删除重复的搜索结果?

17

首先创建一些示例数据(e1、e2、e3是类型,test是索引名称):

PUT test/e1/1
{
  "id":1
  "subject": "subject 1"
}
PUT test/e2/1
{
  "id":1
  "subject": "subject 2"
}
PUT test/e3/2
{
  "id":2
  "subject": "subject 3"
}
现在我的问题是:我该如何仅获取这两个数据?从curl -XGET _search的结果中删除具有相同id的重复数据。
test/e1/1
{
  "id":1
  "subject": "subject 1"
}
test/e3/2
{
  "id":2
  "subject": "subject 3"
}
3个回答

19

聚合操作是否保留最高分数结果?并且是否有一种方法将“aggs”结果放入JSON结果的“hits”部分中。 - navins
@navins 是的,默认情况下结果是按分数排序的。这种请求只会保留第一个结果,也就是最高得分的结果。我不知道你问题的第二部分(也许在SO上提问第二个问题)。 - Francois Combet
谢谢,只需在这里发布另一个问题:http://stackoverflow.com/questions/29887583/how-to-paging-aggregation-result-in-elasticsearch - navins

7

查看字段折叠(Field Collapsing) - 它旨在为您提供每个“字段”的1个搜索结果。

GET /test/_search
{
  "collapse": {
    "field": "id"                
  }                      
}

在Elasticsearch添加此功能之前,使用带有顶级命中的terms聚合是实现此目的的最佳方法。

0

就我而言,我也有一个词项查询

 user: {
      type: 'object',
      properties: {
        id: {
          type: 'keyword', // using keyword for removing duplicate documents from searc results
          normalizer: 'useLowercase',
        },
        name: {
          type: 'text',
        },
        thumbnail: {
          type: 'text',
        },
      },
    },

    const { body } = await elasticWrapper.client.search({
        index: ElasticIndex.Payment,
        body: {
          from: f ? f : 0,
          size: s ? s : 10,
          _source: ['user'],
          query: {
            bool: {
              must: [
                {
                  nested: {
                    path: 'cart',
                    query: {
                      term: {
                        'cart.product.id': req.params.id,
                      },
                    },
                  },
                },
              ],
            },
          },
          collapse: {
            field: 'user.id',
          },
          aggs: {
            user_count: {
              cardinality: {
                field: 'user.id',
              },
            },
          },
        },
      });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接