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

时间:2016-01-19 13:41:23

标签: elasticsearch

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

{
          "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但也无法使用)....任何帮助表示赞赏

1 个答案:

答案 0 :(得分:3)

您需要使用terms aggregation来获取所有唯一身份用户,然后使用top hits aggregation为每个用户只获取一个结果。这就是它的外观。

{
  "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 not_analyzed确定这一点。 More就此而言。

希望这会有所帮助!!