2016-07-14 13 views
0

Ich habe ein paar Dinge in meinem elasticsearch_dsl Klasse, die ich für eine exakte Übereinstimmung abfragen möchten:Wie man auf nicht analysierten Feldern abfragt?

class Profile(DocType): 
    name = String(fields={'raw': String(index='not_analyzed')}) 

Während das funktioniert, ich brauche immer eine .raw auf die Abfrage hinzuzufügen und nicht name genau abfragen können:

# Matches "foo" and "foo-1" 
Profile.search().filter('term', name='foo'}) 
# Matches nothing 
Profile.search().filter('term', name='foo-1'}) 
# Matches what i want (only "foo-1") 
Profile.search().filter('term', **{'name.raw': 'foo-1'}) 

das fühlt sich irgendwie falsch, wie ich in der Lage sein sollte, nur name zu verwenden und nicht raw, weil es das gleiche sein soll.

Was ist der richtige Weg?

+0

Sie müssen nur Ihr Hauptfeld als "not_analyzed" indizieren, aber die bevorzugte Methode wäre ein "roher" Feld, wie Sie es jetzt haben. –

+0

Ich habe es als 'not_analyzed' indiziert, siehe DocType-Klasse, die ich angehängt habe. – shredding

Antwort

1

Nein, die richtige Art, es zu verwenden, ist mit name.raw, denn das ist das Feld, das not_analyzed ist. Wenn Sie nur name verwenden, verwenden Sie nicht die not_analyzed Version, Sie verwenden die analysierte Version mit dem standard Analysator.

Deshalb entspricht filter('term', name='foo'}) sowohl foo als auch foo-1.

Verwandte Themen