ho qualche JSON che è simile al seguente: Chiamiamolo campo metadatiIndicizzazione/Cercasi "complesso" JSON in elasticsearch
{
"somekey1": "val1",
"someotherkey2": "val2",
"more_data": {
"contains_more": [
{
"foo": "val5",
"bar": "val6"
},
{
"foo": "val66",
"baz": "val44"
},
],
"even_more": {
"foz" : 1234,
}
}
}
Questo è solo un semplice esempio. Quello reale può diventare ancora più complesso. Le chiavi possono apparire più volte. Valori pure e può essere int o str.
Ora il primo problema è che non sono abbastanza sicuro di come indicarlo correttamente in elasticsearch in modo da poter trovare qualcosa con richieste specifiche.
Sto usando Django/Haystack dove l'indice si presenta così:
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
E il modello:
{
"foo": {{ object.foo }},
"metadata": {{ object.metadata}},
# and some more
}
I metadati sarà poi riempito con il campione di cui sopra e il risultato sarà In questo modo:
{
"foo": "someValue",
"metadata": {
"somekey1": "val1",
"someotherkey2": "val2",
"more_data": {
"contains_more": [
{
"foo": "val5",
"bar": "val6"
},
{
"foo": "val66",
"baz": "val44"
},
],
"even_more": {
"foz" : 1234,
}
}
},
}
Che entrerà nella colonna "testo" in elasticsearch.
Quindi l'obiettivo è ora di essere in grado di cercare le cose come:
- pippo: val5
- foz: 12 *
- bar: val *
- somekey1: val1
- e così via
Il secondo problema: Quando cerco ad es. per pippo: val5 corrisponde a tutti gli oggetti che hanno solo la chiave "pippo" e tutti gli oggetti che hanno il val5 da qualche altra parte nella sua struttura.
Questo è il modo che cerco in Django:
self.searchqueryset.auto_query(self.cleaned_data['q'])
A volte i risultati sono "esplose" a volte è solo completamente inutile.
Potrei avere bisogno di un puntatore nella giusta direzione e conoscere gli errori che ho fatto qui. Grazie!
Modifica: Ho aggiunto la mia soluzione finale come risposta qui sotto!
Prefazione: non sono un utente django, solo ES. La mia ipotesi: il campo 'content' è popolato con tutti i dati, rendendo impossibile fare corrispondenze specifiche per campo.Se lo desideri, devi esprimerlo nel filtro/query (ma la mia ipotesi è: non usare 'auto_query'). – mark
il tuo campo di metadati ha sempre la stessa struttura? –
@juliendangers A volte ha più campi o contiene più elementi nell'array E a volte non ci sono array e può essere piuttosto piatto. I tasti tuttavia sono noti prima e possono esserci per es. fino a 30+ diversi – daddz