У меня есть JSON, который выглядит следующим образом: Позвольте назвать эти метаданные полей
{
"somekey1": "val1",
"someotherkey2": "val2",
"more_data": {
"contains_more": [
{
"foo": "val5",
"bar": "val6"
},
{
"foo": "val66",
"baz": "val44"
},
],
"even_more": {
"foz" : 1234,
}
}
}
Это простой пример. Реальный может стать еще более сложным. Ключи могут появляться несколько раз. Значения также могут быть int или str.
Теперь первая проблема заключается в том, что я не совсем уверен, как мне правильно индексировать это в elasticsearch, чтобы я мог найти что-то с конкретными запросами.
Я использую Django/Haystack, где индекс выглядит следующим образом:
class FooIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
metadata = indexes.CharField(model_attr='get_metadata')
# and some more specific fields
И шаблон:
{
"foo": {{ object.foo }},
"metadata": {{ object.metadata}},
# and some more
}
Затем метаданные будут заполнены образцом выше, и результат будет выглядеть следующим образом:
{
"foo": "someValue",
"metadata": {
"somekey1": "val1",
"someotherkey2": "val2",
"more_data": {
"contains_more": [
{
"foo": "val5",
"bar": "val6"
},
{
"foo": "val66",
"baz": "val44"
},
],
"even_more": {
"foz" : 1234,
}
}
},
}
который войдет в столбец "текст" в elasticsearch.
Итак, теперь цель состоит в том, чтобы искать такие вещи, как:
- foo: val5
- foz: 12 *
- bar: val *
- somekey1: val1
- и т.д.
Вторая проблема: Когда я ищу, например. для foo: val5 он соответствует всем объектам, которые имеют только ключ "foo" и все объекты, имеющие val5 где-то еще в нем.
Вот как я ищу в Django:
self.searchqueryset.auto_query(self.cleaned_data['q'])
Иногда результаты "okayish" иногда просто бесполезны.
Мне может понадобиться указатель в правильном направлении и узнать ошибки, которые я сделал здесь. Спасибо!
Изменить: я добавил свое окончательное решение в качестве ответа ниже!