Pencocokan produk menggunakan Elasticsearch untuk layanan pemantauan harga pesaing

Kembali pada tahun 2017, muncul ide untuk mengembangkan layanan pemantauan harga pesaing. Fitur yang membedakannya dari layanan serupa lainnya adalah fungsi pencocokan otomatis barang harian. Rupanya karena kurangnya informasi tentang cara melakukan hal ini, layanan pemantauan harga hanya menawarkan kemungkinan perbandingan manual oleh pelanggan sendiri atau oleh operator layanan dengan harga 0,2 hingga 1 rubel per fakta perbandingan. Situasi nyata dengan, misalnya, 10 situs dan 20.000 produk pada masing-masing, mau tidak mau membutuhkan otomatisasi proses, karena pencocokan manual sudah terlalu lama dan mahal.

Pendekatan pencocokan otomatis akan dijelaskan di bawah ini menggunakan contoh sejumlah apotek yang bersaing menggunakan teknologi Elaticsearch .

Deskripsi lingkungan


  1. OS: Windows 10
  2. Dasar: Penelitian Elatics 6.2
  3. Klien untuk permintaan: Tukang Pos 6.2

Menyiapkan Pencarian Elatics


Konfigurasi mapper bidang dan penganalisis produk dalam satu permintaan

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

Sebagai contoh, kita dapat melihat bagian mana dari alat analisa "name_analyzer" yang akan mematahkan nama obat "Hyoxysone 10mg + 30mg / g salep untuk penggunaan eksternal tabung 10g." Kami menggunakan permintaan _ menganalisis

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

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

Mengisi data uji


Minta _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 } 

Memetakan Pencarian


Biarkan produk klien kami yang ingin kami temukan semua produk serupa dari kompetitor memiliki karakteristik

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

Menggunakan direktori obat-obatan, kami memilih nama obat dari nama produk. Dalam hal ini, kata "Hyoxysone". Kata ini akan menjadi kriteria yang diperlukan.

Kami juga memotong semua angka dari nama - "10 30 10", mereka juga akan menjadi kriteria yang sangat diperlukan. Selain itu, jika nomor tertentu dimasukkan dua kali, itu juga akan muncul dua kali dalam barang yang ditemukan, kalau tidak kita akan meningkatkan kemungkinan kebetulan dengan barang yang salah.

Permintaan _Search

 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 } 

Pada output, kami mendapatkan id barang, serta skor + nama mereka untuk analitik, dengan fragmen yang cocok yang cocok.

  • Hyoxysone 10 mg + 30 mg / g salep untuk penggunaan luar , tabung 10 g - Skor Algoritma: 69.84
  • HYOXISON salep untuk pemakaian luar 10 mg + 30 mg / g : 10 g - Penilaian algoritma: 49.79

Kesimpulan


Metode yang dijelaskan tentu tidak akan memberikan akurasi pencocokan 100%, tetapi akan sangat memudahkan proses pencocokan barang secara manual. Juga cocok untuk tugas yang tidak membutuhkan keakuratan mutlak.
Secara umum, jika Anda meningkatkan permintaan pencarian Anda menggunakan heuristik tambahan dan meningkatkan jumlah sinonim, Anda dapat mencapai hasil yang mendekati memuaskan.
Selain itu, tes kinerja yang dilakukan pada i7 lama menunjukkan hasil yang baik. 10 permintaan pencarian dalam array 200.000 produk dilakukan dalam beberapa detik. Anda dapat melihat contoh obat langsung ini di sini .

Sarankan opsi Anda, cara-cara mencocokkan dalam komentar.

Terima kasih atas perhatian anda!

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


All Articles