Elasticsearch copy_to не работает в поле ключевого слова - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь скопировать два поля в третье поле, которое должно иметь тип «ключевое слово» (потому что я хочу иметь возможность агрегировать его, и не нужно выполнять полнотекстовый поиск)

PUT /test/_mapping/_doc
{
  "properties": {
    "first": {
      "copy_to": "full_name",
      "type": "keyword"
    },
    "last": {
      "copy_to": "full_name",
      "type": "keyword"
    },
    "full_name": {
      "type": "keyword"
    }
  }
}

Затем я публикую новый документ:

POST /test/_doc
{
  "first": "Bar",
  "last": "Foo"
}

И запрашиваю его, используя составное поле full_name:

GET /test2/_search
{
  "query": {
    "match": {
      "full_name": "Bar Foo" 
    }
  }
}

И обращения не возвращаются.

Если тип составного поля full_name был text, то он работает как ожидалось и описано в документации:

https://www.elastic.co/guide/en/elasticsearch/reference/current/copy-to.html

Не возможно ли скопироватьв поле типа ключевого слова?

1 Ответ

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

Проблема в том, что вы используете запрос match - при индексации ваших документов вы используете тип ключевого слова, который в соответствии с документацией ES"... доступен только для поиска по их точному значению".

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

В этом случае у меня есть несколько вариантов:

  1. Измените тип поля на text, который будет выполнять тот же анализ, что и запрос match.
  2. Создатьпользовательский тип поля с пользовательским анализатором, который будет выполнять нижний регистр
  3. Не запрашивать более одного термина за один раз и использовать term запрос вместо match
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...