Есть ли JSON эквивалент фильтра html_strip? - PullRequest
1 голос
/ 22 января 2020

Мы получаем данные из форм заявки в JSON и должны иметь возможность искать по ним - но только текст, введенный пользователем. Некоторые из наших данных из других источников поступают как XML, и это нормально - символьный фильтр html_strip (https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-htmlstrip-charfilter.html) делает свою работу.

Но есть ли эквивалент для JSON - вы отправляете сериализованный JSON в виде текста, и он удаляет теги, просто оставляя данные?

Очень упрощенный c пример:

Форма заявки возвращает эти данные:

{
  "ed_hist1": "Glasgow High School",
  "ed_hist2": "Edinburgh University"
}

Это сериализуется и добавляется в наш документ в виде текстового поля:

{
  "Type": "applicationform",
  "Id": 1,
  "Name": "Margaret Blenkinsop",
  "Email": "JohnB232@myCompany.COM",
  "Text": "{\"ed_hist1\":\"Glasgow High School\",\"ed_hist2\":\"Edinburgh University\"}"
}

И отправляется в ES.

Когда я ищу текстовое поле Я не хочу, чтобы я мог найти "ed_hist1" или "ed_hist2" только "Среднюю школу Глазго" и "Эдинбургский университет".

Или это единственный способ предварительной обработки JSON? (Это нормально, но я не хочу вручную что-то кодировать, если ES позаботится об этом за меня.)

1 Ответ

0 голосов
/ 22 января 2020

Решение # 1

Есть несколько способов выполнить то, что вы хотите. Наиболее «идиоматическим» c способом было бы предварительно обработать JSON, исходящее из вашего приложения, преобразовав JSON do c, который у вас есть, в список.

EG:

{
  "ed_hist1": "Glasgow High School",
  "ed_hist2": "Edinburgh University"
}

становится

[
  "Glasgow High School",
  "Edinburgh University"
]

И тогда ваш документ будет выглядеть следующим образом:

{
  "Type": "applicationform",
  "Id": 1,
  "Name": "Margaret Blenkinsop",
  "Email": "JohnB232@myCompany.COM",
  "Text": ["Glasgow High School", "Edinburgh University"]
}

После этого вы можете выполнить поиск в поле Text для ed_hist, которым вы являетесь поиск и возврат документов, соответствующих вашему запросу et c. Это самое простое решение для вашего случая, но есть и другие способы структурирования ваших данных в зависимости от того, какие вопросы вы хотите задать.

Решение # 2

Вы, кажется, думаете Немного о том, как сохранить исходный документ JSON как текст в поле как часть другого документа. Без дополнительного контекста мне не особенно нравится это решение, но я полагаю, у вас есть свои причины. Для этого второго, не рекомендуемого варианта использования я бы использовал фильтры символов в дополнение к store, вводящему исходное значение поля. Процесс будет выглядеть следующим образом:

index document
original documented `store`d
custom char filter strips out the unwanted JSON language characters
text indexed

Во время запроса вы можете получить исходное сохраненное значение, но также использовать поиск по «полному тексту» текста, содержащегося в документе JSON после символов. были раздеты. Я действительно верю, что вы можете получить больше от ваших данных, если вы сделаете вариант решения № 1. Разбор HTML для текстового поиска - это хорошая идея для поиска в документах разметки, но разбор JSON не имеет смысла, поскольку JSON - это хлеб с маслом ES, и у вас будет больше инструментов для работы с JSON.

РЕДАКТИРОВАТЬ: я забыл сослаться на документацию store: https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-store.html

РЕДАКТИРОВАТЬ # 2: Дополнительное примечание поле _source, которое включено по умолчанию: https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-source-field.html Ваш оригинальный документ JSON также находится там бесплатно. Это может вернуть вам исходный документ, отправленный вами в ES, и в то же время предоставить вам более идиоматическую c структуру данных в БД.

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