#database #elasticsearch #full-text-search
Вопрос:
Я ищу какой-то текст в поле.
но проблема в том, что всякий раз, когда два документа содержат все маркеры поиска, документ, в котором больше маркеров поиска, получает больше очков вместо документа меньшей длины.
Мой индекс эластичного поиска содержит некоторые названия продуктов питания. и я хочу поискать в нем немного еды.
Структура документов выглядит следующим образом
{"text": "NAME OF FOOD"}
Теперь у меня есть два документа, таких как
1: {"text": "Apple Syrup Apple Apple Syrup Apple Smoczyk's"}
2: {"text": "Apple Apple"}
Если я буду искать с помощью этого запроса
{
"query": {
"match": {
"text": {
"query": "Apple"
}
}
}
}
Первый документ стоит на первом месте, потому Apple
что в нем содержится больше.
что не является моим ожидаемым результатом. Мне будет хорошо, если второй документ получит больше очков, потому что Apple
в нем есть, и его длина короче, чем у первого.
Ответ №1:
Оценка эластичного поиска придает вес частоте терминов , длине поля. Как правило, более короткие поля оцениваются выше, но частота терминов может компенсировать это.
Вы можете использовать уникальный фильтр для создания уникальных маркеров для текста. Таким образом, многократное появление одного и того же токена не повлияет на подсчет очков.
Отображение
{
"mappings": {
"properties": {
"text": {
"type": "text",
"analyzer": "my_analyzer"
}
}
},
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"filter": [
"unique", "lowercase"
]
}
}
}
}
}
Анализировать
GET index29/_analyze
{
"text": "Apple Apple",
"analyzer": "my_analyzer"
}
Результат
{
"tokens" : [
{
"token" : "apple",
"start_offset" : 0,
"end_offset" : 5,
"type" : "<ALPHANUM>",
"position" : 0
}
]
}
Генерируется только один токен, даже если apple появляется дважды.