Problème de tiret Elastic Search avec filtre de terme

J’ai la requête Elastic Search suivante avec seulement un terme filtre. Ma requête est beaucoup plus complexe mais j’essaie juste de montrer le problème ici.

{ "filter": { "term": { "field": "update-time" } } } 

Lorsque je transmets une valeur de trait d’union au filtre, je ne retrouve aucun résultat. Mais si j’essaie sans valeur sans réponse, j’obtiens des résultats. Je ne sais pas si le trait d’union est un problème ici, mais mon scénario me le fait croire.

Est-il possible d’échapper au trait d’union pour que le filtre renvoie des résultats? J’ai essayé d’échapper au trait d’union avec une barre oblique inversée que j’ai lue sur les forums de Lucene mais cela n’a pas aidé.

De plus, si je transmets une valeur GUID dans ce champ qui est entouré d’un trait d’union et entourée d’accolades, quelque chose comme – {ASD23-34SD-DFE1-42FWW}, aurais-je besoin de mettre les caractères alphabétiques en minuscule et les accolades frisés aussi?

Merci

Je suppose que votre champ est analysé, qui est le paramètre par défaut pour les champs de chaîne dans elasticsearch. Par conséquent, lorsqu’il est indexé, il n’est pas indexé en tant que terme “mise à jour” mais en tant que terme: “mise à jour” et “heure”. C’est pourquoi votre recherche de terme ne peut pas trouver ce terme. Si votre champ contient toujours des valeurs qui devront être mises en correspondance telles quelles, il serait préférable de définir ce champ dans le mappage comme non analysé. Vous pouvez le faire en recréant l’index avec un nouveau mappage:

 curl -XPUT http://localhost:9200/your-index -d '{ "mappings" : { "your-type" : { "properties" : { "field" : { "type": "ssortingng", "index" : "not_analyzed" } } } } }' curl -XPUT http://localhost:9200/your-index/your-type/1 -d '{ "field" : "update-time" }' curl -XPOST http://localhost:9200/your-index/your-type/_search -d'{ "filter": { "term": { "field": "update-time" } } }' 

Si vous souhaitez une certaine souplesse dans la recherche d’enregistrements basés sur ce champ, vous pouvez également parsingr ce champ et utiliser plutôt des requêtes textuelles:

 curl -XPOST http://localhost:9200/your-index/your-type/_search -d'{ "query": { "text": { "field": "update-time" } } }' 

S’il vous plaît, gardez à l’esprit que si votre champ est analysé, alors cet enregistrement sera trouvé en recherchant simplement le mot “mise à jour” ou le mot “temps”.

La réponse acceptée n’a pas fonctionné pour moi avec élastique 6.1. Je l’ai résolu en utilisant le champ “keyword” qu’élastique fournit par défaut sur les champs de chaîne.

 { "filter": { "term": { "field.keyword": "update-time" } } } 

Basé sur la réponse de @imotov Si vous utilisez spring-data-elasticsearch, il vous suffit de marquer votre champ comme suit :

 @Field(type = FieldType.Ssortingng, index = FieldIndex.not_analyzed) 

au lieu de

 @Field(type = FieldType.Ssortingng) 

Le problème est que vous devez supprimer l’index et le ré-instancier avec de nouveaux mappages.