Mam JSON, który wygląda tak: Nazwijmy tej dziedzinie Metadaneindeksowania/Searching „kompleks” JSON w elasticsearch
{
"somekey1": "val1",
"someotherkey2": "val2",
"more_data": {
"contains_more": [
{
"foo": "val5",
"bar": "val6"
},
{
"foo": "val66",
"baz": "val44"
},
],
"even_more": {
"foz" : 1234,
}
}
}
Jest to tylko prosty przykład. Prawdziwy może stać się jeszcze bardziej złożony. Klawisze mogą pojawiać się wiele razy. Wartości również i mogą być int lub str.
Teraz pierwszy problem polega na tym, że nie jestem do końca pewien, jak poprawnie indeksować to w elastycznym wyszukiwaniu, aby móc znaleźć coś konkretnego.
Używam Django/Haystack gdzie indeks wygląda następująco:
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
a Szablon:
{
"foo": {{ object.foo }},
"metadata": {{ object.metadata}},
# and some more
}
Metadane zostaną wypełnione próbki powyżej, a wynik będzie wyglądać w następujący sposób:
{
"foo": "someValue",
"metadata": {
"somekey1": "val1",
"someotherkey2": "val2",
"more_data": {
"contains_more": [
{
"foo": "val5",
"bar": "val6"
},
{
"foo": "val66",
"baz": "val44"
},
],
"even_more": {
"foz" : 1234,
}
}
},
}
Który przejdzie do kolumny "tekst" w elastycznym wyszuku.
Więc celem jest teraz, aby móc sprawdzić takie rzeczy jak:
- foo: val5
- Foz: 12 *
- bar: val *
- somekey1: val1
- i tak dalej:
Drugi problem: Gdy szukam np. dla foo: val5 pasuje do wszystkich obiektów, które mają klucz "foo" i wszystkie obiekty, które mają wartość val5 gdzie indziej w swojej strukturze.
ten sposób mogę szukać w Django:
self.searchqueryset.auto_query(self.cleaned_data['q'])
Czasami wyniki są „okayish” kiedyś to po prostu całkowicie bezużyteczne.
Mogę potrzebować wskazówki we właściwym kierunku i poznać błędy, które tu popełniłem. Dziękuję Ci!
Edytuj: Dodałem moje ostateczne rozwiązanie jako odpowiedź poniżej!
Wstęp: Nie jestem użytkownikiem django, tylko ES. Zgaduję: pole 'content' jest wypełnione wszystkimi danymi, uniemożliwiając dopasowywanie do konkretnego pola.Jeśli chcesz tego, musisz wyrazić to w swoim filtrze/zapytaniach (ale domyślam się, że nie używasz 'auto_query'). – mark
ma swoje pole metadanych zawsze taką samą strukturę? –
@juliendangers Czasami ma więcej pól lub zawiera wiele elementów w tablicy I czasami nie ma tablic i może być całkiem płaski. Jednak klucze są znane wcześniej i mogą istnieć np. do 30+ różnych – daddz