Как я вижу, ваше поле ref_num
имеет тип keyword
. Выполнение полнотекстовых запросов (например, match
или match_phrase
) не даст вам никаких результатов. Для keyword
-s вы должны использовать запросы уровня термина . Возможно, префикс запроса будет полезен для вас здесь.
Пример
Mapping
PUT /so54176561
{
"mappings": {
"_doc": {
"properties": {
"ref_num": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
}
Добавление образца документа
POST /so54176561/_doc/1
{
"ref_num": "I50263"
}
Полнотекстовый match
поиск по text
поле ввода
по всему значению
POST /so54176561/_search
{
"query": {
"match": {
"ref_num": "I50263"
}
}
}
Результат: документ найден
по префиксу значения
POST /so54176561/_search
{
"query": {
"match": {
"ref_num": "I50"
}
}
}
Результат: документ не найден
Срок уровня prefix
поиск по keyword
поле типа
POST /so54176561/_search
{
"query": {
"prefix": {
"ref_num.raw": "I50"
}
}
}
Результат: документ найден
Как видите, в примере я использовал такие подполя (raw
- это подполе ref_num
, но другого типа). В Elasticsearch он называется fields
, и больше об этом вы можете прочитать в документации .
Вы можете просто использовать запрос с любым другим запросом в любом другом поле, используя bool query .
Если вы хотите достичь того же результата в поле типа text
, вы должны правильно подготовить свой индекс. Например, вы можете использовать свой собственный анализатор с токенайзером NGram , который разбивает слова на токены n-граммы.
По умолчанию любой из анализаторов не разделяет слова, поэтому в вашем случае в индексе был только один токен:
POST /_analyze
{
"analyzer": "standard",
"text": "I50263"
}
Результат:
{
"tokens": [
{
"token": "i50263",
"start_offset": 0,
"end_offset": 6,
"type": "<ALPHANUM>",
"position": 0
}
]
}
Для полнотекстового поиска Elasticsearch базируется на токенах, которые есть в индексе. Если токены не совпадают с токенами из условия поиска, совпадение отсутствует.