Я пытаюсь создать автозаполнение с несколькими миллионами возможных значений. Мне удалось сделать это с помощью двух разных методов match и ngram. Проблема в том, что для соответствия требуется, чтобы пользователь набрал целые слова, а ngram возвращает плохие результаты. Есть ли способ вернуть результаты ngram только при отсутствии результатов совпадения?
Метод 1: сопоставление
Возвращает очень релевантные результаты, но требует, чтобы пользователь набрал полное слово
//mapping
analyzer: {
std_english: {
type: 'standard',
stopwords: '_english_',
},
}
//search
query: {
bool: {
must: [
{ term: { semanticTag: type } },
{ match: { search } }
]}
}
Метод 2: ngram
Возвращает плохие совпадения
//mapping
analysis: {
filter: {
autocomplete_filter: {
type: 'edge_ngram',
min_gram: 1,
max_gram: 20,
},
},
analyzer: {
autocomplete: {
type: 'custom',
tokenizer: 'standard',
filter: ['lowercase', 'autocomplete_filter'],
},
},
//search
query: {
bool: {
must: [
{ term: { semanticTag: type } },
{ match: {
term: {
query: search,
operator: 'and',
}
}
}
]}
}