ElasticSearch comment utiliser multi match avec Joker
J'ai l'utilisateur objet avec les propriétés Nom et prénom. Je veux rechercher dans ces champs en utilisant une requête, et j'ai trouvé multi_match dans la documentation, mais je ne sais pas comment l'utiliser correctement avec Joker. Est-il possible?
j'ai essayé avec une requête multi_match mais ça n'a pas marché:
{
"query": {
"multi_match": {
"query": "*mar*",
"fields": [
"user.name",
"user.surname"
]
}
}
}
4 réponses
vous pouvez aussi utiliser une requête query_string
avec des caractères génériques.
"query": {
"query_string": {
"query": "*mar*",
"fields": ["user.name", "user.surname"]
}
}
ce sera plus lent que d'utiliser un filtre nGram à l'index-temps (Voir mon autre réponse), mais si vous êtes à la recherche d'une solution rapide et sale...
aussi je ne suis pas sûr de votre cartographie, mais si vous utilisez user.name
au lieu de name
votre cartographie doit ressembler à ceci:
"your_type_name_here": {
"properties": {
"user": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"surname": {
"type": "string"
}
}
}
}
}
une telle requête a fonctionné pour moi:
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"should": [
{"query": {"wildcard": {"user.name": {"value": "*mar*"}}}},
{"query": {"wildcard": {"user.surname": {"value": "*mar*"}}}}
]
}
}
}
}
}
similaire à ce que vous faites, sauf que dans mon cas, il pourrait y avoir différents masques pour différents domaines.
je viens de faire ceci maintenant:
GET _search {
"query": {
"bool": {
"must": [
{
"range": {
"theDate": {
"gte": "2014-01-01",
"lte": "2014-12-31"
}
}
},
{
"match" : {
"Country": "USA"
}
}
],
"should": [
{
"wildcard" : { "Id_A" : "0*" }
},
{
"wildcard" : { "Id_B" : "0*" }
}
],"minimum_number_should_match": 1
}
}
}
Je n'utiliserais pas de caractères génériques, il ne sera pas à bonne échelle. Vous demandez beaucoup de moteur de recherche au moment de la requête. Vous pouvez utiliser le filtre nGram, pour faire le traitement à l'index-time et non à l'Heure de la recherche.
voir cette discussion sur le filtre nGram.
après avoir indexé les name
et surname
correctement (changer votre mapping, il ya des exemples dans le lien ci-dessus), vous pouvez utiliser multi-match, mais sans jokers et obtenir les résultats attendus.