En 2017, l'idée est née de développer un service de surveillance des prix des concurrents. Sa caractéristique distinctive des autres services similaires devait être la fonction de l'appariement automatique quotidien des marchandises. Apparemment en raison du manque presque complet d'informations sur la façon de procéder, les services de surveillance des prix n'offraient que la possibilité d'une comparaison manuelle par les clients eux-mêmes ou par les opérateurs de services avec un prix de 0,2 à 1 rouble par fait de comparaison. La situation réelle avec, par exemple, 10 sites et 20 000 produits sur chacun, nécessite inévitablement une automatisation du processus, car l'appariement manuel est déjà trop long et coûteux.
L'approche de l'appariement automatique sera décrite ci-dessous en utilisant un exemple d'un certain nombre de pharmacies concurrentes utilisant la technologie
Elaticsearch .
Description de l'environnement
- Système d'exploitation: Windows 10
- Base: Elaticsearch 6.2
- Client pour les demandes: Postman 6.2
Configurer Elaticsearch
Configuration du
mappeur de champ de
produit et de l'
analyseur en une seule demande
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": [ ", => ." ] } } } } } }
Par exemple, nous pouvons regarder quelles parties l'analyseur "name_analyzer" cassera le nom du médicament "Hyoxysone 10mg + 30mg / g pommade pour usage externe d'un tube de 10g." Nous utilisons la demande
_analyser .
POST http://localhost:9200/app/_analyze { "analyzer" : "name_analyzer", "text" : " 10+30/ 10" }
résultat
{ "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 } ] }
Remplissage avec des données de test
Demande
_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 }
Recherche cartographique
Laissez le produit de notre client pour lequel nous voulons trouver tous les produits similaires de concurrents avoir des caractéristiques
{ "name": " 10 +30 / 10 ", "manufacturer": " ", "city_id": 1, "company_id": 1, "category_id": 1 }
En utilisant le
répertoire des médicaments, nous sélectionnons le nom du médicament parmi le nom du produit. Dans ce cas, le mot "Hyoxysone". Ce mot sera un critère obligatoire.
Nous avons également supprimé tous les nombres du nom - «10 30 10», ils seront également un critère indispensable. De plus, si un certain nombre a été inclus deux fois, il devrait également apparaître deux fois dans les marchandises trouvées, sinon nous augmenterons les chances de coïncidence avec les mauvaises marchandises.
_Recherche de requête
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 }
À la sortie, nous obtenons l'id des marchandises, ainsi que leur nom + score pour l'analyse, avec des fragments correspondants correspondants.
- Hyoxysone 10 mg + 30 mg / g pommade à usage externe , tube 10 g - Score d'algorithme: 69,84
- Pommade HYOXISON à usage externe 10 mg + 30 mg / g : 10 g - Évaluation de l'algorithme: 49,79
Conclusion
La méthode décrite ne donnera certainement pas une précision d'appariement à 100%, mais elle facilitera grandement le processus d'appariement manuel des marchandises. Convient également aux tâches qui ne nécessitent pas une précision absolue.
En général, si vous améliorez votre requête de recherche à l'aide d'heuristiques supplémentaires et augmentez le nombre de synonymes, vous pouvez obtenir un résultat proche de satisfaisant.
De plus, les tests de performance effectués sur l'ancien i7 ont montré de bons résultats. 10 requêtes de recherche dans une gamme de 200 000 produits sont effectuées en quelques secondes. Vous pouvez voir cet exemple de médecine en direct
ici .
Suggérez vos options, moyens de correspondance dans les commentaires.
Merci de votre attention!