مطابقة المنتج باستخدام Elasticsearch لخدمة مراقبة الأسعار المنافسة

مرة أخرى في عام 2017 ، نشأت الفكرة لتطوير خدمة مراقبة الأسعار المنافس. كانت ميزته المميزة عن الخدمات المماثلة الأخرى هي وظيفة المطابقة التلقائية اليومية للبضائع. يبدو أنه بسبب النقص شبه الكامل في المعلومات حول كيفية القيام بذلك ، قدمت خدمات مراقبة الأسعار فقط إمكانية المقارنة اليدوية من قبل العملاء أنفسهم أو من قبل مشغلي الخدمة بسعر يتراوح من 0.2 إلى 1 روبل لكل حقيقة مقارنة. يتطلب الوضع الحقيقي ، على سبيل المثال ، مع 10 مواقع و 20000 منتج في كل منها ، أتمتة العملية حتمًا ، لأن المطابقة اليدوية طويلة بالفعل ومكلفة للغاية.

سيتم وصف نهج المطابقة التلقائية أدناه باستخدام مثال لعدد من الصيدليات المتنافسة باستخدام تقنية Elaticsearch .

وصف البيئة


  1. نظام التشغيل: Windows 10
  2. الأساس: Elaticsearch 6.2
  3. العميل للطلبات: Postman 6.2

إنشاء Elaticsearch


تكوين مخطط ومحلل حقل المنتج في طلب واحد

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

على سبيل المثال ، يمكننا أن ننظر إلى الأجزاء التي سيقوم المحلل "name_analyzer" بتفكيك اسم الدواء "مرهم Hyoxysone 10mg + 30mg / g للاستخدام الخارجي لأنبوب 10 جم." نستخدم طلب _analyze .

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

النتيجة
 { "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 } ] } 

ملء بيانات الاختبار


طلب _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 } 

بحث الخرائط


دع منتج عميلنا الذي نريد أن نجد له جميع المنتجات المماثلة من المنافسين له خصائص

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

باستخدام دليل الأدوية ، نختار اسم الدواء من اسم المنتج. في هذه الحالة ، كلمة "Hyoxysone". ستكون هذه الكلمة معيارًا مطلوبًا.

نحن أيضًا نقطع جميع الأرقام من الاسم - "10 30 10" ، وستكون أيضًا معيارًا لا غنى عنه. علاوة على ذلك ، إذا تم تضمين رقم معين مرتين ، فيجب أن يظهر أيضًا مرتين في البضائع الموجودة ، وإلا فإننا سنزيد من فرصة المصادفة مع السلع الخاطئة.

_طلب بحث

 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 } 

عند الإخراج ، نحصل على معرف البضائع ، بالإضافة إلى اسمها + درجة التحليلات ، مع مطابقة الأجزاء المطابقة.

  • Hyoxysone 10 mg + 30 mg / g مرهم للاستخدام الخارجي ، الأنبوب 10 جم - درجة الخوارزمية: 69.84
  • مرهم HYOXISON للاستخدام الخارجي 10 مجم + 30 مجم / جم : 10 جم - تقييم الخوارزمية: 49.79

الخلاصة


بالتأكيد لن تعطي الطريقة الموضحة دقة مطابقة بنسبة 100٪ ، ولكنها ستسهل إلى حد كبير عملية المطابقة اليدوية للسلع. مناسب أيضًا للمهام التي لا تتطلب الدقة المطلقة.
بشكل عام ، إذا قمت بتحسين استعلام البحث الخاص بك باستخدام الاستدلال الإضافي وزادت عدد المرادفات ، يمكنك تحقيق نتيجة قريبة من مرضية.
بالإضافة إلى ذلك ، أظهرت اختبارات الأداء التي أجريت على i7 القديم نتائج جيدة. يتم تنفيذ 10 استعلامات بحث في مجموعة من 200000 منتج في غضون بضع ثوان. يمكنك أن ترى هذا المثال الحي للطب هنا .

اقترح خياراتك وطرق التطابق في التعليقات.

شكرا لكم على اهتمامكم!

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


All Articles