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
- SO: Windows 10
- Base: Elaticsearch 6.2
- 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!