弹性搜索术语查询:是否可以获取每个术语输入的1个文档?

时间:2017-11-04 13:33:34

标签: elasticsearch

查询1:获取带有字段" user"的1个文档=" kimchy"。

    GET /_search
    {
        "from" : 0, "size" : 1,
        "query" : {
            "term" : { "user" : "kimchy" }
        }
    }

查询2:使用字段" user"获取1个文档=" elasticsearch"。

    GET /_search
    {
        "from" : 0, "size" : 1,
        "query" : {
            "term" : { "user" : "elasticsearch" }
        }
    }

查询3:获取带有字段" user"的2个文档要么=" kimchy"或" elasticsearch"。

    GET /_search
    {
        "from" : 0, "size" : 2,
        "query": {
        "constant_score" : {
            "filter" : {
                "terms" : { "user" : ["kimchy", "elasticsearch"]}
                }
             }
         } 
    }

Query3中的问题是多个文档可以拥有" user" as" kimchy"或" elasticsearch"在第三个查询中,我们可能会同时获得用户" kimchy"或者两个文件都有用户" elasticsearch"。我们如何修改此术语查询或编写其他查询以使用" user"获取1个文档。 =" kimchy"和另一个用户=" elasticsearch"。

的文件

一种解决方案是使用Query1,2进行多重查询。但有没有其他方法来解决这个问题,即获取每个"术语的一个文件"输入

1 个答案:

答案 0 :(得分:2)

是的,还有另一种方法,使用termstop_hits聚合的混合,如下所示:

GET /_search
{
  "from": 0,
  "size": 0,
  "query": {
    "constant_score": {
      "filter": {
        "terms": {
          "user": [
            "kimchy",
            "elasticsearch"
          ]
        }
      }
    }
  },
  "aggs": {
    "users": {
      "terms": {
        "field": "user"
      },
      "aggs": {
        "sample": {
          "top_hits": {
            "size": 1,
            "sort": {
              "_script": {
                "script": {
                  "source": "(doc._id.value + salt).hashCode()",
                  "params": {
                    "salt": "some_random_string"
                  }
                },
                "type": "number",
                "order": "asc"
              }
            }
          }
        }
      }
    }
  }
}

对于每位用户kimchyelasticsearch,您将获得一个匹配的文档。