2015-02-01 3 views
10

के साथ मल्टीफ़ील्ड पर लोचदार खोज पूरा करने वाला सुझाव आंशिक शब्द मिलान प्रश्नों की अनुमति देने के लिए मैं Elasticsearch में पूर्ण Suggester का उपयोग कर रहा हूं। मेरी अनुक्रमणिका (products_index) में, मैं product_name फ़ील्ड और ब्रांड फ़ील्ड दोनों से पूछताछ करने में सक्षम होना चाहता हूं। यहाँ मेरी मैपिंग हैं:विभिन्न भारोत्तोलन

POST /product_index 

mappings: { 
    products: { 
    properties: { 
     brand: { 
     type: "string", 
     analyzer: "english" 
     }, 
     product_name: { 
     type: "string", 
     analyzer: "english" 
     }, 
     id: { 
     type: "long" 
     }, 
     lookup_count: { 
     type: "long" 
     }, 
     suggest: { 
     type: "completion", 
     analyzer: "simple", 
     payloads: true, 
     preserve_separators: true, 
     preserve_position_increments: true, 
     max_input_length: 50 
     }, 
     upc: { 
     type: "string" 
     } 
    } 
    } 
} 

यहाँ मेरी डेटा है: यहाँ

POST /product_index/products/2 
{ 
    id: 2, 
    brand: "Coca-Cola", 
    product_name: "Classic Coke", 
    suggest: { 
    input: [ 
     "Classic Coke", 
     "Coca-Cola" 
    ], 
    output: "Classic Coke - Coca-Cola", 
    payload: { 
     id: 2, 
     product_name: "Classic Coke", 
     brand: "Coca-Cola", 
     popularity: 10 
    }, 
    weight: 0 
    } 
} 

और मेरी क्वेरी है:

POST /product_index/_search 

"suggest": { 
    "product_suggest": { 
    "text": 'coca-co', 
    "completion": { 
     "field": 'suggest' 
    } 
    } 
} 

यह सिवाय इसके कि अच्छा काम करता है मैं देना चाहते हैं product_nameब्रांड फ़ील्ड से अधिक भारोत्तोलन क्षेत्र। क्या मैं इसे हासिल कर सकता हूं? मैंने को बूल प्रश्नों का उपयोग करने पर देखा है, लेकिन मैं Elasticsearch के लिए काफी नया हूं और यह सुनिश्चित नहीं करता कि मैं इसे पूरा करने वाले सुझावकर्ता के मामले में कैसे लागू कर सकता हूं।

बहुत बहुत धन्यवाद!

उत्तर

7

जैसा कि रेडॉक्स ने कहा, पूरा करने वाला सुझाव वास्तव में सरल है और प्रविष्टियों को बढ़ावा देने का समर्थन नहीं करता है। मेरे समाधान दो Suggester क्षेत्रों, ब्रांड के लिए एक और उत्पाद के नाम के लिए एक बनाने के लिए होगा:

POST /product_index 
{ 
    "mappings": { 
    "products": { 
     "properties": { 
     "brand": { 
      "type": "string", 
      "analyzer": "english" 
     }, 
     "product_name": { 
      "type": "string", 
      "analyzer": "english" 
     }, 
     "id": { 
      "type": "long" 
     }, 
     "lookup_count": { 
      "type": "long" 
     }, 
     "product-suggest": { 
      "type": "completion", 
      "analyzer": "simple", 
      "payloads": true, 
      "preserve_separators": true, 
      "preserve_position_increments": true, 
      "max_input_length": 50 
     }, 
     "brand-suggest": { 
      "type": "completion", 
      "analyzer": "simple", 
      "payloads": true, 
      "preserve_separators": true, 
      "preserve_position_increments": true, 
      "max_input_length": 50 
     }, 
     "upc": { 
      "type": "string" 
     } 
     } 
    } 
    } 
} 

जब अनुक्रमण, दोनों क्षेत्रों को भरने:

POST /product_index/products/2 
{ 
    "id": 2, 
    "brand": "Coca-Cola", 
    "product_name": "Classic Coke", 
    "brand-suggest": { 
    "input": [ 
     "Coca-Cola" 
    ], 
    "output": "Classic Coke - Coca-Cola", 
    "payload": { 
     "id": 2, 
     "product_name": "Classic Coke", 
     "brand": "Coca-Cola", 
     "popularity": 10 
    } 
    }, 
    "product-suggest": { 
    "input": [ 
     "Classic Coke" 
    ], 
    "output": "Classic Coke - Coca-Cola", 
    "payload": { 
     "id": 2, 
     "product_name": "Classic Coke", 
     "brand": "Coca-Cola", 
     "popularity": 10 
    } 
    } 
} 

जब क्वेरी करने, एक पर दोनों का सुझाव कर ब्रांड और उत्पाद suggesters:

POST /product_index/_search 
{ 
    "suggest": { 
     "product_suggestion": { 
     "text": "coca-co", 
     "completion": { 
      "field": "product-suggest" 
     } 
     }, 
     "brand_suggestion": { 
     "text": "coca-co", 
     "completion": { 
      "field": "brand-suggest" 
     } 
     } 
    } 
} 

आप उत्पाद सुझाव से एक के लिए ब्रांड सुझाव के सुझावों की सूची जोड़ सकते हैं के बाद duplica हटाया होने टीएस, केवल प्रासंगिक सुझावों के साथ सुझावों की सूची, कोई डुप्लीकेट और उत्पाद सुझाव पहले नहीं है।

एक और समाधान सुझावकर्ताओं का उपयोग करने के बजाय ब्रांड और उत्पाद को बढ़ावा देने के साथ एक प्रश्न का उपयोग करना होगा। यह कार्यान्वयन हालांकि धीमा है क्योंकि यह सुझावकर्ताओं का उपयोग नहीं करता है।

+0

मेरे प्रश्न का उत्तर देने के लिए बहुत बहुत धन्यवाद!मैंने आपके कदमों का पालन किया लेकिन मुझे त्रुटि मिल रही है - "ElasticsearchException [फ़ील्ड [उत्पाद-सुझाव] एक पूरा करने का सुझाव फ़ील्ड नहीं है"। मैंने यह निर्दिष्ट किया कि उत्पाद-सुझाव और ब्रांड-सुझाव फ़ील्ड दोनों प्रकार के "समापन" हैं। क्या आपको पता है कि यह त्रुटि क्यों होती है? –

+0

अजीब @harry, यह मेरे सेंस और Elasticsearch उदाहरण पर काम करता है। क्या आप इंडेक्स हटा सकते हैं और मेरे प्रश्नों को आजमा सकते हैं? मैंने उन्हें सेंस में काम करने के लिए संपादित किया है यदि आप उन्हें कॉपी-पेस्ट करते हैं ... – Heschoon

+0

यह इस बार मेरे लिए काम करता था। ऐसा लगता है कि एकमात्र अंतर यह था कि मैंने "विश्लेषक": "सरल" पैरामीटर शामिल किया था। आपकी मदद के लिए बहुत धन्यवाद! –

12

प्राप्ति Suggester वास्तव में स्कोरिंग की अवधि में काफी सीमित है: आप ऐसा नहीं कर सकते हैं। एकमात्र चीज जो आप कर सकते हैं वह कुछ प्रविष्टियों को बढ़ावा देती है लेकिन प्रविष्टि के अंदर गुण नहीं (weight विकल्प http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-suggesters-completion.html#indexing देखें)।

ऐसा इसलिए है क्योंकि पूर्ण Suggester "असली खोज" नहीं करता है -> यह सूचकांक का उपयोग नहीं करता है। यह एक सरल "शब्दकोश" है जो "उपसर्ग" विस्तार को इंडेक्स + उलटा सूचियों के मुकाबले तेजी से करने के लिए डिज़ाइन किया गया है।

आपको अल्गोलिया -> इंजन को रीयलटाइम में उपसर्ग खोजों के उत्तर देने के लिए डिज़ाइन किया गया है + प्रति विशेषता अलग "वजन" रखने के लिए। यहां कई फ़ील्ड को लक्षित करने वाले ऑटो-पूर्ण मेनू को कार्यान्वित करने के लिए एक ट्यूटोरियल है: https://www.algolia.com/doc/tutorials/auto-complete

+0

धन्यवाद महान जवाब के लिए @redox! यह जानना उपयोगी है कि कैसे पूरा करने वाला सुझाव हुड के नीचे काम करता है और मैं निश्चित रूप से अल्गोलिया में देखता हूं। –

+2

लेकिन एल्गोलिया एक सास है ... Elasticsearch के विपरीत आप अपने सिस्टम पर स्थापित कर सकते हैं ... – maxxyme

संबंधित मुद्दे