【问题标题】:Elasticsearch query that prevents same value of a field appear next to each other防止字段的相同值彼此相邻出现的 Elasticsearch 查询
【发布时间】:2019-07-10 02:18:57
【问题描述】:

我有一些这样的文档:

{
  "text": "sample - very high relevancy",
  "myField": "a1"
},
{
  "text": "sample - less relevancy",
  "myField": "a2"
},
{
  "text": "sample - high relevancy",
  "myField": "a1"
},
{
  "text": "sample - very less relevancy",
  "myField": "a3"
}

我已经写了一个关于搜索相似性和东西的查询...我试图对它进行排序,就像从来没有两个相同的 myField 值彼此相邻出现一样。

我希望 myField 的所有不同值出现在结果顶部,然后是重复值。

我正在寻找的是一个高级排序查询 如果字段myField 已出现在结果中,则降低文档的分数。

根据我的例子,我希望我的结果是

{
  "text": "sample - very high relevancy",
  "myField": "a1"
},
{
  "text": "sample - less relevancy",
  "myField": "a2"
},
 {
  "text": "sample - very less relevancy",
  "myField": "a3"
},
{
  "text": "sample - high relevancy",
  "myField": "a1"
},
{
  "text": "sample - extremely less relevancy",
  "myField": "a5"
}

结果底部出现了高相关性字段,因为 a1 值已经出现在顶部,而其他字段 a2 a3 对我来说更重要。 此外,如果一个文档与我们的查询无关紧要,无论它的myField 值是否不出现,都应该位于最底部。

【问题讨论】:

    标签: elasticsearch elastic-stack elasticsearch-aggregation


    【解决方案1】:

    您必须使用 Terms 聚合并更改其排序行为。

    下面的伪查询应该可以工作(因为我没有运行弹性): 聚合用于将重复的结果合并到一个桶中。

    buckets count 应用排序,以便计数为 1 的存储桶位于顶部。

    {
    "query" : {
      // Your search query/filter goes here
    },
    "aggs": {
      "myagg": {
        "terms": {
          "field": "myField",
          "order": {
            "myagg>_count" : "asc"
          }
        }
      }
    }
    

    }

    【讨论】:

    • 谢谢,我应该用myagg>_count 代替什么?
    • 为您的聚合前使用任何有用的名称。我的。然后在订单块中使用 aggname>_count。让我知道查询是否按预期工作。
    猜你喜欢
    • 1970-01-01
    • 2018-03-23
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 2014-04-16
    • 2011-03-08
    相关资源
    最近更新 更多