【问题标题】:elastic search terms query: is it possible to fetch 1 document of each terms input?弹性搜索词查询:是否可以获取每个词条输入的 1 个文档?
【发布时间】:2017-11-04 13:33:34
【问题描述】:

查询 1:获取 1 个字段为“user”=“kimchy”的文档。

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

Query2:获取 1 个包含字段“user”=“elasticsearch”的文档。

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

Query3:获取 2 个带有字段“user”的文档,其中一个为“kimchy”或“elasticsearch”。

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

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

一种解决方案是使用 Query1,2 进行多搜索查询。但是有没有其他方法可以解决这个问题,即获取每个“术语”输入的一个文档?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    是的,还有另一种方法,混合使用 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,您将获得一个匹配的文档。

    【讨论】:

    • 我需要随机选择“用户”,而不是总是与 top_relevance 相同的用户。是否有可能或者这个查询每次都会返回相同的“kimchy”、“elasticsearch”文档?
    • top_hits 也接受sort 设置,您可以在其中使用执行随机排序的脚本。
    • 其他一切都很好,但是当我在查询中包含“排序”部分时,我没有得到结果。您能否检查一下您是否通过此排序查询返回了结果?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多