【问题标题】:ElasticSearch Limit Filter AmbiguityElasticSearch 限制过滤器歧义
【发布时间】:2014-02-22 01:19:45
【问题描述】:

我对 ElasticSearch 中的限制过滤器有点不确定。我认为我没有正确理解它们。

我正在搜索健康记录信息的多个节点上的多个分片。我希望在我的查询中获得最高分的 50 个结果。

docs 它说

限制过滤器限制要执行的文档数量(每个分片) 开。

这个SO 响应状态

You should use filters when you don't care about scoring, they are faster and cache-able.

但是,如果评分对我来说很重要,我是否应该使用限制过滤器将我的回报限制为仅前 50 名得分最高的结果?

这样的东西会更准确吗(在java中):

SearchResponse response = client.prepareSearch().setSearchType(SearchType.DFS_QUERY_THEN_FETCH).setQuery(qb).setFrom(0).setSize(50).setExplain(true).execute().actionGet();

更新 我偶然发现了这个SO 帖子,其中回复指出:

对,您应该使用过滤器来排除文档 执行查询时考虑。

好的。所以在这种情况下,也许我可以将我的问题细化为以下内容:

如何只返回得分前 50 的结果?上面的java引用是正确的解决方案吗?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    limit 过滤器所做的只是告诉每个分片在找到一定数量的匹配文档时停止搜索。它没有说明那些文档是最佳匹配。

    例如,假设你只有一个分片,你用"foo bar" 索引了 10 个文档,用"foo" 索引了另外 10 个文档。然后你运行这个搜索:

    GET /_search  
    {
      "query": {
        "filtered": {
          "query": {
            "match": {
              "text": "foo bar"
            }
          },
          "filter": {
            "limit": {
              "value": 10
            }
          }
        }
      }
    }
    

    match 查询查找foo OR bar,因此所有 20 个文档都会匹配,但同时包含这两个词的 10 个文档会匹配得更好。 limit 过滤器说:一旦你有 10 个文档就停止,所以你会得到 10 个结果,但它们可能不是最好的 10 个 - 相反,你的结果可能包括其中只有 foo 的文档。

    (注意:limit 应用于每个分片,而不是每个索引。)

    你说:

    我希望在我的查询中获得最高分的 50 个结果。

    您想要最高的事实会自动排除使用limit 过滤器。相反,您只需将size parameter 设置为 50:

    GET /_search
    {
       "size": 50,
       "query": {....}
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      相关资源
      最近更新 更多