2011-12-02 7 views
5

मैं सूर्यकलंकसनस्पॉट: विभिन्न मानों के साथ एकाधिक फ़ील्ड पर पूर्ण टेक्स्ट क्वेरी कैसे करें?

q=exact_term_text:foo OR term_textv:foo* OR alternate_text:bar* 

साथ निम्नलिखित कच्चे Solr क्वेरी पुन: पेश करना चाहते हैं, लेकिन मैं अगर समझ नहीं पा रहा हूँ और यह कैसे संभव है, मानक सूर्यकलंक इंटरफेस के माध्यम से, के बाद से ऐसा लगता है कि:

  1. fulltext विधि से अधिक लेख/search_fields तर्क
  2. मैं क्या तर्क fulltext करने के लिए पहले एक के रूप में पारित करने के लिए पता नहीं स्वीकार करने के लिए, के रूप में अगर मैं या तो "foo" या "bar" फिर से पारित नहीं लगता है sults
  3. से मेल नहीं खाएगा यदि मैं एक खाली तर्क पास करता हूं तो मुझे q=*:*
  4. स्कोप फ़िल्टर (उदा। with(:term).starting_with('foo*') फ़िल्टर नाम के रूप में लागू होते हैं (जैसा कि नाम का तात्पर्य है), और इस प्रकार स्कोरिंग में कोई हिस्सा नहीं लेते हैं।

स्ट्रिंग को हाथ से लिखना संभव है (या संभवतः adjust_solr_params का उपयोग करें) लेकिन यह हैक लगता है। क्या कोई बेहतर समाधान है?

उत्तर

8

सनस्पॉट 2.0.0 में, अनियंत्रित और असमर्थित व्यवहार है जो काम करता है। लेखक स्वयं सुझाव देते हैं कि यह नहीं होना चाहिए और यह शायद भविष्य के संस्करणों में नहीं होगा।

आप एक से अधिक की प्रतिलिपि प्राप्त पारित कर सकते हैं खोज परिभाषा में कॉल

Post.search do 
    fulltext "foo", {:fields => :exact_term} 
    fulltext "bar", {:fields => :alternate} 
end 

इस का एक Solr क्वेरी में परिणाम है (लॉग से)

INFO: [] webapp=/solr path=/select 
params={fl=*+score&start=0&q=_query_:"{!dismax+qf%3D'exact_term'}foo"+_query_:"{!dismax+qf%3D'alternate'}bar"&wt=ruby&fq=type:Post&rows=30} 
hits=1 status=0 QTime=7 

सबस्ट्रिंग मिलान https://github.com/sunspot/sunspot/wiki/Matching-substrings-in-fulltext-search

में कवर किया जाता है

डिफ़ॉल्ट ऑपरेटर (AND/OR) को बदलकर विकल्प न्यूनतम_मैच 1जोड़कर किया जा सकता हैरूप http://blog.tonycode.com/archives/192

+0

(धार) का उपयोग कर ngrams नहीं बिल्कुल वही बात और अनुक्रमण के बिना है यह नहीं जाने देंगे कारण मुझे प्रश्नों के बीच प्रोग्राम के रूप में अंतर जहां एक आंशिक मैच ठीक है नहीं एक ही क्षेत्र दो बार। ऐसा प्रतीत होता है कि डिसनक्स क्वेरी हैंडलर के सस्पनपॉट का उपयोग मुझे हैकिश समाधानों के बिना ल्यूसीन प्रश्न नहीं देगा, इसलिए मैं जवाब को स्वीकार कर रहा हूं, धन्यवाद। – riffraff

+3

सनस्पॉट प्रलेखन में https://github.com/sunspot/sunspot/wiki/Fulltext- खोज करें यह स्पष्ट रूप से कहता है: "ध्यान दें कि 'कीवर्ड' विधि को एक खोज में कई बार नहीं कहा जाना चाहिए - लगातार कॉल ओवरराइट हो जाएगी पहले निर्दिष्ट कीवर्ड। " * ('कीवर्ड' को 'fulltext' के लिए उपनाम दिया गया है, वे एक ही विधि हैं।) * तो लेखकों के मुताबिक, आपका समाधान काम नहीं करेगा ... फिर भी यह पूरी तरह से काम करता प्रतीत होता है। हमम, कोई झूठ बोल रहा है। – Jazz

+0

हो सकता है कि पूर्ण टेक्स्ट को दो बार एक ही क्षेत्र में नहीं बुलाया जाना चाहिए। – juanpastas

2

में उल्लेख किया है, तो documentation सही है, तो आप fulltext दो बार फोन नहीं कर सकते हैं। इसलिए मैंने दो खोजों को चलाने और दोनों खोजों के छेड़छाड़ की गणना समाप्त कर दी।

a = Post.search do 
    fulltext "foo", {:fields => :exact_term} 
end 

b = Post.search do 
    fulltext "bar", {:fields => : alternate} 
end 

result = a & b 

आप कैसे की गणना चौराहे वास्तव में क्या आप को पूरा करने के प्रयास कर रहे हैं पर निर्भर करेगा। उपरोक्त चौराहे थोड़ा सा बेवकूफ है। उदाहरण के लिए, आप अधिकतम के खिलाफ प्रत्येक परिणाम के स्कोर को सामान्य बनाना चाहते हैं, और सॉर्टिंग उद्देश्यों के लिए सामान्यीकृत स्कोर के औसत का उपयोग करना चाहते हैं।

1

मुझे अलग-अलग मानों के साथ विभिन्न क्षेत्रों के लिए एकाधिक पूर्ण टेक्स्ट खोज करने की भी आवश्यकता है। इसके अलावा मुझे सभी शर्तों को पूरा करने की आवश्यकता है। दूसरे शब्दों में मुझे जरूरत है कि 'foo' और 'bar' दोनों को सटीक_टर और वैकल्पिक फ़ील्ड के लिए पोस्ट में होना चाहिए।

Post.search do 
    fulltext "foo", {:fields => :exact_term} 
    fulltext "bar", {:fields => :alternate} 
end 

समस्या यह थी कि मैं अपनी schema.xml सेटिंग्स (डिफ़ॉल्टऑपरेटर) नहीं बदल सका। यह 'OR' पर सेट किया गया था।आप समान समस्या है, तो आपको लगता है कि जैसे कि यह वैकल्पिक हल कर सकते हैं:

Post.search do 
    adjust_solr_params do |params| 
     params[:q] = params[:q].gsub(/\s_query/, " AND _query") if params[:q].present? 
    end 
end 
संबंधित मुद्दे