Titan ES-Regex-Abfrage über tokenisiertes Feld?
-
21-12-2019 - |
Frage
Ich verwende Titan 0.4.0 und versuche, die neueste Version zu verwenden REGEX
Operator für die ES-Stringsuche.
Ich habe einen Index erstellt my_key
für meinen ES-Index mit dem Namen search
.
gremlin> g.makeKey("my_key").dataType(String.class).indexed("search",Vertex.class).single().make()
==>v[82]
Dann füge ich einen Scheitelpunkt hinzu:
gremlin> v = g.addVertex(null, ["my_key":"123-abc"])
==>v[8]
gremlin> v.map
==>{my_key=123-abc}
Der REGEX
scheint zu funktionieren...
gremlin> g.query().has("my_key", REGEX, "[12]{2}3").vertices()
==>v[8]
...aber nur auf meinem tokenisierten "123"
Und "abc"
unabhängig:
gremlin> g.query().has("my_key", REGEX, "123").vertices()
==>v[8]
gremlin> g.query().has("my_key", REGEX, "abc").vertices()
==>v[8]
Wenn ich jedoch versuche, einen regulären Ausdruck auszuführen, der meinem vollständigen Wert entspricht, wird mein Scheitelpunkt nicht abgerufen (keines der folgenden Ergebnisse wird zurückgegeben):
gremlin> g.query().has("my_key", REGEX, "123-abc").vertices()
gremlin> g.query().has("my_key", REGEX, "123.abc").vertices()
gremlin> g.query().has("my_key", REGEX, "[0-9]+.[abc]{3}").vertices()
gremlin> g.query().has("my_key", REGEX, "123.").vertices()
Gibt es in Titan eine Möglichkeit, den Index auf diese Weise abzufragen (Regex ohne tokenisierte/analysierte Begriffe)?
Lösung
Die Art und Weise, wie dies in Titan bis 0.4.0 gehandhabt wurde, kann etwas verwirrend sein, da Zeichenfolgen immer tokenisiert werden, wenn sie in einem externen Indexierungs-Backend indiziert werden.Dies führt dazu, dass Zeichenfolgen in Wörter „zerteilt“ werden und Nicht-Buchstaben-Zeichen (sowie Stoppwörter) ignoriert werden.
In der kommenden Version Titan 0.4.1 machen wir dies noch deutlicher.Schauen Sie sich die aktualisierte Dokumentation an:https://github.com/thinkaurelius/titan/wiki/Full-Text-and-String-Search
Das Wesentliche:Sie können jetzt angeben, ob Ihre Zeichenfolgen „wie sie sind“ oder nach der Analyse als Wortbeutel indiziert werden sollen.Für Ihren Anwendungsfall wäre es ersteres.Wir haben auch die Terminologie bereinigt:Wenn Sie nach Wörtern in einer Zeichenfolge suchen, die einem regulären Ausdruck entsprechen, wird das Prädikat Text.CONTAINS_REGEX verwendet.Wenn Sie möchten, dass die gesamte Zeichenfolge mit einem Ausdruck übereinstimmt, verwenden Sie Text.REGEX.
Titan 0.4.1 befindet sich derzeit in der finalen Vorschau und wird nächste Woche veröffentlicht.