2012-09-07 14 views
6

मैं अपने क्वेरी स्ट्रिंग खोज में स्नोबॉल विश्लेषक का उपयोग कर रहा के लिए परिणाम देता है ... इसलिएElasticsearch केवल उपजी शब्द

"query" : { 
     "query_string" : { 
     "query" : the-query-string-goes-here, 
     "default_operator" : "AND", 
     "analyzer" : "snowball" 
     } 
    } 

की तरह यह वास्तव में काम करता है, लेकिन यह कुछ अजीब है ... "के लिए खोज लड़ना "लड़ाई" के लिए परिणाम लौटाएगा लेकिन "लड़ाई" के परिणामों को अनदेखा करेगा। "चालक दल" के लिए एक खोज "चालक दल" के लिए परिणाम लौटाएगी, लेकिन "चालक दल" नहीं, "चालक दल" की खोज भी "कर्मचारियों" के लिए परिणामों को अनदेखा करती है ...

कोई भी जानता है कि क्या हो रहा है?

+0

क्या आपने हल किया है? क्या मुझे पता चलेगा कि मेरा जवाब उपयोगी था? – javanna

+0

मैंने डिफ़ॉल्ट विश्लेषक को स्नोबॉल होने के लिए सेट किया है और इसकी देखभाल की है, लेकिन मुझे अभी भी समझ में नहीं आता है कि क्वेरी स्ट्रिंग में बस इसे क्यों सेट नहीं किया गया। सूचकांक अलग-अलग कैसे होता है कि एक मामले में लड़ने की खोज (डिफ़ॉल्ट विश्लेषक स्नोबॉल पर सेट) वास्तव में "लड़ाई" पोस्ट खींच सकता है लेकिन दूसरा (केवल क्वेरी स्ट्रिंग में निर्दिष्ट करना) नहीं करता है। – concept47

+0

जैसा कि मैंने अपने उत्तर में लिखा था, अगर आप केवल क्वेरी समय पर स्टेमिंग लागू करते हैं तो आप उस फ़ील्ड के भीतर उपजी की तलाश करते हैं जो इंडेक्सिंग के दौरान नहीं लगाया गया है। खुशी है कि आप हल हो गया है! – javanna

उत्तर

11

स्टेमिंग समझ में आता है जब आप इसे इंडेक्स समय और क्वेरी समय दोनों पर लागू करते हैं। अब आप इसे क्वेरी समय पर लागू कर रहे हैं, ताकि आप उन शब्दों की उपजाऊ खोज सकें जो क्वेरी का हिस्सा हैं। लेकिन मुझे लगता है कि इंडेक्स में उपजी नहीं है क्योंकि आपने इंडेक्स समय पर स्टेमिंग लागू नहीं किया है। आप वास्तव में _all फ़ील्ड पर खोज कर रहे हैं क्योंकि आपने अपनी क्वेरी में न तो कोई फ़ील्ड नाम निर्दिष्ट किया है और न ही default_field (या fields) क्वेरी_स्ट्रिंग द्वारा समर्थित विशेषता का उपयोग नहीं किया है। _all फ़ील्ड को StandardAnalyzer का उपयोग करके डिफ़ॉल्ट रूप से विश्लेषण किया जाता है।

इस समस्या को हल करने के कई तरीके हैं। मैं व्यक्तिगत रूप से उन फ़ील्ड का एक सेट तय करता हूं जिन पर आप अपनी क्वेरी में खोजना चाहते हैं और उन्हें अपने मैपिंग में लागू करने के लिए लागू होते हैं। उसके बाद आपको अपनी क्वेरी में विश्लेषक निर्दिष्ट करने की आवश्यकता नहीं है क्योंकि जिस क्षेत्र पर आप खोज रहे हैं उसके लिए कॉन्फ़िगर किए गए विश्लेषक का उपयोग किया जाएगा।

मुझे बताएं कि क्या उत्तर पर्याप्त है।

+0

यह बहुत समझ में आता है। लेकिन यह उस आइटम को अनदेखा क्यों करेगा जो क्वेरी के लिए सटीक मिलान है? (यानी "लड़ाई" की खोज "लड़ाई" शीर्षक वाली एक पोस्ट नहीं लौटाती है, लेकिन यह "लड़ाई" शीर्षक वाली एक पोस्ट लौटाती है) – concept47

+0

क्योंकि जब आप पूछताछ के लिए लागू होते हैं तो लड़ाई लड़ जाती है। आप वास्तव में लड़ने के बजाय लड़ाई की तलाश में हैं। ;) – javanna

+0

तो इसका मतलब है कि मेरी समस्या अभी भी मौजूद होगी, भले ही मैंने इंडेक्स पर स्टेमर का उपयोग किया हो? मैं इसे कैसे बना सकता हूं ताकि यह स्टेमड शब्द और वास्तविक क्वेरी दोनों पर एक खोज करे .... स्फिंक्स यह स्वचालित रूप से करता है, – concept47

2

सही दिशा में मुझे इंगित करने के लिए @javanna के लिए धन्यवाद। मैंने _all फ़ील्ड के लिए snowball पर विश्लेषक सेट करके इसे हल किया। विवरण के लिए this doc देखें।

मैं रूबी टायर मणि का उपयोग कर रहा है, और मैं इस प्रकार अपने मॉडल में मानचित्रण निर्दिष्ट करने के लिए कर रहा था:

mapping(_all: { analyzer: 'snowball' }) do 
    indexes :id, type: 'integer' 
    indexes :description 
    indexes :name, boost: 10 
end 

मैं बिल्कुल मूल प्रश्न में की तरह मेरी क्वेरी स्वरूपित।