match_phrase - phrase elasticsearch
ElasticSearch cómo usar multi_match con comodín (4)
Tengo objeto Usuario con propiedades Nombre y Apellido. Quiero buscar en estos campos usando una consulta, y encontré multi_match en la documentación, pero no sé cómo usarlo correctamente con comodín. ¿Es posible?
Intenté con una consulta multi_match pero no funcionó:
{
"query": {
"multi_match": {
"query": "*mar*",
"fields": [
"user.name",
"user.surname"
]
}
}
}
Acabo de hacer esto ahora:
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
}
}
}
Alternativamente, podría usar una consulta query_string
con comodines.
"query": {
"query_string": {
"query": "*mar*",
"fields": ["user.name", "user.surname"]
}
}
Esto será más lento que usar un filtro nGram en tiempo de indexación (ver mi otra respuesta), pero si está buscando una solución rápida y sucia ...
Además, no estoy seguro acerca de su mapeo, pero si está utilizando user.name
lugar de name
su mapeo debe verse así:
"your_type_name_here": {
"properties": {
"user": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"surname": {
"type": "string"
}
}
}
}
}
No usaría comodines, no escalará bien. Usted está pidiendo mucho del motor de búsqueda en el momento de la consulta. Puede usar el filtro nGram para hacer el procesamiento en tiempo de indexación y no de búsqueda.
Vea esta discusión sobre el filtro nGram.
Después de indexar el name
y el surname
correctamente (cambie su asignación, hay ejemplos en el enlace de arriba) puede usar combinaciones múltiples pero sin comodines y obtener los resultados esperados.
Tal consulta funcionó para mí:
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"should": [
{"query": {"wildcard": {"user.name": {"value": "*mar*"}}}},
{"query": {"wildcard": {"user.surname": {"value": "*mar*"}}}}
]
}
}
}
}
}
Similar a lo que estás haciendo, excepto que en mi caso podría haber máscaras diferentes para diferentes campos.