Requêtes ElasticSearch et Regex
Je suis en train de requête pour les documents qui ont des dates dans le corps de la "contenu" sur le terrain.
curl -XGET 'http://localhost:9200/index/_search' -d '{
"query": {
"regexp": {
"content": "^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((19|20)\\d\\d)$"
}
}
}'
Se rapprocher peut-être?
curl -XGET 'http://localhost:9200/index/_search' -d '{
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"regexp":{
"content" : "^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((19|20)\\d\\d)$"
}
}
}
}'
Ma regex semble avoir été éteint. Cette expression a été validé sur regex101.com La requête suivante retourne encore rien de la 175k documents que j'ai.
curl -XPOST 'http://localhost:9200/index/_search?pretty=true' -d '{
"query": {
"regexp":{
"content" : "/[0-9]{4}-[0-9]{2}-[0-9]{2}|[0-9]{2}-[0-9]{2}-[0-9]{4}|[0-9]{2}/[0-9]{2}/[0-9]{4}|[0-9]{4}/[0-9]{2}/[0-9]{2}/g"
}
}
}'
Je commence à penser que mon index ne peut pas être configuré pour une telle requête. Ce type de champ, vous avez à utiliser pour être en mesure d'utiliser les expressions régulières?
mappings: {
doc: {
properties: {
content: {
type: string
}title: {
type: string
}host: {
type: string
}cache: {
type: string
}segment: {
type: string
}query: {
properties: {
match_all: {
type: object
}
}
}digest: {
type: string
}boost: {
type: string
}tstamp: {
format: dateOptionalTimetype: date
}url: {
type: string
}fields: {
type: string
}anchor: {
type: string
}
}
}
Je veux trouver tout enregistrement qui a une date et le graphique du volume de documents à cette date. Étape 1. est d'obtenir cette requête travail. Étape 2. sera de tirer les dates et les regrouper par eux en conséquence. Quelqu'un peut-il suggérer un moyen d'obtenir la première partie de travail que je sais que la deuxième partie sera vraiment difficile.
Merci!
source d'informationauteur aeupinhere
Vous devez vous connecter pour publier un commentaire.
Vous devriez lire Elasticsearch est Regexp Requête de la documentation attentivement, vous faites des hypothèses erronées au sujet de la façon dont les regexp requête fonctionne.
Probablement la chose la plus importante à comprendre ici est que la chaîne que vous essayez de match. Vous essayez de faire correspondre termespas l'ensemble de la chaîne. Si celle-ci est indexée avec StandardAnalyzer, comme je le soupçonne, vos dates seront séparés en plusieurs termes:
Vous ne pouvez correspondre à un seul, tout jeton avec une regexp requête.
Elasticsearch (et lucene) ne prennent pas en charge complète Perl-compatible syntaxe regex.
Dans votre premier couple d'exemples, vous utilisez des ancres,
^
et$
. Ce ne sont pas pris en charge. Votre regex doit correspondre à l'intégralité du jeton pour obtenir un match de toute façon, de sorte que les ancres ne sont pas nécessaires.Abréviation classes de personnages comme
\d
(ou\\d
) ne sont également pas pris en charge. Au lieu de\\d\\d
utilisez[0-9]{2}
.Dans votre dernière tentative, vous utilisez
/{regex}/g
qui n'est également pas pris en charge. Depuis votre regex doit correspondre à l'ensemble de la chaîne, l'indicateur global ne serait même pas de sens dans le contexte. Sauf si vous êtes en utilisant un analyseur de requête qui les utilise pour désigner une regex, votre regex ne doit pas être enveloppé par des barres obliques.(En passant: Comment fait un valider sur regex101? Vous avez un tas de sans échappement
/
s. Il se plaint à moi quand je l'ai essayer.)À soutenir ce type de requête sur un tel champ analysé, vous aurez probablement envie de regarder à la durée de requêtes, et en particulier Span Multiterm et Durée De Près De. Peut-être quelque chose comme: