elasticsearch, analizador spanish con filtro fonético

Pasos a seguir para crear un indice con un analizdor en español con reconocimiento de fonético.

Especialmente util si queremos buscar para un texto como este:

  • “Habia una vez un barquito chiquitito que navegaba ….”

palabras como

  • avia, nabegava

es decir, palabras mal escritas pero que se pronuncian igual.

Pasos previo necesarios

Instalar plugin

En cada nodo debemos instalar el plugin y reiniciar.

sudo bin/plugin install analysis-phonetic

Crear el indice y el mapping

curl -XDELETE http://localhost:9201/indice_fonetico

curl -XPUT http://localhost:9201/indice_fonetico

curl -XPOST http://localhost:9201/indice_fonetico/_close

curl -XPUT http://localhost:9201/indice_fonetico/_settings?pretty -d '{
  "analysis" : {
    "analyzer":{
      "spanish_no_accent": {
          "tokenizer": "standard",
          "filter":  [ "lowercase", "asciifolding", "spanish_stop", "filtro_fonetico", "spanish_stemmer" ]
          }
    },
    "filter" : {
            "spanish_stemmer" : {
                "type" : "stemmer",
                "name" : "spanish"
            },
            "spanish_stop": {
                             "type":        "stop",
                             "stopwords": [ "_spanish_" ]
      },
      "filtro_fonetico": {
          "type": "phonetic",
          "encoder": "beidermorse",
          "replace": false,
          "languageset": ["spanish"]
      }
          }
  }
}'

curl -XPOST http://localhost:9201/indice_fonetico/_open

curl -XPUT http://localhost:9201/indice_fonetico/_mapping/documento?pretty -d '{
"properties":{
  "documento":{
     "type":"string",
     "analyzer":"spanish_no_accent"
  }
 }
}'

Indexar datos y preparar una query

Indexamos un documento

PUT indice_fonetico/documento/1
{
  "documento": "Habia una vez un barquito chiquitito que navegaba ...."
}

Realizamos una búsqueda

  • avia

Query y respuesta

GET indice_fonetico/documento/_search
{
  "query": {
    "match": {
      "documento": {
        "query": "avia"
      }
    }
  }
}
{
  "took": 3,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1.7499999,
    "hits": [
      {
        "_index": "indice_fonetico",
        "_type": "documento",
        "_id": "4",
        "_score": 1.7499999,
        "_source": {
          "documento": "Habia una vez un barquito chiquitito que navegaba ...."
        }
      }
    ]
  }
}

Términos generados por este analizador

En cualquier momento podemos ver los términos que genera este analizador, para entender mejor las búsquedas que podemos realizar con este analizador y el nuevo filtro fonético.

Invocación del analizador

POST prueba_fonetica/_analyze
{
  "analyzer": "spanish_no_accent",
  "text":     "barquito"
}

Términos generados por el analizador

{
  "tokens": [
    {
      "token": "barkit",
      "start_offset": 0,
      "end_offset": 8,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "borkit",
      "start_offset": 0,
      "end_offset": 8,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "varkit",
      "start_offset": 0,
      "end_offset": 8,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "vorkit",
      "start_offset": 0,
      "end_offset": 8,
      "type": "<ALPHANUM>",
      "position": 0
    }
  ]
}

Para entender mejor el comportamiento de este filtro fonético podemos crear un analizador donde solamente tengamos como filtro el filtro fonético.

curl -XPUT http://localhost:9201/indice_fonetico/_settings?pretty -d '{
  "analysis" : {
    "analyzer":{
      "spanish_no_accent": {
          "tokenizer": "standard",
          "filter":  [ "lowercase", "filtro_fonetico" ]
          }
    },
    "filter" : {
      "filtro_fonetico": {
          "type": "phonetic",
          "encoder": "beidermorse",
          "replace": false,
          "languageset": ["spanish"]
      }
    }
  }
}'
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s