2013-12-18 5 views
5

का उपयोग कर किसी फ़ील्ड के सबस्ट्रिंग द्वारा फ़िल्टर करें मेरे पास एक Django प्रोजेक्ट है जो अनुक्रमण के लिए एसओएलआर का उपयोग करता है।Django Haystack - SearchQuerySet()

मैं Haystack के SearchQuerySet वर्ग का उपयोग कर एक सबस्ट्रिंग खोज करने के लिए कोशिश कर रहा हूँ।

उदाहरण के लिए, जब अवधि "कान", यह प्रविष्टि मूल्य के साथ एक क्षेत्र है कि लौटना चाहिए की खोज करता है: "खोज"। आप देख सकते हैं, "कान"के SUBSTRING "खोज" है। (जाहिर है :))

दूसरे शब्दों में, एक आदर्श Django दुनिया में मैं की तरह कुछ करना चाहते हैं: SearchQuerySet (https://django-haystack.readthedocs.org/en/latest/searchqueryset_api.html#field-lookups) के लिए

SearchQuerySet().all().filter(some_field__contains_substring='ear') 

भूसे के ढेर प्रलेखन में, यह कहते हैं कि केवल निम्नलिखित क्षेत्र LOOKUP प्रकार समर्थित हैं:

  • सटीक
  • शामिल 10
  • जीटी, gte, लेफ्टिनेंट, एलटीई
  • में
  • startswith
  • रेंज

मैं का उपयोग कर की कोशिश की __ हैं, लेकिन उसकी वास्तव में की तरह __exact, जो लग रहा है बर्ताव करता है एक वाक्य में सटीक शब्द (पूरा शब्द), एक शब्द का एक substring नहीं।

मैं उलझन में हूं, क्योंकि ऐसी कार्यक्षमता बहुत बुनियादी है, और मुझे यकीन नहीं है कि मुझे कुछ याद आ रहा है, या इस समस्या से संपर्क करने का एक और तरीका है (रेगेक्स या कुछ का उपयोग कर?)।

धन्यवाद

उत्तर

5

EdgeNgramField क्षेत्र का उपयोग किया जा सकता है कि:

some_field = indexes.EdgeNgramField() # also prepare value for this field or use model_attr 

फिर आंशिक मैच के लिए:

SearchQuerySet().all().filter(some_field='ear') 
+3

धन्यवाद! आपका जवाब 100% सही नहीं है, लेकिन यह मुझे सही दिशा में ले जाता है। समाधान ** NgramField ** का उपयोग करना था, ** EdgeNgramField ** नहीं, इस तरह: 'some_field = indexes.NgramField (model_attr = 'some_field')'। ** EdgeNgramField ** _ _ "से शुरू होता है" _ और _ "समाप्त होता है" _ फ़िल्टरिंग के प्रकार के साथ ही कर सकता है। – Nahn

+0

मैं सोलर के साथ काम नहीं कर रहा था लेकिन ElastiSearch के साथ ** NgramField ** का उपयोग किया। –

+1

एजग्राम फ़ील्ड '__contains' की तरह काम नहीं कर रहा है, यह उपजी के आधार पर काम करता है और अन्य मैचों को ढूंढता है, इसलिए यह इसमें से अधिक अस्पष्ट परिणाम सेट पर पहुंच जाएगा। – shredding

0

यह भूसे के ढेर में एक बग है।

जैसा कि आपने कहा था, __exact बिल्कुल __contains जैसा लागू किया गया है और इसलिए यह कार्यक्षमता हैस्टैक में बॉक्स से बाहर नहीं है।

ठीक इंतजार कर रहा है यहाँ विलय: https://github.com/django-haystack/django-haystack/issues/1041

आप इस तरह एक निश्चित रिहाई के लिए इंतज़ार कर रहे समय को पाटने कर सकते हैं:

from haystack.inputs import BaseInput, Clean 


class CustomContain(BaseInput): 
    """ 
    An input type for making wildcard matches. 
    """ 
    input_type_name = 'custom_contain' 

    def prepare(self, query_obj): 
     query_string = super(CustomContain, self).prepare(query_obj) 
     query_string = query_obj.clean(query_string) 

     exact_bits = [Clean(bit).prepare(query_obj) for bit in query_string.split(' ') if bit] 
     query_string = u' '.join(exact_bits) 

     return u'*{}*'.format(query_string) 

# Usage: 
SearchQuerySet().filter(content=CustomContain('searchcontentgoeshere')) 
संबंधित मुद्दे