2013-08-01 35 views
8

Dường như elasticsearch hỗ trợ truy vấn mờ (http://www.elasticsearch.org/guide/reference/query-dsl/fuzzy-query/) nhưng tôi không thể tìm ra cách để có quyền truy cập django-haystack trong tùy chọn đó.Làm cách nào tôi có thể thực hiện tìm kiếm mờ bằng django-haystack và chương trình phụ trợ elasticsearch?

Tôi đào vào tìm kiếm django-haystack và có vẻ như nó đang sử dụng truy vấn 'match_all' khi sử dụng chương trình phụ trợ elasticsearch. Có thể để có được hành vi phù hợp mờ mà không cần phải sửa đổi mã nguồn django-haystack?

Haystack Nguồn: https://github.com/toastdriven/django-haystack/blob/master/haystack/backends/elasticsearch_backend.py (phương pháp build_search_kwargs là những gì tôi nghi ngờ tôi cần phải thay đổi)

+0

Dan, bạn có thực hiện bất kỳ tiến triển nào về điều này không? – Alp

+1

@Alp - Yep. Tôi đã kết thúc bằng cách sử dụng gợi ý của bennylope mặc dù nó đã cho tôi khá nhiều thời gian để tìm ra cách để cấu trúc các yêu cầu và điểm cuối cùng để gửi nó quá. Sau đó tôi nhận ra rằng nó không được cấu hình như tôi muốn vì vậy tôi đã kết thúc một vài bước trở lại và nhận được một bộ lớn hơn của kết quả tìm kiếm trở lại và sau đó đi qua chúng với thuật toán "mờ ảo" của riêng tôi. –

Trả lời

6

Không cần đến ngã ba Haystack, bạn có thể cập nhật phương thức mà trong backend của riêng bạn (để biết thêm chi tiết, xem Stretching Haystack's ElasticSearch Backend). Phương thức build_search_kwargs trả về một từ điển để bạn chỉ có thể sửa đổi giá trị trả về ban đầu.

Disclaimer: mã này chỉ là một ví dụ về cách bạn có thể cập nhật backend của riêng bạn, không làm thế nào để thực hiện tìm kiếm mờ.

class FuzzyBackend(ElasticsearchSearchBackend): 
    def build_search_kwargs(self, query_string, **kwargs): 
     fuzzy = kwargs.pop('fuzzy', False) 
     fuzzy_field = kwargs.pop('min_similarity', '') 
     search_kwargs = super(FuzzyBackend, self).build_search_kwargs(
       query_string, kwargs) 
     if fuzzy: 
      search_kwargs = {'fuzzy': {fuzzy_field: query_string}} 
     return search_kwargs 
+1

Đó là một cách tiếp cận tốt - cảm ơn vì đã đề xuất nó. Tôi sẽ cố gắng tích hợp nó và cho bạn biết làm thế nào nó đi. –

Các vấn đề liên quan