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

时间:2014-09-05 05:32:21

标签: elasticsearch

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

编辑:我真正想做的只是返回高于x"得分"的文件。我有这个:

data = {
        'min_score': 0.9,
        'query': {
            'match': {'field': 'michael brown'},
        }
    }

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

THX!

编辑#2:编辑#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%',
        }
    }

2 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:3)

我不知道它是否是最佳解决方案,但它适用于我(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();

我搜索了两次,但是它第一次快,因为它只返回1项,那么我们可以得到max_score

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