update mappings index for existing create elasticsearch search-suggestion

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.