Elasticsearch: несколько неполных слов, набранных недостаточно - PullRequest
2 голосов
/ 29 сентября 2019

, поэтому я пытаюсь получить хорошие результаты поиска из установки Elasticsearch.
Но у меня возникают проблемы, когда я пытаюсь сделать нечеткий поиск по некоторым очень простым данным.
Как-то несколько (некоторыеиз них частично) слова оцениваются слишком низко и оцениваются только выше, когда в поисковом запросе присутствует больше букв слова.

Позвольте мне объяснить:
У меня есть простой индекс, построенный из двух простыхдокументы.

{
    "name": "Product with good qualities and awesome sound system"
},
{
    "name": "Another Product that has better acustics than the other one"
}

Теперь я запрашиваю индекс с такими параметрами:

{
    "query": {
        "multi_match": {
            "fields": ["name"],
            "query": "product acust",
            "fuzziness": "auto"
        }
    }
}

И результаты выглядят так:

"hits": [
        {
            "_index": "test_products",
            "_type": "_doc",
            "_id": "1",
            "_score": 0.19100355,
            "_source": {
                "name": "Product with good qualities and awesome sound system"
            }
        },
        {
            "_index": "test_products",
            "_type": "_doc",
            "_id": "2",
            "_score": 0.17439455,
            "_source": {
                "name": "Another Product that has better acustics than the other one"
            }
        }
    ]

Как вы можете видеть продукт сID 2 оценивается меньше, чем другой продукт, хотя он, возможно, имеет больше сходства с данной строкой запроса, чем другой продукт, потому что он имеет 1 совпадение полного слова и 1 совпадение частичного слова.
Когда запрос будет выглядеть как "productacusti "результаты начнут вести себя правильно.
Я уже возился с поиском bool, но результаты идентичны.

Есть идеи, как вернуть желаемые результаты быстрее, чем вводить почти все второе слово?

1 Ответ

2 голосов
/ 29 сентября 2019

Насколько я знаю, Elasticsearch не выполняет частичное сопоставление слов по умолчанию, поэтому термин acust не совпадает ни в одном из ваших документов.

Причина, по которой вы получаете более высокий балл в первом документе, заключается в том, что ваш соответствующий термин product представлен в более коротком предложении:

Продукт с хорошими качествами и потрясающим звучаниемsystem

Но что касается второго документа, product появляется в более длинном предложении:

Другой продукт, который имеет лучшую акустику, чем другой

Таким образом, ваш второй документ получает более низкий балл, потому что отношение вашего термина соответствия (продукта) к числу терминов в предложении ниже.

Другими словами, имеет более низкое значение Нормализация длины поля :

norm = 1/sqrt(numFieldTerms)

Теперь, если вы хотите выполнять частичное сопоставление префиксов, вам нужночтобы разбить ваш термин на нграмм , например, вы можете создать следующие нграммы для термина «акустика»:

«ac», «aco», «acou», «acous»,"acoust", "acousti", "акустика", "акустика"

У вас есть 2 варианта для достижения этой цели, см. ответ Russ Cam на этот вопрос

  1. использовать Анализ API с анализатором, который будет разбивать поле на токены / термины, из которых вы хотите получить частичное совпадение префикса, и индексировать эту коллекцию в качестве входных данных для завершения.поле.Стандартный анализатор может быть хорошим для начала ...

  2. Не используйте здесь подсказку для завершения, а вместо этого настройте свое поле (имя) как текстовый тип данных с несколько полей , которые включают различные способы анализа имени (или не анализа, например, с помощью подполя ключевого слова).Потратьте некоторое время с API Analyze, чтобы создать анализатор, который позволит использовать частичный префикс терминов в любом месте имени.Для начала, что-то вроде стандартного токенайзера, строчного фильтра токенов, фильтра токенов Edgengram и, возможно, фильтра стоп-токенов заставит вас работать ...

Вы также можете найти это руководство полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...