es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Elasticsearch con Java: excluir coincidencias con caracteres iniciales aleatorios en una letra.

Soy nuevo en el uso de Elasticsearch. Logré hacer que las cosas funcionaran más o menos como yo quería. Estoy utilizando la siguiente configuración.

{
“analysis”: {
“filter”: {
“shingle_filter”: {
“type”: “shingle”,
“min_shingle_size”: 2,
“max_shingle_size”: 3,
“output_unigrams”: true,
“token_separator”: “”
},
“autocomplete_filter”: {
“type”: “edge_ngram”,
“min_gram”: 1,
“max_gram”: 20
}
},
“analyzer”: {
“shingle_search”: {
“type”: “custom”,
“tokenizer”: “standard”,
“filter”: [
“lowercase”
]
},
“shingle_index”: {
“type”: “custom”,
“tokenizer”: “standard”,
“filter”: [
“lowercase”,
“shingle_filter”,
“autocomplete_filter”
]
}
}
}
}

Tengo esto aplicado en varios campos y estoy realizando una consulta de búsqueda múltiple.

El siguiente es el código en Java:

NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.multiMatchQuery(i)
.field(“title”)
.field(“alias”)
.fuzziness(Fuzziness.ONE)
.type(MultiMatchQueryBuilder.Type.BEST_FIELDS))
.build();

El problema es que coincide con campos que tienen letras con algunos caracteres iniciales.

Por ejemplo, si mi entrada de búsqueda es “ron”, quiero que coincida con “ron matthews”, pero no quiero que coincida con “iron”. ¿Cómo puedo asegurarme de que coincido con letras que no tienen caracteres iniciales?

Actualización-1
Desactivar la transposición de errores de escritura parece mejorar los resultados de búsqueda. Pero creo que podemos mejorarlo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para hacer coincidir solo con letras sin caracteres iniciales, puedes utilizar el filtro “Edge Ngram” en la configuración de tu analizador. Este filtro crea un conjunto de prefijos que comienzan desde el principio del token de entrada, por lo que solo coincidirá con palabras que comiencen con los caracteres de entrada. Puedes modificar tu analizador “shingle_index” para incluir el filtro edge_ngram de esta manera:

    "shingle_index": {
        "type": "custom",
        "tokenizer": "standard",
        "filter": [
            "lowercase",
            "shingle_filter",
            {
                "type": "edge_ngram",
                "min_gram": 1,
                "max_gram": 20
            },
            "autocomplete_filter"
        ]
     }
    

    Esto creará prefijos de 1 a 20 caracteres de longitud para cada token de entrada, permitiendo una coincidencia precisa sin caracteres iniciales.

    También puedes experimentar ajustando los valores de min_gram y max_gram en el filtro edge_ngram según tu caso de uso específico.

Comments are closed.