Ошибка, которую вы делаете, заключается в том, что вы используете запрос термина в поле ключевого слова, и они оба не анализируются, что означает, что они пытаются найти точно такую же строку поиска в инвертированном индексе.
Что вам следует сделать следующее: определить поле text
, которое у вас все равно будет, если вы не определили свое отображение. Я также предполагаю то же самое, что и в вашем запросе, который вы упомянули .keyword
, который создается автоматически, если вы не определяете сопоставление.
Теперь вы можете просто использовать ниже запрос соответствия , который анализируется и использует стандартный анализатор , который разбивает токен на пробелы, поэтому Anthropology
250
и 230
будут сгенерированы для ваших двух образцов документов.
Простой и эффективный запрос который приносит оба документа
{
"query": {
"match" : {
"name" : "Anthropology 230"
}
}
}
И результат поиска
"hits": [
{
"_index": "matchterm",
"_type": "_doc",
"_id": "1",
"_score": 0.8754687,
"_source": {
"name": "Anthropology 230"
}
},
{
"_index": "matchterm",
"_type": "_doc",
"_id": "2",
"_score": 0.18232156,
"_source": {
"name": "Anthropology 250"
}
}
]
Причина, по которой указанный выше запрос соответствует обоим документам, заключается в том, что он создал два токена anthropology
и 230
и соответствует anthropology
в обоих документах.
Вы обязательно должны прочитать о процессе анализа , а также можете попробовать анализировать API для просмотреть токены, созданные для любого текста.
Анализировать вывод API для вашего текста
POST http: // {{hostname}}: {{port}} / { {index-name}} / _ анализировать
{
"analyzer": "standard",
"text": "Anthropology 250"
}
{
"tokens": [
{
"token": "anthropology",
"start_offset": 0,
"end_offset": 12,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "250",
"start_offset": 13,
"end_offset": 16,
"type": "<NUM>",
"position": 1
}
]
}