autocomplete elasticsearch substring stringtokenizer n-gram

autocomplete - Elasticsearch: búsqueda de subcadena



substring stringtokenizer (2)

Quiero realizar una coincidencia exacta de palabras y una coincidencia parcial de palabras / subcadenas. Por ejemplo, si busco la "afeitadora para hombres", entonces debería ser capaz de encontrar "rasuradora para hombres" en el resultado. Pero en caso de que busque "afeitadora de en" entonces también debería ser capaz de encontrar "rasuradora de hombres" en el resultado. Estoy usando las siguientes configuraciones y mapeos:

Configuración del índice:

PUT /my_index { "settings": { "number_of_shards": 1, "analysis": { "filter": { "autocomplete_filter": { "type": "edge_ngram", "min_gram": 1, "max_gram": 20 } }, "analyzer": { "autocomplete": { "type": "custom", "tokenizer": "standard", "filter": [ "lowercase", "autocomplete_filter" ] } } } } }

Asignaciones:

PUT /my_index/my_type/_mapping { "my_type": { "properties": { "name": { "type": "string", "index_analyzer": "autocomplete", "search_analyzer": "standard" } } } }

Insertar registros:

POST /my_index/my_type/_bulk { "index": { "_id": 1 }} { "name": "men''s shaver" } { "index": { "_id": 2 }} { "name": "women''s shaver" }

Consulta:

1. Para buscar por coincidencia de frase exacta -> "de hombre"

POST /my_index/my_type/_search { "query": { "match": { "name": "men''s" } } }

Por encima de la consulta, se devuelve "afeitadora para hombres" en el resultado de devolución.

2. Para buscar por coincidencia parcial de palabras -> "en''s"

POST /my_index/my_type/_search { "query": { "match": { "name": "en''s" } } }

La consulta anterior NO devuelve nada.

También he intentado seguir la consulta

POST /my_index/my_type/_search { "query": { "wildcard": { "name": { "value": "%en''s%" } } } }

Todavía no recibes nada. Pensé que era debido al filtro de tipo "edge_ngram" en Index que no puede encontrar "coincidencia parcial de word / sbustring". Intenté también con el filtro de tipo "n-gram", pero está ralentizando mucho la búsqueda.

Por favor, sugiera cómo lograr tanto la coincidencia de frase excact como la coincidencia parcial de frase usando la misma configuración de índice.


Al buscar con cualquier cadena o subcadena, use:

query: { or: [{ match_phrase_prefix: { name: str } }, { match_phrase_prefix: { surname: str } }] }

Feliz codificación con Elastic Search ....


Para buscar coincidencias de campo parciales y coincidencias exactas, funcionará mejor si define los campos como "no analizados" o como palabras clave (en lugar de texto), luego use una consulta de comodín .

Ver también esto

Para usar una consulta de comodín, añada * en ambos extremos de la cadena que está buscando:

POST /my_index/my_type/_search { "query": { "wildcard": { "name": { "value": "*en''s*" } } } }

Para usar con insensibilidad de mayúsculas y minúsculas , utilice un analizador personalizado con un filtro minúsculo y un tokenizador de palabras clave .

Analizador personalizado:

"custom_analyzer": { "tokenizer": "keyword", "filter": ["lowercase"] }

Haga la cadena de búsqueda minúscula

Si obtiene cadena de búsqueda como AsD : cámbiela a * asd *