Django Haystack - Filter by substring of a field using SearchQuerySet ()

后端 未结 2 1792
醉梦人生
醉梦人生 2020-12-18 07:05

I have a Django project that uses SOLR for indexing.

I\'m trying to do a substring search using Haystack\'s SearchQuerySet

相关标签:
2条回答
  • 2020-12-18 07:20

    It's a bug in haystack.

    As you said, __exact is implemented exactly like __contains and therefore this functionality does not exists out of the box in haystack.

    The fix is awaiting merge here: https://github.com/django-haystack/django-haystack/issues/1041

    You can bridge the waiting time for a fixed release like this:

    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'))
    
    0 讨论(0)
  • 2020-12-18 07:39

    That could be done using EdgeNgramField field:

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

    Then for partial match:

    SearchQuerySet().all().filter(some_field='ear')
    
    0 讨论(0)
提交回复
热议问题