Elasti c Ngram расставить приоритеты целые слова - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь создать автозаполнение с несколькими миллионами возможных значений. Мне удалось сделать это с помощью двух разных методов 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',
             }
          }
        }
    ]}
}

1 Ответ

0 голосов
/ 28 марта 2020

Попробуйте изменить запрос на что-то вроде этого -

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "semanticTag": "type"
          }
        },
        {
          "match_phrase_prefix": {
            "fieldName": {
              "query": "valueToSearch"
            }
          }
        }
      ]
    }
  }
}

Вы можете использовать match_phrase_prefix, с помощью этого пользователя не нужно будет вводить слово целиком, все, что пользователь вводит и запускает с индексированными полями данные будут возвращены.

Просто обратите внимание, что это также будет извлекать результаты из любых доступных средних слов из проиндексированных документов.
Например, если данные, проиндексированные в одном из полей, имеют вид - "lorem ipsum" и тип пользователя "ips", тогда вы получите весь этот документ вместе с другими документами, которые начинаются с "ips"

Вы можете go со стандартным или пользовательским анализатором, вы должны проверить, какой анализатор лучше подходит для вашего случая использования. Согласно имеющейся информации, приведенный выше подход хорошо работает с standard analyzer.

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