mappings - elasticsearch update mapping on existing index
Sugerencia de finalizaciĆ³n Elasticsearch en multifield con diferente ponderaciĆ³n (2)
El Completion Suggester es bastante limitado en términos de puntuación: no puedes hacer eso. Lo único que puede hacer es aumentar algunas entradas, pero no los atributos dentro de una entrada (consulte las opciones de weight
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters-completion.html# indexación ).
Eso es porque Completion Suggester no hace una "búsqueda real" -> no usa el índice. Es un simple "diccionario" diseñado para hacer expansiones de "prefijo" más rápido que con un índice + listas invertidas.
Debes probar con Algolia -> el motor está diseñado para responder a búsquedas de prefijo en tiempo real + con diferentes "pesos" por atributo. Aquí hay un tutorial para implementar el menú de autocompletar dirigido a varios campos: https://www.algolia.com/doc/tutorials/auto-complete
Estoy usando Completion Suggester en Elasticsearch para permitir consultas parciales de concordancia de palabras. En mi índice (products_index), me gustaría poder consultar el campo product_name y el campo de marca . Aquí están mis asignaciones:
POST /product_index
mappings: {
products: {
properties: {
brand: {
type: "string",
analyzer: "english"
},
product_name: {
type: "string",
analyzer: "english"
},
id: {
type: "long"
},
lookup_count: {
type: "long"
},
suggest: {
type: "completion",
analyzer: "simple",
payloads: true,
preserve_separators: true,
preserve_position_increments: true,
max_input_length: 50
},
upc: {
type: "string"
}
}
}
}
Aquí están mis datos:
POST /product_index/products/2
{
id: 2,
brand: "Coca-Cola",
product_name: "Classic Coke",
suggest: {
input: [
"Classic Coke",
"Coca-Cola"
],
output: "Classic Coke - Coca-Cola",
payload: {
id: 2,
product_name: "Classic Coke",
brand: "Coca-Cola",
popularity: 10
},
weight: 0
}
}
Y aquí está mi consulta:
POST /product_index/_search
"suggest": {
"product_suggest": {
"text": ''coca-co'',
"completion": {
"field": ''suggest''
}
}
}
Esto funciona muy bien, excepto que me gustaría dar al campo nombre_producto una ponderación mayor que el campo de marca . ¿Hay alguna manera de que pueda lograr esto? He analizado este artículo sobre el uso de consultas de bool, pero soy bastante nuevo en Elasticsearch y no estoy seguro de cómo puedo aplicarlo en el caso de un sugerencia de finalización.
¡Muchas gracias!
Como dijo redox, el sugerencia de finalización es realmente simple y no admite el aumento de entradas. Mi solución sería crear dos campos sugerentes, uno para la marca y otro para el nombre del producto:
POST /product_index
{
"mappings": {
"products": {
"properties": {
"brand": {
"type": "string",
"analyzer": "english"
},
"product_name": {
"type": "string",
"analyzer": "english"
},
"id": {
"type": "long"
},
"lookup_count": {
"type": "long"
},
"product-suggest": {
"type": "completion",
"analyzer": "simple",
"payloads": true,
"preserve_separators": true,
"preserve_position_increments": true,
"max_input_length": 50
},
"brand-suggest": {
"type": "completion",
"analyzer": "simple",
"payloads": true,
"preserve_separators": true,
"preserve_position_increments": true,
"max_input_length": 50
},
"upc": {
"type": "string"
}
}
}
}
}
Al indexar, complete ambos campos:
POST /product_index/products/2
{
"id": 2,
"brand": "Coca-Cola",
"product_name": "Classic Coke",
"brand-suggest": {
"input": [
"Coca-Cola"
],
"output": "Classic Coke - Coca-Cola",
"payload": {
"id": 2,
"product_name": "Classic Coke",
"brand": "Coca-Cola",
"popularity": 10
}
},
"product-suggest": {
"input": [
"Classic Coke"
],
"output": "Classic Coke - Coca-Cola",
"payload": {
"id": 2,
"product_name": "Classic Coke",
"brand": "Coca-Cola",
"popularity": 10
}
}
}
Al realizar una consulta, haga una sugerencia tanto sobre la marca como sobre los sugerentes del producto:
POST /product_index/_search
{
"suggest": {
"product_suggestion": {
"text": "coca-co",
"completion": {
"field": "product-suggest"
}
},
"brand_suggestion": {
"text": "coca-co",
"completion": {
"field": "brand-suggest"
}
}
}
}
Puede agregar la lista de sugerencias de sugerencia de marca a la de sugerencia del producto, después de haber eliminado los duplicados, para tener una lista de sugerencias con solo sugerencias relevantes, sin duplicados y las sugerencias de productos primero.
Otra solución sería usar una consulta para aumentar la marca y el producto, en lugar de utilizar sugerencias. Sin embargo, esta implementación es más lenta ya que no utiliza sugestiones.