为什么不将min_score与Elasticsearch一起使用?

use*_*084 10 elasticsearch

Elasticsearch新手.我感兴趣的是只返回最相关的文档,并且遇到了min_score.他们说"注意,大多数情况下,这没有多大意义",但没有提供理由.那么,为什么使用min_score没有意义呢?

编辑:我真正想做的只是返回高于x"分数"的文档.我有这个:

data = {
        'min_score': 0.9,
        'query': {
            'match': {'field': 'michael brown'},
        }
    }
Run Code Online (Sandbox Code Playgroud)

是否有更好的替代方案,以便它只返回最相关的文档?

谢谢!

编辑#2:我正在使用minimum_should_match并返回400错误:

"error": "SearchPhaseExecutionException[Failed to execute phase [query], all shards failed;"

data = {
        'query': {
            'match': {'keywords': 'michael brown'},
            'minimum_should_match': '90%',
        }
    }
Run Code Online (Sandbox Code Playgroud)

kim*_*l42 7

我已经使用min_score来尝试查找与给定输入数据集最终匹配的文档 - 用于生成查询.

当然,您获得的文档得分取决于查询.所以我会说你的查询在许多排列中(例如,不同的关键字),并决定哪个文档是第一个你不想为每个文档返回的文档,并记下他们的每个分数.如果分数相似,这将使您对用于最低分数的值有一个很好的猜测.

但是,您需要记住,分数不仅取决于查询和返回的文档,还会考虑所有其他文档,这些文档包含您要查询的字段的数据.这意味着如果您使用20个文档的索引测试您的min_score值,当您在生产索引上尝试使用例如几千个或更多文档时,此分数可能会发生很大变化.这种变化可能是两种方式,也不容易预测.

我找到了我对min_score的匹配用法,你需要创建一个非常复杂的查询,并设置一组分析器来调整查询的各个组件的分数.但是包含和不包含的内容对我的应用程序至关重要,因此您可能会对保持简单的内容感到满意.


小智 6

我不知道这是否是最好的解决方案,但它对我有用(java):

// "tiny" search to discover maxScore
// it is fast, because it returns only 1 item
SearchResponse response = client.prepareSearch(INDEX_NAME)
                        .setTypes(TYPE_NAME)
                        .setQuery(queryBuilder)
                        .setSize(1)
                        .execute()
                        .actionGet();

// get the maxScore and
// and set minScore = 70%
float maxScore = response.getHits().maxScore();
float minScore = maxScore * 0.7;

// second round with minimum score
SearchResponse response = client.prepareSearch(INDEX_NAME)
                        .setTypes(TYPE_NAME)
                        .setQuery(queryBuilder)
                        .setMinScore(minScore)
                        .execute()
                        .actionGet();
Run Code Online (Sandbox Code Playgroud)

我搜索了两次,但第一次它很快,因为它只返回 1 个项目,然后我们可以得到 max_score

注意: minimum_should_match 工作不同。如果您有 4 个查询,并且您说 minimum_should_match = 70%,这并不意味着 item.score 应该 > 70%。这意味着该项目应该匹配 70% 的查询,即最少 3/4 个查询