asticsearch повышает важность точного соответствия фразы
Есть ли способ в asticsearch, чтобы повысить важность точной фразы, появляющейся в документе?
Например, если бы я искал фразу "веб-разработчик" и если слова "веб-разработчик" появлялись вместе, их было бы на 5 больше по сравнению с "веб-разработчиком" и "разработчиком", появляющимися раздельно по всему документу. Таким образом, любой документ, содержащий вместе "веб-разработчика", будет первым в результатах.
6 ответов
Вы можете комбинировать различные запросы вместе, используя bool-запрос, и вы можете по-разному их обрабатывать. Допустим, у вас есть обычный запрос на совпадение для обоих терминов, независимо от их позиции, а затем запрос на фразу с более высоким коэффициентом усиления.
Что-то вроде следующего:
{
"query": {
"bool": {
"should": [
{
"match": {
"field": "web developer"
}
},
{
"match_phrase": {
"field": "web developer",
"boost": 5
}
}
],
"minimum_number_should_match": 1
}
}
}
В качестве альтернативы ответу Джаванны, вы можете сделать что-то подобное с must
а также should
пункты в пределах bool
запрос:
{
"query": {
"bool": {
"must": {
"match": {
"field": "web developer",
"operator": "and"
}
},
"should": {
"match_phrase": {
"field": "web developer"
}
}
}
}
}
Не проверено, но я верю must
пункт здесь будет соответствовать результаты, содержащие как "веб" и "разработчик" и should
предложение будет оценивать фразы, соответствующие "веб-разработчик" выше.
Вы можете попробовать использовать rescore, чтобы выполнить точное совпадение фразы для ваших начальных результатов. Из документов:
"Восстановление может помочь повысить точность путем переупорядочения только самых верхних (например, 100–500) документов, возвращаемых фазами запроса и post_filter, с использованием вторичного (обычно более дорогостоящего) алгоритма вместо применения дорогостоящего алгоритма ко всем документам в индексе. "
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-rescore.html
Я использовал ниже пример запроса в моем случае, который работает. Это дает точные + нечеткие результаты, но точные улучшаются!
{ "query": {
"bool": {
"should": [
{
"match": {
"name": "pala"
}
},
{
"fuzzy": {
"name": "pala"
}
}
]
}}}
У меня недостаточно репутации, чтобы комментировать ответ Джеймса Адисона , с которым я согласен. Чего все еще не хватает, так это коэффициента повышения, который можно сделать, используя следующий синтаксис:
{
"match_phrase":
{
"fieldName": {
"query": "query string for exact match",
"boost": 10
}
}
}
Я думаю, что его поведение по умолчанию уже с оператором сопоставления запроса "или". Сначала будет отфильтрована фраза "веб-разработчик", а затем такие термины, как "веб" или "develeper". Хотя вы можете повысить свой запрос, используя приведенные выше ответы. Поправьте меня если я ошибаюсь.