2013-08-01 133 views
8

它看起来像elasticsearch支持模糊查询(http://www.elasticsearch.org/guide/reference/query-dsl/fuzzy-query/),但我不能找出一种方法让django干草堆通过该选项。如何使用django-haystack和elasticsearch后端进行模糊搜索?

我挖掘了django-haystack搜索,看起来好像在使用elasticsearch后端时使用'match_all'查询。是否可以在不修改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

这是一个很好的方法 - 感谢您提出建议。我会尝试整合它并让你知道它是如何发生的。 –