elasticsearch 选择布尔查询弹性搜索的不同值,elasticsearch,elasticsearch" /> elasticsearch 选择布尔查询弹性搜索的不同值,elasticsearch,elasticsearch" />

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

elasticsearch 选择布尔查询弹性搜索的不同值,elasticsearch,elasticsearch,我有一个查询,从弹性索引中获取一些用户帖子数据。我对这个查询很满意,尽管我需要让它返回具有唯一用户名的行。当前,它按用户显示相关帖子,但可能会两次显示一个用户 { "query": { "bool": { "should": [ { "match_phrase": { "gtitle": {"query": "voice","boost": 1}}},

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

{
          "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,但也不起作用)。。。。非常感谢您提供的任何帮助

您需要使用来获取所有唯一的用户,然后使用来为每个用户仅获取一个结果。这就是它的样子

{
  "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
}
这里的
size
内部用户聚合为100,如果您有更多的唯一用户(默认值为10),则可以增加该值,并且最外层的
size
为零,以仅获得聚合结果。需要记住的一件重要事情是,您的用户ID必须是唯一的,即ABC和ABC将被视为不同的用户,您可能必须使您的用户ID
不被分析
,以确保这一点。在那上面


希望这有帮助

是否希望每个用户显示一篇文章,即如果一个用户有多篇文章与“voice”匹配,是否只返回一篇?你也可以发布地图的相关部分吗?是的,这正是我想要的。。当前,它显示来自同一用户的多篇文章,这些文章与该查询匹配。至于映射,我还不明白它是什么,所以我没有添加任何内容。。。映射是制作索引的函数?你有名为userid或类似的字段吗?是的,我有“userid”、“username”、“mates”、“description”、“category”、“country”、“city”、“profilepicture”谢谢你是我能为你做的最低限度。。。真正的绅士!很高兴我能帮上忙,请考虑接受这个答案,这对将来的读者也有帮助。