当前位置: 首页 > 知识库问答 >
问题:

防止字段的相同值相邻显示的弹性搜索查询

孔建柏
2023-03-14

我有一些这样的文档:

{
  "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"
}

我写了一个搜索相似度的查询...我正在尝试对它进行排序,这样就不会有两个相同的< code>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值已经出现在顶部,而其他字段a2a3对我来说更重要。此外,如果文档与我们的查询不相关,则应该位于最底部,无论它是myField值是否没有出现。

共有1个答案

史阳晖
2023-03-14

您必须使用术语聚合并改变其排序行为。

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

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

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

}

 类似资料:
  • 作为参考,我使用的是Elasticsearch 6.4.0 我有一个Elasticsearch查询,它返回一定的命中视频数,我正在尝试删除文本字段值过于相似的命中。我的查询是: 此查询使用自定义函数分数和筛选器来返回用户可能喜欢的书籍(他们尚未创作的书籍)。对于某些人来说,它返回的名字非常相似的书(即乔治·华盛顿的一生,乔治·华盛顿的美好时光,谁是乔治·华盛顿),我希望热门歌曲有一套更多样化的名字

  • 我试图获取嵌套文档中有两个名称的文档,但是< code>must子句作为“OR”而不是“AND”工作。下面是一个例子: 映射: 索引3个文档: 我正在寻找在同一文档中与 的文档,使用上述数据只有文档会匹配。我尝试了这个查询: 它与所有文档匹配,因为所有文档都有“John Smith”或“Alice White”。改进此查询以具有两个分离的匹配项,每个值一个匹配器: 那么,我的问题是,如何构建一个查

  • 我有以下格式的弹性搜索文档 } } 我的要求是,当我搜索特定字符串(string.string)时,我只想获得该字符串的FileOffSet(string.FileOffSet)。我该怎么做? 谢谢

  • 我试图为一个业务场景制定一个查询,其中我们有一个名为“types”的嵌套字段类型(即类似于字符串的ArrayList)。下面是以“类型”作为字段之一的索引文档示例。 文件1:{“类型”:[{“标签”:“对话”,},{“标签”:“暴力”,},{“标签”:“语言”,}} 文档2:{“类型”:[{“标签”:“对话框”,}} 现在,要求搜索查询最多匹配字段值中的一个值,即如果用户搜索“对话框”,那么它应该

  • 问题内容: 有什么方法可以根据类型在同一字段上搜索结果? 我的基本提升是这样的: 但是对于其他一些文档,我希望标题不太重要,因此我尝试使用type作为前缀: 但是,这根本没有助益。作为最后的选择,我可以使用Funcsion / Script Score bu来避免这种情况。 例如,假设文档仅包含字段。 问题答案: 实现此目的的一种简单方法是将OP中的查询重写为dis- max查询 。 elasti

  • 我有一个查询,它从弹性索引中获取一些用户帖子数据。我对那个查询很满意,尽管我需要让它返回具有唯一用户名的行。当前,它显示用户的相关帖子,但它可能会显示一个用户两次... 我读过关于聚合的文章,但不太了解(也尝试过使用AGG,但也不起作用)。。。。感谢您的帮助