2013-12-18 22 views
5

Dizin oluşturma için SOLR kullanan bir Django projem var. Django Haystack - SearchQuerySet kullanarak bir alanın alt dizine göre filtrele()

Ben samanlıkta en SearchQuerySet sınıfını kullanarak bir alt dize ara ' yapmaya çalışıyorum.

Örneğin

terimi "kulağa", bu değere sahip bir alan vardır girişi dönmelidir için arama yaptığında: "Ara". Gördüğünüz gibi, "kulak" "Ara" bir SUBSTRING olduğunu. (Besbelli :))

Başka bir deyişle, mükemmel bir Django dünyada ben gibi bir şey istiyorum: SearchQuerySet (https://django-haystack.readthedocs.org/en/latest/searchqueryset_api.html#field-lookups) için samanlık belgelerinde

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

, sadece aşağıdaki söylüyor SAHA ARA türü desteklenir:

  • tam
  • içerir 10
  • gt, GTE, lt, LTE
  • içinde
  • startswith
  • I __ içerir kullanılarak çalıştı, ancak bakar gibi tam olarak __exact, davranır

aralığı Bir cümlede tam sözcük (tüm kelime), bir kelimenin bir alt dizesi değil.

Kafam karıştı, çünkü böyle bir işlevsellik oldukça basit ve bir şeyleri kaçırdığımdan emin değilim, ya da bu probleme yaklaşmanın başka bir yolu var mı? (Regex'i mi kullanıyorsun?).

Teşekkür

EdgeNgramField alanını kullanarak yapılabilir

cevap

5

:

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

Sonra kısmi maç için:

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

teşekkür ederiz! Cevabınız% 100 doğru değil, ama bana doğru yönde yol gösteriyor. Çözüm ** NeamField ** 'ı kullanmak değil, ** EdgeNgramField **' ı, bunun gibi: 'some_field = indexes.NgramField (model_attr = 'some_field')'. ** EdgeNgramField **, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ – Nahn

+0

Solr'la çalışmadım, ama ** NgramField ** kullanmam ElastiSearch ile benim için çalıştı. –

+1

EdgeNgram Alanı, '__contains' gibi çalışmıyor, kaynaklanıyor ve sapları temel alan diğer eşleşmeleri buluyor, dolayısıyla içerden çok daha bulanık bir sonuç kümesine yol açıyor. – shredding

0

O samanlıkta böcek.

__contains gibi tam olarak uygulandığından, __exact tam olarak uygulandığından, bu işlev samanlıktaki kutuda mevcut değildir.https://github.com/django-haystack/django-haystack/issues/1041

Böyle bir sabit serbest bırakılması için bekleme süresini köprü olabilir:

düzeltme burada birleştirme bekliyor

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')) 
İlgili konular