Elasticsearch重新调整忽略基本分数的所有结果

时间:2014-07-16 09:10:16

标签: elasticsearch

我正在尝试使用以下查询重新调整结果:

POST /archive/item/_search
{
    "query": {
        "multi_match": {
            "fields": ["title", "description"],
            "query": "1 złoty",
            "operator": "and"
        }
    },
    "rescore": {
        "window_size": 50,
        "query": {
            "rescore_query": {
                "multi_match": {
                    "type": "phrase",
                    "fields": ["title", "description"],
                    "query": "1 złoty",
                    "slop": 10
                }
            },
            "query_weight": 0,
            "rescore_query_weight": 1
        }
    }
}

我这样做是因为我想靠接近得分。 另外,我想忽略源字段长度对分数的影响。 我这样做了吗?如果没有,这里的最佳做法是什么?

第二个问题。为什么还需要window_size? 我不想要最好的结果。 主查询atcs就像一个过滤器,所以它返回的所有结果都是相关的。 我认为像"window_size": "all"这样的东西是完美的,但我在文档中找不到任何东西。

2 个答案:

答案 0 :(得分:1)

要回答你的第二个问题,需要它的原因是因为它只是为了获得最佳结果。基本上这是一个成本问题 - 假设二级算法更昂贵,因此它只是设计为在最佳结果上运行。这里有更多关于此的讨论:

https://github.com/elasticsearch/elasticsearch/issues/2640

在这里:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-rescore.html

我个人认为“全部”选项是一个好主意,也许你应该在github上打开一个问题?

答案 1 :(得分:0)

如果你想用邻近匹配得分,那么其他过滤器返回的所有结果应该是:

{
  "query": {
    "filtered" : {
      "query" : {
        "multi_match": {
          "type": "phrase",
          "fields": ["title", "description"],
          "query": "1 złoty",
          "slop": 10
        }
      },
      "filter" : {
        "query": {
          "multi_match": {
            "fields": ["title", "description"],
            "query": "1 złoty",
            "operator": "and"
          }
        }
      }
    }
  }
}

根据this,过滤器在查询之前运行,因此性能也不应该很差。你还得分两次,因为过滤器不能计算分数。另一个优点是可以缓存过滤器,这应该可以显着加快速度。

请记住,我只进行了短测试,主要关注语法而不是结果。您可能需要仔细检查它。