Requête regex Titan ES sur un champ tokenisé ?
-
21-12-2019 - |
Question
J'utilise Titan 0.4.0 et j'essaie d'utiliser la dernière version REGEX
opérateur pour la recherche de chaîne ES.
J'ai créé un index sur my_key
pour mon index ES nommé search
.
gremlin> g.makeKey("my_key").dataType(String.class).indexed("search",Vertex.class).single().make()
==>v[82]
Ensuite j'ajoute un sommet :
gremlin> v = g.addVertex(null, ["my_key":"123-abc"])
==>v[8]
gremlin> v.map
==>{my_key=123-abc}
Le REGEX
ça a l'air de fonctionner...
gremlin> g.query().has("my_key", REGEX, "[12]{2}3").vertices()
==>v[8]
...mais seulement sur mon token "123"
et "abc"
indépendamment:
gremlin> g.query().has("my_key", REGEX, "123").vertices()
==>v[8]
gremlin> g.query().has("my_key", REGEX, "abc").vertices()
==>v[8]
Cependant, si j'essaie d'exécuter une expression régulière qui correspond à ma valeur complète, mon sommet n'est pas récupéré (aucun des résultats ci-dessous ne renvoie) :
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()
Existe-t-il un moyen dans Titan d'interroger l'index de cette manière (regex sans termes tokenisés/analysés) ?
La solution
La façon dont cela était géré dans Titan jusqu'à la version 0.4.0 peut être un peu déroutante, car les chaînes sont toujours tokenisées lorsqu'elles sont indexées dans un backend d'indexation externe.Cela conduit à ce que les chaînes soient "découpées" en mots et que les caractères autres que des lettres (ainsi que les mots vides) soient ignorés.
Dans la prochaine version de Titan 0.4.1, nous rendons cela plus explicite.Jetez un œil à la documentation mise à jour :https://github.com/thinkaurelius/titan/wiki/Full-Text-and-String-Search
L'essentiel:Vous pouvez maintenant spécifier si vous souhaitez que vos chaînes soient indexées « telles quelles » ou sous forme de sac de mots après analyse.Pour votre cas d'utilisation, ce serait le premier.Nous avons également clarifié la terminologie :Si vous recherchez des mots dans une chaîne correspondant à une expression régulière, le prédicat Text.CONTAINS_REGEX est utilisé.Si vous souhaitez que la chaîne entière corresponde à une expression, utilisez Text.REGEX.
Titan 0.4.1 est actuellement en avant-première finale et sera publié la semaine prochaine.