Django Haystack相似性搜索

时间:2013-01-15 14:43:41

标签: django search solr django-haystack whoosh

我是一个Django新手做一个原始的网站。我安装了haystack和Whoosh作为它的搜索引擎,因为这是最简单的事情。它工作正常,但有一个问题,我不知道如何谷歌它。我的网站上有一些类别,我已将其名称编入索引以进行搜索。因此,当用户输入“计算”时,它会找到计算类别并链接到它。但有一个问题。如果用户在搜索字段中输入“Comp”,则根本找不到“计算”。这是可以配置的东西吗?

编辑:

我还尝试了什么?在this教程之后安装haystack 2.0,安装solr而不是whoosh,尝试Ngram字段,重建索引10次,重写search_indexes.py。一切。不行。如果我输入Comp,它就找不到计算机。还有什么我能做的吗?我注意到在上面的教程中,一切都像魅力一样。

3 个答案:

答案 0 :(得分:2)

当你按常规做的时候:

SearchQuerySet().filter(title='Computing')

在Haystack 1.x中,它过滤了所有完全匹配'计算'。

您可以使用Haystack的Field Lookups来改变这种行为,例如,使用'contains'将过滤包含给定字符串的任何内容(Computing,Utingcomp,Comp):

SearchQuerySet().filter(title__contains='Comp')

在Haystack 2.x中,默认过滤器是“包含”,因此它应该像您期望的那样“开箱即用”

答案 1 :(得分:2)

查看autocomplete上的文档。您需要设置索引以支持Ngram,但这应该是您所需要的。

from haystack.query import SearchQuerySet

SearchQuerySet().autocomplete(content_auto='old')
# Result match things like 'goldfish', 'cuckold' & 'older'.

答案 2 :(得分:0)

所以,如果我理解,你所寻找的东西相当于' LIKE'在SQL中。 问题是支持Haystack的搜索引擎不像RDBMS。

此过滤器的低级实现将涉及使用通配符,但大多数Haystack后端不支持前导通配符,这是icontains / endswith过滤器所需的内容。但是,由于大多数后端支持尾随通配符,因此Haystack 2.x包含startswith过滤器。这个没有处理的唯一情况是搜索单词的结尾,这看起来是不可能的。

所以,如果你已编入索引:

"Look at our great discounts in Computer section"

然后下面的Haystack查询匹配:

SearchQuerySet().filter(title__startswith='comp')
# match!

注意Django与Haystack startswith过滤器之间的区别。 Django startswith将在完整句子的开头匹配(即CharField),但是Haystack将在标记的开头匹配(即a中的每个单词)完整的句子)。

希望它有所帮助!