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

How to remove duplicate search result in elasticsearch?

首先创建一些示例数据(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"
}

首先,您需要跨多个索引进行搜索。
然后,在结果中删除重复的 ID。

POST  http://myElastic.com/test/e1,e2,e3/_search
{
  "aggs":{
    "dedup" : {
      "terms":{
        "field": "id"
       },
       "aggs":{
         "dedup_docs":{
           "top_hits":{
             "size":1
           }
         }
       }    
    }
  }
}

这可能对您有帮助:

  • search multi-index type
  • Remove duplicate documents from a search in Elasticsearch
  • Filter elasticsearch results to contain only unique documents based on one field value

查看 Field Collapsing - 它旨在为每个“字段”提供 1 个搜索结果。

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

在将此功能添加到 Elasticsearch 之前,使用具有最高命中率的术语聚合是实现此目的的最佳方式。

就我而言,我也有一个术语查询

 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',
              },
            },
          },
        },
      });