Produktabgleich mit Elasticsearch für den Preisüberwachungsservice von Wettbewerbern

Bereits 2017 entstand die Idee, einen Preisüberwachungsdienst für Wettbewerber zu entwickeln. Das Unterscheidungsmerkmal von anderen ähnlichen Dienstleistungen sollte die Funktion des täglichen automatischen Abgleichs von Waren sein. Offensichtlich aufgrund des fast vollständigen Mangels an Informationen dazu boten Preisüberwachungsdienste nur die Möglichkeit eines manuellen Vergleichs durch die Kunden selbst oder durch Dienstleister mit einem Preis von 0,2 bis 1 Rubel pro Vergleichsfaktor. Die reale Situation mit beispielsweise 10 Standorten und jeweils 20.000 Produkten erfordert zwangsläufig eine Automatisierung des Prozesses, da der manuelle Abgleich bereits zu lang und zu teuer ist.

Der Ansatz zum automatischen Abgleich wird nachstehend anhand eines Beispiels einer Reihe konkurrierender Apotheken unter Verwendung der Elaticsearch- Technologie beschrieben.

Umgebungsbeschreibung


  1. Betriebssystem: Windows 10
  2. Basis: Elaticsearch 6.2
  3. Kunde für Anfragen: Postbote 6.2

Elaticsearch einrichten


Konfiguration des Produktfeld - Mapper und -Analysators in einer Anfrage

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": [ ", => ." ] } } } } } } 

Zum Beispiel können wir uns ansehen, in welchen Teilen der Analysator "name_analyzer" den Namen des Arzneimittels "Hyoxysone 10 mg + 30 mg / g Salbe für die externe Verwendung eines Röhrchens mit 10 g" aufbricht. Wir verwenden request _analyze .

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

Ergebnis
 { "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 } ] } 

Füllen mit Testdaten


Fordern Sie _bulk an

 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 } 

Mapping-Suche


Lassen Sie das Produkt unseres Kunden, für das wir alle ähnlichen Produkte von Wettbewerbern finden möchten, Eigenschaften haben

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

Unter Verwendung des Arzneimittelverzeichnisses wählen wir den Namen des Arzneimittels aus dem Namen des Produkts aus. In diesem Fall das Wort "Hyoxyson". Dieses Wort wird ein erforderliches Kriterium sein.

Wir schneiden auch alle Zahlen aus dem Namen "10 30 10" aus, sie werden auch ein obligatorisches Kriterium sein. Wenn eine bestimmte Anzahl zweimal enthalten war, sollte sie auch zweimal in der gefundenen Ware enthalten sein, da sonst die Wahrscheinlichkeit eines Zusammentreffens mit der falschen Ware erhöht wird.

_Suchanfrage

 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 } 

Bei der Ausgabe erhalten wir die ID der Waren sowie deren Namen und Punktzahl für die Analyse mit übereinstimmenden übereinstimmenden Fragmenten.

  • Hyoxyson 10 mg + 30 mg / g Salbe zur äußerlichen Anwendung, Röhrchen 10 g - Algorithmus-Score: 69,84
  • HYOXISON- Salbe zur äußerlichen Anwendung 10 mg + 30 mg / g : 10 g - Algorithmusbewertung: 49,79

Fazit


Das beschriebene Verfahren wird sicherlich keine 100% ige Übereinstimmungsgenauigkeit ergeben, aber es wird den Prozess des manuellen Abgleichs von Waren erheblich erleichtern. Auch für Aufgaben geeignet, die keine absolute Genauigkeit erfordern.
Wenn Sie Ihre Suchanfrage mithilfe zusätzlicher Heuristiken verbessern und die Anzahl der Synonyme erhöhen, können Sie im Allgemeinen ein nahezu zufriedenstellendes Ergebnis erzielen.
Darüber hinaus zeigten Leistungstests, die mit dem alten i7 durchgeführt wurden, gute Ergebnisse. Innerhalb weniger Sekunden werden 10 Suchanfragen in einem Array von 200.000 Produkten ausgeführt. Sie können dieses Live-Beispiel der Medizin hier sehen .

Schlagen Sie in den Kommentaren Ihre Optionen und Übereinstimmungsmöglichkeiten vor.

Vielen Dank für Ihre Aufmerksamkeit!

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


All Articles