Logotipo de Zephyrnet

Realizar búsquedas sin distinción de acentos con OpenSearch

Fecha:

A menudo necesitamos que nuestra búsqueda de texto sea independiente de los acentos. insensible a los acentos búsqueda, también llamada signos diacríticos-agnósticos búsqueda, es donde los resultados de búsqueda son los mismos para consultas que pueden o no contener caracteres latinos como à, è, Ê, ñ y ç. Los signos diacríticos son letras inglesas con acento para marcar una diferencia en la pronunciación. En los últimos años, las palabras con signos diacríticos se han infiltrado en el idioma inglés convencional, como café o protegido. ¡Pues touché! ¡OpenSearch tiene la respuesta!

OpenSearch es un paquete de software de código abierto escalable, flexible y extensible para su carga de trabajo de búsqueda. OpenSearch se puede implementar en tres modos diferentes: el OpenSearch de código abierto autoadministrado, el administrado Servicio Amazon OpenSearchy Amazon OpenSearch sin servidor. Los tres modos de implementación funcionan con Apache Lucene y ofrecen análisis de texto utilizando los analizadores de Lucene.

En esta publicación, demostramos cómo realizar una búsqueda sin distinción de acentos usando OpenSearch para manejar signos diacríticos.

Resumen de la solución

Los analizadores de Lucene son bibliotecas de Java que se utilizan para analizar texto mientras se indexan y buscan documentos. Estos analizadores consisten en tokenizadores y filtros. Los tokenizadores dividen el texto entrante en uno o más tokens y los filtros se utilizan para transformar los tokens modificando o eliminando los caracteres innecesarios.

OpenSearch admite analizadores personalizados, que le permiten configurar diferentes combinaciones de tokenizadores y filtros. Puede consistir en filtros de caracteres, tokenizadores y filtros de tokens. Para habilitar nuestra búsqueda insensible a los signos diacríticos, configuramos analizadores personalizados que utilizan el filtro de token plegable ASCII.

ASCIIFolding es un método utilizado para convertir caracteres Unicode alfabéticos, numéricos y simbólicos que no están en los primeros 127 caracteres ASCII (el bloque Unicode latino básico) en sus equivalentes ASCII, si existe alguno. Por ejemplo, el filtro cambia "à" a "a". Esto permite que los motores de búsqueda devuelvan resultados independientemente del acento.

En esta publicación, configuramos la búsqueda sin distinción de acentos mediante el filtro ASCIIFolding admitido en OpenSearch Service. Procesamos un conjunto de nombres de películas europeas con signos diacríticos y verificamos los resultados de búsqueda con y sin signos diacríticos.

Crear un índice con un analizador personalizado

Primero creamos el índice asciifold_movies con analizador personalizado custom_asciifolding:

PUT /asciifold_movies
{ "settings": { "analysis": { "analyzer": { "custom_asciifolding": { "tokenizer": "standard", "filter": [ "my_ascii_folding" ] } }, "filter": { "my_ascii_folding": { "type": "asciifolding", "preserve_original": true } } } }, "mappings": { "properties": { "title": { "type": "text", "analyzer": "custom_asciifolding", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } }
}

Ingerir datos de muestra

A continuación, ingerimos datos de muestra con caracteres latinos en el índice asciifold_movies:

POST _bulk
{ "index" : { "_index" : "asciifold_movies", "_id":"1"} }
{ "title" : "Jour de fête"}
{ "index" : { "_index" : "asciifold_movies", "_id":"2"} }
{ "title" : "La gloire de mon père" }
{ "index" : { "_index" : "asciifold_movies", "_id":"3"} }
{ "title" : "Le roi et l’oiseau" }
{ "index" : { "_index" : "asciifold_movies", "_id":"4"} }
{ "title" : "Être et avoir" }
{ "index" : { "_index" : "asciifold_movies", "_id":"5"} }
{ "title" : "Kirikou et la sorcière"}
{ "index" : { "_index" : "asciifold_movies", "_id":"6"} }
{ "title" : "Señora Acero"}
{ "index" : { "_index" : "asciifold_movies", "_id":"7"} }
{ "title" : "Señora garçon"}
{ "index" : { "_index" : "asciifold_movies", "_id":"8"} }
{ "title" : "Jour de fete"}

consulta el indice

Ahora consultamos el asciifold_movies índice de palabras con y sin caracteres latinos.

Nuestra primera consulta utiliza un carácter acentuado:

GET asciifold_movies/_search
{
  "query": {
    "match": {
      "title": "fête"
    }
  }
}

Nuestra segunda consulta utiliza la ortografía de la misma palabra sin el acento:

GET asciifold_movies/_search
{
  "query": {
    "match": {
      "title": "fete"
    }
  }
}

En las consultas anteriores, los términos de búsqueda “fête” y “fete” devuelven los mismos resultados:

{ "took": 10, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 2, "relation": "eq" }, "max_score": 0.7361701, "hits": [ { "_index": "asciifold_movies", "_id": "8", "_score": 0.7361701, "_source": { "title": "Jour de fete" } }, { "_index": "asciifold_movies", "_id": "1", "_score": 0.42547938, "_source": { "title": "Jour de fête" } } ] }
}

Del mismo modo, intente comparar los resultados de "señora" y "senora" o "sorcière" y "sorciere". Los resultados que no distinguen los acentos se deben al filtro ASCII Folding que se usa con los analizadores personalizados.

Habilitar agregaciones para campos con acentos

Ahora que hemos habilitado la búsqueda insensible a los acentos, veamos cómo podemos hacer que las agregaciones funcionen con acentos.

Pruebe la siguiente consulta en el índice:

GET asciifold_movies/_search
{
  "size": 0,
  "aggs": {
    "test": {
      "terms": {
        "field": "title.keyword"
      }
    }
  }
}

Obtenemos la siguiente respuesta:

"aggregations" : { "test" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : "Jour de fete", "doc_count" : 1 }, { "key" : "Jour de fête", "doc_count" : 1 }, { "key" : "Kirikou et la sorcière", "doc_count" : 1 }, { "key" : "La gloire de mon père", "doc_count" : 1 }, { "key" : "Le roi et l’oiseau", "doc_count" : 1 }, { "key" : "Señora Acero", "doc_count" : 1 }, { "key" : "Señora garçon", "doc_count" : 1 }, { "key" : "Être et avoir", "doc_count" : 1 } ] } }

Cree agregaciones insensibles a los acentos usando un normalizador

En el ejemplo anterior, la agregación devuelve dos cubos diferentes, uno para "Jour de fête" y otro para "Jour de fete". Podemos habilitar agregaciones para crear un cubo para el campo, independientemente de los signos diacríticos. Esto se logra usando el filtro normalizador.

El normalizador admite un subconjunto de filtros de caracteres y tokens. Usando solo los valores predeterminados, el filtro normalizador es una forma sencilla de estandarizar el texto Unicode en una forma independiente del idioma para la búsqueda, estandarizando así diferentes formas del mismo carácter en Unicode y permitiendo agregaciones diacríticas-agnósticas.

Modifiquemos la asignación de índice para incluir el normalizador. Elimine el índice anterior, luego cree un nuevo índice con la siguiente asignación e ingiera el mismo conjunto de datos:

PUT /asciifold_movies
{
  "settings": {
    "analysis": {
      "analyzer": {
        "custom_asciifolding": {
          "tokenizer": "standard",
          "filter": [
            "my_ascii_folding"
          ]
        }
      },
      "filter": {
        "my_ascii_folding": {
          "type": "asciifolding",
          "preserve_original": true
        }
      },
      "normalizer": {
        "custom_normalizer": {
          "type": "custom",
          "filter": "asciifolding"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "custom_asciifolding",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256,
            "normalizer": "custom_normalizer"
          }
        }
      }
    }
  }
}

Después de ingerir el mismo conjunto de datos, intente la siguiente consulta:

GET asciifold_movies/_search
{
  "size": 0,
  "aggs": {
    "test": {
      "terms": {
        "field": "title.keyword"
      }
    }
  }
}

Obtenemos los siguientes resultados:

"aggregations" : {
    "test" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "Jour de fete",
          "doc_count" : 2
        },
        {
          "key" : "Etre et avoir",
          "doc_count" : 1
        },
        {
          "key" : "Kirikou et la sorciere",
          "doc_count" : 1
        },
        {
          "key" : "La gloire de mon pere",
          "doc_count" : 1
        },
        {
          "key" : "Le roi et l'oiseau",
          "doc_count" : 1
        },
        {
          "key" : "Senora Acero",
          "doc_count" : 1
        },
        {
          "key" : "Senora garcon",
          "doc_count" : 1
        }
      ]
    }
  }

Ahora comparamos los resultados y podemos ver que las agregaciones con el término "Jour de fête" y "Jour de fete" se agrupan en un depósito con doc_count=2.

Resumen

En esta publicación, mostramos cómo habilitar la búsqueda y las agregaciones que no distinguen acentos mediante el diseño de la asignación de índices para hacer el plegado ASCII para los tokens de búsqueda y normalizar el campo de palabras clave para las agregaciones. Puede usar el DSL de consulta de OpenSearch para implementar un gama de funciones de búsqueda, proporcionando una base flexible para aplicaciones de búsqueda estructuradas y no estructuradas. La comunidad OpenSearch de código abierto también ha ampliado el producto para habilitar el soporte para el procesamiento de lenguaje natural, algoritmos de aprendizaje automático, diccionarios personalizados y una amplia variedad de otros complementos.

Si tiene comentarios sobre esta publicación, envíelos en la sección de comentarios. Si tiene preguntas sobre esta publicación, inicie un nuevo hilo en el Foro del servicio Amazon OpenSearch or póngase en contacto con el soporte de AWS.


Sobre la autora

Aruna Govindaraju es un arquitecto de soluciones especializado en Amazon OpenSearch y ha trabajado con muchos motores de búsqueda comerciales y de código abierto. Le apasiona la búsqueda, la relevancia y la experiencia del usuario. Su experiencia en la correlación de las señales del usuario final con el comportamiento del motor de búsqueda ha ayudado a muchos clientes a mejorar su experiencia de búsqueda. Su pasatiempo favorito es caminar por los senderos y las montañas de Nueva Inglaterra.

punto_img

Información más reciente

punto_img