Как добавить «контекст» в предложения Elastic Search - PullRequest
0 голосов
/ 15 мая 2018

Я строю корпоративную социальную сеть.

Я хочу предложить людям добавить в друзья в зависимости от их названия. Например, значение может быть: разработчик, блогер, певец, парикмахер, бармен ...

Мои пользователи сохраняются в ElasticSearch, их заголовки сохраняются в поле 'title'.

Текущее отображение:

title: {
    type: 'text',
    analyzer: 'autocomplete_analyzer',
    search_analyzer: 'autocomplete_analyzer_search'
}

и запрос:

should: [
    {
        match: {
            title: {
                query: user.title,
                minimum_should_match: '90%',
                boost: 2
            }
        }
    }
]

и определения анализаторов:

indexConfig: {
    settings: {
        analysis: {
            analyzer: {
                autocomplete_analyzer: {
                    tokenizer: 'autocomplete_tokenizer',
                    filter: ['lowercase', 'asciifolding']
                },
                autocomplete_analyzer_search: {
                    tokenizer: 'lowercase',
                    filter: ['asciifolding']
                },
                phrase_analyzer: {
                    tokenizer: 'standard',
                    filter: ['lowercase', 'asciifolding', 'fr_stop', 'fr_stemmer', 'en_stop', 'en_stemmer']
                },
                derivative_analyzer: {
                    tokenizer: 'standard',
                    filter: ['lowercase', 'asciifolding', 'derivative_filter', 'fr_stop', 'fr_stemmer', 'en_stop', 'en_stemmer']
                }
            },
            tokenizer: {
                autocomplete_tokenizer: {
                    type: 'edge_ngram',
                    min_gram: 2,
                    max_gram: 20,
                    token_chars: ['letter', 'digit']
                }
            },
            filter: {
                derivative_filter: {
                    type: 'word_delimiter',
                    generate_word_parts: true,
                    catenate_words: true,
                    catenate_numbers: true,
                    catenate_all: true,
                    split_on_case_change: true,
                    preserve_original: true,
                    split_on_numerics: true,
                    stem_english_possessive: true
                },
                en_stop: {
                    type: 'stop',
                    stopwords: '_english_'
                },
                en_stemmer: {
                    type: 'stemmer',
                    language: 'light_english'
                },
                fr_stop: {
                    type: 'stop',
                    stopwords: '_french_'
                },
                fr_stemmer: {
                    type: 'stemmer',
                    language: 'light_french'
                }
            }
        }
    }
}

Я проверил, релевантность очень хорошая, но им не хватает пользователей, соответствующих этому, из-за критериев '90%' .

Быстрое и грязное решение - понизить этот критерий до 50%.

Однако, если я это сделаю, я предполагаю, что Elastic будет искать заголовки на основе соответствия букв в названии, а не на соответствие близости между заголовками.

Например, если мой пользователь « парикмахер », ElasticSearch может предложить « бармен », потому что у них есть общее: b, a, r, e , г

Следовательно, у меня есть два вопроса:

1 - верно ли мое предположение?

2 - что я могу сделать, чтобы повысить релевантность при поиске по названию?

1 Ответ

0 голосов
/ 17 мая 2018

Проблема с вашим поиском заключается в следующем: он использует autocomplete_analyzer, который в основном создает огромный индекс с большим количеством n-грамм.

Примером для bartender будет что-то вроде ba, bar, bart и т. Д. Как вы могли видеть, для barber у вас будет немного похожих n-грамм, которые могли бы соответствовать.

Что касается ваших вопросов, если вы понизите minimum_should_match, вы получите больше результатов, но это только потому, что следующая процедура сопоставления приведет к частичным совпадениям.

Для повышения релевантности - я бы порекомендовал использовать другой анализатор, поскольку этот n-граммовый анализатор обычно подходит только для autosuggest функциональности, что не так. Может быть несколько вариантов: от простого * до 1017 * анализатор ключевых слов или пробел один.

Что было бы важнее, так это правильно составить запрос. Например, если пользователь ищет частичный заголовок, например, bar, вы можете использовать префикс запроса . Однако, если вы ищете по полному совпадению (например, developer или bartender), было бы более важно просто правильно нормализовать поле заголовка. Например. использовать строчный анализатор с некоторым основанием.

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