Почему бы не использовать min score с Elasticsearch?
новое в Elasticsearch. Я заинтересован только в возвращении наиболее релевантных документов и наткнулся min_score. Они говорят: "обратите внимание, в большинстве случаев это не имеет большого смысла", но не дает причины. Итак, почему не имеет смысла использовать min_score?
EDIT: то, что я действительно хочу сделать, это только вернуть документы, которые имеют более высокий, чем x "оценка". У меня вот что:
data = {
'min_score': 0.9,
'query': {
'match': {'field': 'michael brown'},
}
}
есть ли лучшая альтернатива вышеуказанному, так что он возвращает только самое соответствующие документы?
thx!
Изменить #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 ответов
Я использовал min_score довольно много для поиска документов, которые являются окончательным соответствием заданному набору входных данных, который используется для создания запроса.
оценка, которую вы получаете для документа, зависит от запроса, конечно. Поэтому я бы сказал, что попробуйте свой запрос во многих перестановках (например, разные ключевые слова) и решите, какой документ вы бы предпочли, чтобы он не возвращался для каждого, и запишите каждый из своих баллов. Если оценки похожи, это будет дать вам хорошее предположение на значения для минимальная оценка.
однако вам нужно иметь в виду, что оценка зависит не только от запроса и возвращаемого документа, она учитывает все другие документы, которые имеют данные для запрашиваемых полей. Это означает, что если вы проверяете значение min_score с индексом 20 документов, этот показатель, вероятно, сильно изменится, когда вы попробуете его на производственном индексе, например, с несколькими тысячами документов или более. Это изменение может пойти в любом случае, и это не легко предсказуемо.
Я нашел для моего соответствия использования min_score, вам нужно создать довольно сложный запрос и набор анализаторов для настройки баллов для различных компонентов вашего запроса. Но то, что включено и не включено, жизненно важно для моего приложения, поэтому вы можете быть довольны тем, что он дает вам, когда все просто.
Я не знаю, лучшее ли это решение, но оно работает для меня (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%, это не означает, что элемент.результат должен быть > 70%. Это означает, что элемент должен соответствовать 70% запросов, то есть минимум 3/4 запросов