使用Elasticsearch进行字段唯一组合的最新结果

问题描述

我有以下格式的文件

{name: 'A',website: 'example.com',date: 1,+ other fields}
{name: 'A',date: 2,+ other fields}
{name: 'B',website: 'something.com',+ other fields}
{name: 'C',+ other fields}

我想对namewebsite进行多次查询,同时还只返回最新结果。我的查询如下:

query: {
    bool: {
      ...optional filters...,must: {
        multi_match: {
          query: input,type: "most_fields",fields: ["name^3",...,"website"],},

我想要的输出应如下所示,排序 _score

{name: 'A',+ other fields}

现在我了解到需要使用agg获取top_hits的最新结果,例如:

top_hits: {
  size: 1,sort: [{ date: "desc" }],

但是,在先按website然后按name进行聚合的过程中,我失去了按_score排序的顺序,这对我的查询很重要。我已经尝试过使用composite agg,如何无法根据结果记录的分数对其进行排序。

解决方法

我正在考虑使用额外的手动创建一个字段,该字段是namewebsite的串联,然后可以将其用作单级聚合,然后使我可以按{ {1}}。例如:

_score
,

您应该能够使用脚本在术语agg中的热门歌曲agg上执行此操作。 根据{{​​3}}

的文档

排序-应该对最匹配的匹配进行排序。默认情况下,匹配是按主要查询的得分排序的。

{
  "size": 0,"query": {
    "bool": {
      "must": [
        {"multi_match": {
          "query": "A","type": "most_fields","fields": ["name^3","website"]
        }}
      ]
    }
  },"aggs": {
    "visitor": {
      "terms": {
       "script": "doc['name'].value +'-'+ doc['website'].value","size": 10
      },"aggs": {
        "top_visitors": {
          "top_hits": {
            "size": 1
            
          }
        }
      }
    }
  }
}

您的结果将如下所示:

"visitor" : {
  "doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [
    {
      "key" : "A-example.com","doc_count" : 2,"top_visitors" : {
        "hits" : {
          "total" : {
            "value" : 2,"relation" : "eq"
          },"max_score" : 1.7260926,"hits" : [
            {
              "_index" : "test-52","_type" : "_doc","_id" : "vu_xUnQB5HlCKIdlWRy8","_score" : 1.7260926,"_source" : {
                "name" : "A","website" : "example.com","date" : 1
              }
            }
          ]
        }
      }
    },{
      "key" : "A-something.com","_id" : "VWDxUnQBx_BqvGcp8U8j","website" : "something.com","date" : 1
              }
            }
          ]
        }
      }
    }
  ]
}

在使用脚本进行性能聚合时要小心,因为它会占用大量资源并且运行速度很慢。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...