Consulta de coincidencia exacta de Elasticsearch (no difusa)
Tengo la siguiente consulta sobre un campo de cadena:
const query = {
"query": {
"match_phrase": {
name: "ron"
}
},
"from": 0,
"size": 10
};
estos son los nombres que tengo en la base de datos
1. "ron"
2. "ron martin"
3. "ron ron"
4. "ron howard"
el resultado de esta consulta es muy difuso, se devuelven todas las filas en lugar de la fila número 1 solamente. Es como si estuviera interpretando "contiene" en lugar de "es igual".
Gracias
Respuestas
En su caso, todos los documentos están regresando, porque todos los documentos tienen ronen ellos.
Si desea que solo coincida el campo exacto, debe agregar un keywordsubcampo al namecampo. Esto usa el analizador de palabras clave en lugar del analizador estándar (observe el campo ".keyword"después de" name). Pruebe la siguiente consulta:
Mapeo de índices:
{
"mappings": {
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
Datos de índice:
{
"name":"ron"
}
{
"name":"ron martin"
}
{
"name":"ron ron"
}
{
"name":"ron howard"
}
{
"name": "john howard"
}
Consulta de busqueda:
{
"query": {
"match_phrase": {
"name.keyword": "ron"
}
},
"from": 0,
"size": 10
}
Resultado de búsqueda:
"hits": [
{
"_index": "64982377",
"_type": "_doc",
"_id": "1",
"_score": 1.2039728,
"_source": {
"name": "ron"
}
}
]
Actualización 1:
Según los comentarios a continuación, si desea buscar tanto la coincidencia exacta como la coincidencia aproximada (de acuerdo con sus requisitos), puede usar la consulta de coincidencia múltiple .
Consulta de busqueda:
{
"query": {
"multi_match": {
"query": "howard",
"fields": [
"name",
"name.keyword"
],
"type": "phrase"
}
}
}
Resultado de búsqueda:
"hits": [
{
"_index": "64982377",
"_type": "_doc",
"_id": "4",
"_score": 0.83740485,
"_source": {
"name": "ron howard"
}
},
{
"_index": "64982377",
"_type": "_doc",
"_id": "5",
"_score": 0.83740485,
"_source": {
"name": "john howard"
}
}
]