2017-02-23 3 views
0

ich Dokumente, die wie folgt aussehen:ElasticSearch: einschließlich verschachtelter Felder in _all?

{"foo" : "blah blah blah", 
"bar" : "bla bla bla", 
"baz" : [{"href" : "someid"}, {"href" : "otherid"}, ...], 
... } 

ich eine Suche machen wollen, dass alle Dokumente findet, wo id in einer der href Subdokumente auftritt. Wenn ich baz.href im Mapping unanalyzed bin, kann ich nach baz.href mit einer Begriff Abfrage ganz gut suchen.

Was ich jedoch wirklich will, ist in der Lage, nach dieser ID zu suchen, egal wo sie auftritt. Es könnte in baz.href, quux.href oder whatever.href sein. Suchen in _all wäre vollkommen akzeptabel.

Allerdings kann ich einfach nicht funktionieren. Ich bekomme nie irgendwelche Ergebnisse, außer ich suche genau nach baz.href.

Ich versuchte Einstellung auf baz in der Zuordnung, ohne Erfolg. Ich habe versucht, es auf baz.href zu setzen, und das hat auch nicht funktioniert.

Ich weiß, ich könnte die IDs in einem separaten all_hrefs Feld in der obersten Ebene duplizieren, aber das sprengt die Dokumente unnötig, und scheint nur hässlich. Die Referenzlisten können ziemlich groß sein. Ich konnte auch meine eigenen Zuordnungen analysieren und alle href s dort finden, so dass ich alle href Felder explizit in der Abfrage auflisten konnte, aber wenn das Datenmodell wächst, wird das schließlich nicht mehr skalieren.

Hilfe?

Update: Die Zuordnung für das datasets Feld (und alle anderen Felder, die href s enthalten wie folgt aussieht):

"datasets" : { 
    "properties" : { 
     "href" : { 
     "include_in_all" : true, 
     "index" : "not_analyzed", 
     "type" : "string" 
     } 
    }, 
    "type" : "nested" 
}, 

Ich habe versucht, mit den nested fallen, und die include_in_all fallen, aber es macht keinen Unterschied. Als ich nested hatte, konnte ich eine verschachtelte Abfrage verwenden, aber die path muss auf datasets festgelegt werden, da * fehlschlägt, da nicht alle Felder verschachtelte Objekte enthalten.

Antwort

0

Mit Hilfe des mitgelieferten Mapping:

$ curl -XPOST 'localhost:9200/datasets/data?pretty=true' -d ' 
{ 
    "datasets" : { 
    "properties" : { 
     "href" : { 
     "include_in_all" : false, 
     "index" : "not_analyzed", 
     "type" : "string" 
     } 
    }, 
    "type" : "nested" 
    } 
}' 

Wenn ich diese Dokumente indiziert:

$ curl -XPOST 'localhost:9200/datasets/data' -d ' 
{ 
    "foo": "blah blah blah", 
    "bar": "bla bla bla", 
    "baz": [ 
    { 
     "href": "someid" 
    }, 
    { 
     "href": "otherid" 
    } 
    ], 
    "quux": { 
    "href": "thisid" 
    }, 
    "whatever": { 
    "href": "thatid" 
    } 
}' 
$ curl -XPOST 'localhost:9200/datasets/data' -d ' 
{ 
    "foo": "argh argh argh", 
    "bar": "arg arg arg", 
    "baz": [ 
    { 
     "href": "funkyid" 
    }, 
    { 
     "href": "thisid" 
    } 
    ], 
    "quux": { 
    "href": "hipsterid" 
    }, 
    "whatever": { 
    "href": "coolid" 
    } 
}' 

ich in der Lage war korrekt durch die href Feldern suchen:

$ curl -XPOST 'localhost:9200/datasets/data/_search?pretty=true' -d '{ 
    "query": { 
    "query_string": { 
     "query": "thisid", 
     "fields": ["*.href"] 
    } 
    } 
}' 

So, Sie müssen sie nicht im Feld _all indizieren.

Meine Tests wurden auf Elasticsearch 5.2.1 durchgeführt.

FYI, das ist, wo ich eine Lösung für die Frage gefunden: Searching term in subdocuments with elasticsearch

+0

Leider ist dies für mich nicht funktioniert. Der Unterschied ist, dass in meinem Fall die 'href'-Unterfelder' index: not_analyzed 'haben, was notwendig ist, um falsche Positive von ähnlichen IDs zu vermeiden. Ich habe '* .href' in der Begriffsabfrage versucht, aber das funktioniert nicht.Ich habe auch versucht, 'analyzer: keyword' in der' query_string'-Abfrage zu setzen, aber das hat auch nicht funktioniert. Vielen Dank für den Versuch! –

+1

Können Sie dann ein Beispiel für das Mapping, das Sie für diesen Index verwenden, ausgeben? Das würde helfen, das Problem zu reproduzieren und weiter zu helfen, es zu beheben. –

+0

Ich habe Ihren Vorschlag erneut mit 5.1 versucht, und ich bekomme Suchergebnisse, aber ich bekomme zu viele. Ich möchte nach ID suchen, aber die Suche findet ähnliche, aber nicht identische Werte. –

Verwandte Themen