2016-02-05 11 views
9

नीचे दिए गए मेरे कोड का उपयोग कर सूचकांक elasticsearch.Index उत्पन्न हो रही है successfully.Basically मैं इसे उपयोग कर रहा हूँ फिल्म का नाम, अभिनेता नाम और gener पर निर्भर करता है autosuggest उत्पन्न करने के लिए उत्पन्न करने के लिए है।Elasticsearch मैच सबस्ट्रिंग

अब मेरी आवश्यकता है, मुझे विशेष क्षेत्र के साथ सबस्ट्रिंग मैच करना होगा। अगर मैं $params['body']['query']['wildcard']['field'] = '*sub_word*'; का उपयोग करता हूं तो यह ठीक काम कर रहा है। (यानी 'टू' के लिए खोज 'टॉम क्रुज़' देता है लेकिन 'टॉम क्र' के लिए खोज कोई परिणाम नहीं देता है) ।

यह string.I में केवल विशेष शब्द से मेल खाता है कई शब्दों से युक्त सबस्ट्रिंग का मिलान करना चाहते हैं (यानी। 'टॉम kr' लौटना चाहिए 'टॉम Kruz')।

मुझे कुछ दस्तावेज़ मिलते हैं, यह कहते हुए कि यह 'ngram' का उपयोग करना संभव होगा। लेकिन मैं नहीं जानता, कैसे मैं अपने कोड में लागू करना चाहिए जैसा कि मैंने elasticsearch के लिए सरणी आधारित विन्यास का उपयोग कर रहा है और सभी का समर्थन डॉक्स json fromat में विन्यास का उल्लेख कर रहे हैं।

कृपया मदद करें। अपना खोज शब्द बनाने के लिए

require 'vendor/autoload.php'; 

$client = \Elasticsearch\ClientBuilder::create() 
->setHosts(['http://localhost:9200'])->build(); 

/*************Index a document****************/ 
$params = ['body' => []]; 
$j = 1; 
for ($i = 1; $i <= 100; $i++) { 
    $params['body'][] = [ 
     'index' => [ 
      '_index' => 'pvrmod', 
      '_type' => 'movie', 
      '_id' => $i 
     ] 
    ]; 
    if ($i % 10 == 0) 
     $j++; 
    $params['body'][] = [ 
     'title' => 'salaman khaan'.$j, 
     'desc' => 'salaman khaan description'.$j, 
     'gener' => 'movie gener'.$j, 
     'language' => 'movie language'.$j, 
     'year' => 'movie year'.$j, 
     'actor' => 'movie actor'.$j, 
    ]; 

    // Every 10 documents stop and send the bulk request 
    if ($i % 10 == 0) { 
     $responses = $client->bulk($params); 

     // erase the old bulk request 
     $params = ['body' => []]; 

     unset($responses); 
    } 
} 

// Send the last batch if it exists 
if (!empty($params['body'])) { 
    $responses = $client->bulk($params); 
} 

उत्तर

5

कोशिश इस JSON

{ 
"query": { 
    "filtered": { 
     "query": { 
      "bool": { 
       "should": [ 
        { 
         "wildcard": { 
          "field": { 
           "value": "tom*", 
           "boost": 1 
          } 
         } 
        }, 
        { 
         "field": { 
          "brandname": { 
           "value": "kr*", 
           "boost": 1 
          } 
         } 
        }, 
       ] 
      } 
     } 
    } 
} 

आप विस्फोट कर सकते हैं

$searchTerms = explode(' ', 'tom kruz'); 

और फिर यहां से हर एक

foreach($searchTerms as $searchTerm) { 
//create the new array 
} 
+0

प्रिय कॉस्टा, उत्तर के लिए धन्यवाद। लेकिन सिर्फ एक प्रश्न है, क्या आप निश्चित हैं, व्यक्तिगत शब्दों के लिए वाइल्डकार्ड खोज चलाना मुझे बहुउद्देशीय उप-स्ट्रिंग से मेल खाने वाले सबसे प्रासंगिक परिणाम देगा? –

6

समस्या के लिए वाइल्डकार्ड बनाने झूठ इस तथ्य में है कि Elasticsearch एक उलटा सूचकांक बनाता है। मान लें कि आप मानक विश्लेषक का उपयोग करते हैं, वाक्य "टॉम क्रुज़ एक शीर्ष बंदूक है" 6 टोकन में विभाजित हो जाता है: टॉम - क्रुज़ - है - ए - टॉप - बंदूक। ये टोकन दस्तावेज़ को सौंपे जाते हैं (कुछ मेटाडेटा के साथ स्थिति के बारे में लेकिन चलो अब इसे छोड़ दें)।

आप एक आंशिक मैच बनाना चाहते हैं, तो आप, लेकिन केवल अलग टोकन पर, टोकन की सीमा से अधिक आप चाहते हैं के रूप में नहीं कर सकते। अपनी खोज स्ट्रिंग को विभाजित करने और इन तारों से वाइल्डकार्ड क्वेरी बनाने के लिए सुझाव एक विकल्प है।

एक और विकल्प वास्तव में ngram या edge_ngram टोकन फ़िल्टर का उपयोग करेगा। जो करना होगा (इंडेक्स टाइम पर) उन आंशिक टोकन (जैसे टी-टू-टॉम - ... - के - केआर - क्रू - क्रुज़ - ...) अग्रिम में है और आप बस 'टॉम क्र' आपकी (मैच) खोज में और यह मेल खाएगा। सावधान हालांकि रहें: यह आपके सूचकांक ब्लोट जाएगा (जैसा कि आप देख सकते हैं, यह बहुत अधिक टोकन की दुकान), तो आपको custom analysers और शायद अपनी मैपिंग के बारे में काफी ज्ञान का एक सा की जरूरत है।

सामान्य तौर पर, (edge_) ngram मार्ग अपने सूचकांक में बस किसी भी पाठ क्षेत्र के लिए नहीं, केवल स्वत: पूर्ण जैसी चीजों के लिए एक अच्छा विचार है। आपकी समस्या को हल करने के कुछ तरीके हैं लेकिन अधिकांश में गलत वर्तनी वाले शब्दों का पता लगाने और इसके लिए सही शर्तों का सुझाव देने के लिए अलग-अलग विशेषताओं का निर्माण करना शामिल है।