Coincidencia de productos con Elasticsearch para el servicio de monitoreo de precios de la competencia

En 2017, surgió la idea de desarrollar un servicio de monitoreo de precios de la competencia. Su característica distintiva de otros servicios similares era la función de la correspondencia automática diaria de bienes. Aparentemente, debido a la falta casi completa de información sobre cómo hacer esto, los servicios de monitoreo de precios ofrecían solo la posibilidad de comparación manual por parte de los propios clientes o de los operadores de servicios con un precio de 0.2 a 1 rublo por hecho de comparación. La situación real con, por ejemplo, 10 sitios y 20,000 productos en cada uno, inevitablemente requiere la automatización del proceso, ya que el emparejamiento manual ya es demasiado largo y costoso.

El enfoque de la coincidencia automática se describirá a continuación utilizando un ejemplo de varias farmacias competidoras que utilizan la tecnología Elaticsearch .

Descripción del entorno


  1. SO: Windows 10
  2. Base: Elaticsearch 6.2
  3. Cliente para solicitudes: Cartero 6.2

Configurar Elaticsearch


Configuración del mapeador y analizador de campo del producto en una sola solicitud

PUT http://localhost:9200/app { "mappings": { "product": { "properties": { "name": { "type": "text", "analyzer": "name_analyzer" #        }, "manufacturer": { "type": "text" }, "city_id": { "type": "integer" }, "company_id": { "type": "integer" }, "category_id": { "type": "integer" }, } } }, "settings": { "index": { "analysis": { "analyzer": { "name_analyzer": { "type": "custom", "tokenizer": "standard", #        ,       "char_filter": [ "html_strip", #       html  "comma_to_dot_char_filter" #    ,     ], "filter": [ "word_delimeter_filter", #     "synonym_filter", #    "lowercase" #      ] } }, "filter": { "synonym_filter": { "type": "synonym_graph", "synonyms": [ ", ", ", ", ", ", ", , ", ", ", ", , , ", ", ", ", ", ", , ", ", , ", ", , , -, -", ", , ", ", , , ", ", ", ", ", ", , ", ", , ", ", ", ", ", ", ", ", ", ", , , ", ", ", ", g", "ml, " ] }, "word_delimeter_filter": { "type": "word_delimiter", "type_table": [ ". => DIGIT", #       "- => ALPHANUM", "; => SUBWORD_DELIM", "` => SUBWORD_DELIM" ] } }, "char_filter": { "comma_to_dot_char_filter": { "type": "mapping", "mappings": [ ", => ." ] } } } } } } 

Por ejemplo, podemos ver en qué partes el analizador "name_analyzer" romperá el nombre del medicamento "Hyoxysone 10mg + 30mg / g pomada para uso externo de un tubo de 10g". Usamos request _analyze .

 POST http://localhost:9200/app/_analyze { "analyzer" : "name_analyzer", "text" : " 10+30/      10" } 

resultado
 { "tokens": [ { "token": "", "start_offset": 0, "end_offset": 9, "type": "<ALPHANUM>", "position": 0 }, { "token": "10", "start_offset": 10, "end_offset": 12, "type": "<ALPHANUM>", "position": 1 }, { "token": "", "start_offset": 12, "end_offset": 14, "type": "<ALPHANUM>", "position": 2 }, { "token": "30", "start_offset": 15, "end_offset": 17, "type": "<ALPHANUM>", "position": 3 }, { "token": "", "start_offset": 17, "end_offset": 19, "type": "<ALPHANUM>", "position": 4 }, { "token": "g", "start_offset": 20, "end_offset": 21, "type": "SYNONYM", #,   "g"   SYNONYM,  ,          ", g" "position": 5 }, { "token": "", "start_offset": 20, "end_offset": 21, "type": "<ALPHANUM>", "position": 5 }, { "token": "", "start_offset": 22, "end_offset": 26, "type": "<ALPHANUM>", "position": 6 }, { "token": "", "start_offset": 27, "end_offset": 30, "type": "<ALPHANUM>", "position": 7 }, { "token": "", "start_offset": 31, "end_offset": 40, "type": "<ALPHANUM>", "position": 8 }, { "token": "", "start_offset": 41, "end_offset": 51, "type": "<ALPHANUM>", "position": 9 }, { "token": "", "start_offset": 52, "end_offset": 56, "type": "<ALPHANUM>", "position": 10 }, { "token": "10", "start_offset": 57, "end_offset": 59, "type": "<ALPHANUM>", "position": 11 }, { "token": "g", "start_offset": 59, "end_offset": 60, "type": "SYNONYM", "position": 12 }, { "token": "", "start_offset": 59, "end_offset": 60, "type": "<ALPHANUM>", "position": 12 } ] } 

Relleno con datos de prueba


Solicitar _bulk

 POST http://localhost:9200/_bulk { "index": { "_index": "app", "_type": "product", "_id": 195111 } } { "name": " 10+30/      10", "manufacturer": "   ", "city_id": 1, "company_id": 2, "category_id": 1 } { "index": { "_index": "app", "_type": "product", "_id": 195222 } } { "name": "     10 +30 /: 10 ", "manufacturer": "", "city_id": 1, "company_id": 3, "category_id": 1 } 

Búsqueda de mapeo


Deje que el producto de nuestro cliente para el que queremos encontrar todos los productos similares de la competencia tenga características

 { "name": "     10 +30 /   10 ", "manufacturer": "   ", "city_id": 1, "company_id": 1, "category_id": 1 } 

Usando el directorio de medicamentos, seleccionamos el nombre del medicamento del nombre del producto. En este caso, la palabra "Hyoxysone". Esta palabra será un criterio obligatorio.

También recortamos todos los números del nombre - "10 30 10", también serán un criterio indispensable. Además, si un cierto número se incluyó dos veces, también debería incluirse dos veces en los productos encontrados, de lo contrario aumentaremos la posibilidad de coincidencia con los productos incorrectos.

_ Solicitud de búsqueda

 GET http://localhost:9200/app/product/_search { "query": { "bool": { "filter": [ { "terms": { "company_id": [ 2, 3, 4, 5, 6, 7, 8 ] } }, { "term": { "city_id": { "value": 1, "boost": 1 } } }, { "term": { "category_id": { "value": 1, "boost": 1 } } } ], "must": [ { "bool": { "should": [ { "match": { "name": { "query": "    + /   ", "boost": 1, "operator": "or", "minimum_should_match": 0, "fuzziness": "AUTO" } } } ], "must": [ { "match": { "name": { "query": "", "boost": 2, "operator": "or", "minimum_should_match": "70%", "fuzziness": "AUTO" } } }, { "match_phrase": { "name": { "query": "10 30 10", "boost": 2, "slop": 100 } } } ] } } ], "should": [ { "bool": { "should": [ { "match": { "manufacturer": { "query": "   ", "boost": 1, "operator": "or", "minimum_should_match": "70%", "fuzziness": "AUTO" } } }, { "match": { "manufacturer": { "query": "alenta armacevtika ", "boost": 1, "operator": "or", "minimum_should_match": "70%", "fuzziness": "AUTO" } } } ] } } ] } }, "highlight": { "fields": { "name": {} } }, "size": 50 } 

En la salida, obtenemos la identificación de los productos, así como su nombre + puntaje para análisis, con fragmentos coincidentes coincidentes.

  • Hyoxysone 10 mg + 30 mg / g pomada para uso externo , tubo 10 g - Puntuación de algoritmo: 69.84
  • Pomada HYOXISON para uso externo 10 mg + 30 mg / g : 10 g - Evaluación de algoritmo: 49.79

Conclusión


El método descrito ciertamente no dará una precisión de coincidencia del 100%, pero facilitará en gran medida el proceso de coincidencia manual de productos. También es adecuado para tareas que no requieren una precisión absoluta.
En general, si mejora su consulta de búsqueda utilizando heurísticas adicionales y aumenta el número de sinónimos, puede lograr un resultado casi satisfactorio.
Además, las pruebas de rendimiento realizadas en el antiguo i7 mostraron buenos resultados. Se realizan 10 consultas de búsqueda en una matriz de 200,000 productos en un par de segundos. Puedes ver este ejemplo en vivo de la medicina aquí .

Sugiera sus opciones, formas de hacer coincidir los comentarios.

Gracias por su atencion!

Source: https://habr.com/ru/post/es428814/


All Articles