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

选择布尔查询弹性搜索的不同值

苏建安
2023-03-14

我有一个查询,它从弹性索引中获取一些用户帖子数据。我对那个查询很满意,尽管我需要让它返回具有唯一用户名的行。当前,它显示用户的相关帖子,但它可能会显示一个用户两次...

{
          "query": {
            "bool": {
              "should": [
                          { "match_phrase": { "gtitle": {"query": "voice","boost": 1}}},
                          { "match_phrase": { "gdesc": {"query": "voice","boost": 1}}},
                          { "match": { "city": {"query": "voice","boost": 2}}},
                          { "match": { "gtags": {"query": "voice","boost": 1}   }}
              ],"must_not": [
                          { "term": { "profilepicture": ""}}
              ],"minimum_should_match" : 1
            }
          }
}

我读过关于聚合的文章,但不太了解(也尝试过使用AGG,但也不起作用)。。。。感谢您的帮助

共有1个答案

万俟皓
2023-03-14

您需要使用术语聚合来获取所有唯一用户,然后使用热门聚合来为每个用户获取一个结果。这就是它的外观。

{
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "gtitle": {
              "query": "voice",
              "boost": 1
            }
          }
        },
        {
          "match_phrase": {
            "gdesc": {
              "query": "voice",
              "boost": 1
            }
          }
        },
        {
          "match": {
            "city": {
              "query": "voice",
              "boost": 2
            }
          }
        },
        {
          "match": {
            "gtags": {
              "query": "voice",
              "boost": 1
            }
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "profilepicture": ""
          }
        }
      ],
      "minimum_should_match": 1
    }
  },
  "aggs": {
    "unique_user": {
      "terms": {
        "field": "userid",
        "size": 100
      },
      "aggs": {
        "only_one_post": {
          "top_hits": {
            "size": 1
          }
        }
      }
    }
  },
  "size": 0
}

在这里,用户聚合内部的大小为100,如果您有更多的唯一用户(默认值为10),则可以增加该值,并且最外层的大小为零,以仅获得聚合结果。需要记住的一件重要事情是,您的用户ID必须是唯一的,即ABC和ABC将被视为不同的用户,您可能需要确保您的用户ID未经分析。更多信息。

希望这有帮助!!

 类似资料:
  • 问题内容: 我有一个查询,可以从弹性索引中获取一些用户发布的数据。我对该查询感到满意,尽管我需要使其返回具有唯一用户名的行。当前,它显示用户的相关帖子,但是可能显示一个用户两次。 我已经阅读了有关聚合的内容,但了解得不多(也尝试使用aggs但也没有用)....非常感谢您的帮助 问题答案: 您将需要使用术语汇总来获取所有唯一身份用户,然后使用热门匹配来针对每个用户仅获取一个结果。这就是它的样子。 在

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

  • 我正在LDAP服务器上工作。它有弹性搜索。我必须用一些Javascript代码(JSON格式)发送查询。 这是我的查询: 我试图打印所有结果,其中“server”=“server\u name”(该字段是server:server\u name…)。我认为关于弹性搜索的文档太小了。我找到了一些文档,但都是一样的,对新用户没有帮助。这个例子太简单了。 此查询返回所有结果,包括任何筛选器。 Ps:这就

  • 我试图为一个文档编制索引,该文档有三个字段:first_name、last_name、占领类型“keyword”,并分别有值XYZ、ABC和DEF。 我已经使用过滤器编写了查询,以便与和条件完全匹配,如下所示, 这必须返回一个文档,但不返回任何内容。 我对同一个操作有另一个查询, 这将返回一个文档。 根据Elasticsearch文档,我知道查询和筛选的区别在于筛选不会对结果打分。我不知道为什么第

  • 不带筛选器的查询: 当我用curl:curl-w'\ntime_total:%{time_total}\n'-h'content-type:application/json'-xget-d‘{}':9200/store/msg/_search?routing=user1来度量这两个查询的性能时 不带筛选器的查询得到的总时间:1.134、1.237、1.107,带筛选器的查询时间:1.322、1.4

  • 我在布尔查询中有一个筛选器问题。 我想应用一个基于3个字段的筛选器,其中至少有1个筛选器匹配: 我在这个查询中没有得到任何结果,但是我在索引中看到了很多相关的文档。 Opster Elasticsearch忍者测试: 例如你向我提出的1个例子,我有许多返回的结果。 然而,当我想对对象字段执行必须查询时,我没有得到与筛选器完美匹配的相同结果。 这里有一个例子: 仅使用must子句进行搜索 首先出现的