2013-08-01 1 views
8

Похоже, что elasticsearch поддерживает нечеткие запросы (http://www.elasticsearch.org/guide/reference/query-dsl/fuzzy-query/), но я не могу понять, как пройти django-haystack в этой опции.Как я могу сделать нечеткий поиск, используя django-haystack и бэкэнд elasticsearch?

Я впился в поиск django-haystack и выглядит так, как если бы он использовал запрос match_all при использовании бэкэнда elasticsearch. Возможно ли получить поведение с нечетким совпадением без необходимости изменять исходный код django-haystack?

Стог Источник: https://github.com/toastdriven/django-haystack/blob/master/haystack/backends/elasticsearch_backend.py (метод build_search_kwargs является то, что я подозреваю, что мне нужно изменить)

+0

Дэн, вы что-то достигли этого? – Alp

+1

@Alp - Да. Я закончил использовать предложение bennylope, хотя мне потребовалось довольно много времени, чтобы выяснить, как структурировать запрос и какой конечный пункт его отправить. Затем я понял, что это не так конфигурируемо, как хотелось бы, поэтому я сделал несколько шагов назад и получил более широкий набор результатов поиска, а затем прошел через них своим собственным «нечетким» алгоритмом. –

ответ

6

Нет необходимости раскошелиться Хейстек, вы можете обновить этот метод в вашем собственном внутреннем интерфейсе (для получения более подробной информации см Stretching Haystack's ElasticSearch Backend). Метод build_search_kwargs возвращает словарь, поэтому вы можете просто изменить исходное возвращаемое значение.

Отказ от ответственности: Этот код является лишь примером того, как можно обновить свой бэкенд, не как реализовать нечеткий поиск.

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

Это хороший подход - спасибо за предложение. Я попробую интегрировать его и сообщить, как это происходит. –