Elasticsearch - Рекурсивный вложенный объект JSON

Я пытаюсь разобрать HTML-документ на вложенный набор тегов и содержимого. Он должен поддерживать произвольную глубину вложенности. Объект (создан в Код Python) выглядит так:

{
  "content": [
    "some text about a thing, ",
  {"content": "More text with additional set of tags ",
  "tags": ["strong"]
  }
  ], 
  "tags": ["p"]
}

ES, похоже, не любит эту структуру, потому что поле content имеет как текстовый, так и объектный тип, вызывая эту ошибку; "reason": "mapper [content] of different type, current_type [text], merged_type [ObjectMapper]"

Есть ли у кого-нибудь идеи о том, как индексировать этот тип объекта, а также разрешить поиск как по тегам, так и по контенту? В идеале я бы тоже хотел искать по тегам, связанным с предками данного объекта. Я могу переформатировать его в

{
  "content": [
  {"content": "some text about a thing, "},
  {"content": "More text with a different set of tags ",
  "tags": ["strong"]
  }
  ], 
  "tags": ["p"]
}

Но тогда поиск не очень эффективен, так как мне нужно написать content.content: «строка поиска», чтобы получить результаты, что будет затруднительно с несколькими уровнями вложенности.

0
0
1 013
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Почему бы не хранить теги предков в отдельном поле? Реализация вложенного набора также должна решить вашу проблему.

Обновлено: по запросу здесь приводится пример вложенного набора

Представьте себе древовидную структуру. Каждый узел в этом дереве имеет набор свойств, таких как описание или другие атрибуты. Каждый узел также содержит ссылку на свой родительский узел. Рядом с ним есть два числа: левая и правая позиция в дереве при переходе с глубоким поиском:

A(parent:null, left:1, right:12, desc:“root node“)
B(parent:A, left:2, right:3, desc:“left child“)
C(parent:A, left:4, right:11, desc:“right child“)
D(parent:C, left:5, right:6, desc:“foo“)
E(parent:C, left:7, right:10, desc:“bar“)
F(parent:E, left:8, right:9, desc:“baz“)

Теперь легко вычислить всех предков узла:

предки (F для X) = поиск узлов как N WHERE N.left <X.left AND N.right> X.right

Для узла F вы получите [E, C, A]. Упорядочив их по левому значению, вы получите правильный порядок для предков F.

Итак, теперь вы можете использовать этот критерий для запроса фильтра в ES и использовать второй запрос для поиска в атрибутах отфильтрованных узлов.

Эта структура очень эффективна при поиске поддеревьев, но имеет недостатки при изменении порядка / положения узлов.

Если вам нужны дополнительные объяснения, добавьте комментарий.

Я не уверен, что это решит проблему, поскольку, похоже, это не позволяет мне искать документ по его предковому содержимому? Кроме того, я не уверен, решит ли это проблему, связанную с незнанием глубины вложения content.content при поиске.

analystic 31.10.2018 07:20

Возможно, если вы предоставите несколько примеров данных (и сопоставление, если правильное не создается автоматически), я пойму немного лучше. На данный момент я не могу найти никаких ссылок на вложенные наборы в документации ES.

analystic 31.10.2018 07:28

См. Развернутый ответ выше.

ibexit 31.10.2018 23:02

Я надеялся использовать некоторые из функций вложенного сопоставления ES, чтобы немного упростить это (т.е. избежать ручного создания полей левого / правого порядка в Python, если это не может быть как-то сделано с помощью анализатора ES?). Это почти похоже на то, что это больше подходит для отношений родитель / потомок, чем вложенное сопоставление? Я думаю, что это, вероятно, сработает, поэтому приму ответ, если не появятся лучшие варианты. Изменение порядка узлов и т. д. Не является серьезной проблемой, так как я счастлив полностью воссоздать документ.

analystic 01.11.2018 00:29

Из-за вашей рекурсивной структуры тегов html (без известной глубины) вам не повезет с вашим подходом. И даже если вы заставите его каким-то образом работать (помощь темной стороны или какой-нибудь vodoo), вы получите структуру, которую невозможно запросить / выполнить поиск. Попробуйте вложенный набор, и я обещаю, вы будете довольны легкостью этого подхода. Ваше здоровье!

ibexit 01.11.2018 08:53

Другие вопросы по теме