Почему бы не использовать 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 запросов