【问题标题】:How to remove duplicate search result in elasticsearch?如何在elasticsearch中删除重复的搜索结果?
【发布时间】:2022-01-27 00:18:46
【问题描述】:

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

【问题讨论】:

    标签: elasticsearch ranking


    【解决方案1】:

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

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

    这可能会对您有所帮助:

    【讨论】:

    • 聚合是否保留最高分结果?有没有办法将aggs结果放到json结果中的hits部分。
    • @navins 是的,默认情况下,结果是按分数排序的。这种请求只会保留第一个结果,谁也是最高分的结果。我不知道你问题的第二部分(也许问关于 SO 的第二个问题)
    • 谢谢,在这里发布另一个问题:stackoverflow.com/questions/29887583/…
    【解决方案2】:

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

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

    在将此功能添加到 Elasticsearch 之前,使用具有热门搜索的术语聚合是实现此目的的最佳方式。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-25
        • 2014-10-16
        • 2022-01-05
        • 2020-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多