繁体   English   中英

Django Haystack相似性搜索

[英]Django Haystack similarity search

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

编辑:

我还尝试了什么? 按照教程安装haystack 2.0,安装solr而不是whoosh,尝试Ngram字段,重建索引10次,重写search_indexes.py。 一切。 不起作用 如果我输入Comp,则找不到计算。 我还能做些什么吗? 我已经注意到,在上面的教程中,所有内容都像魅力一样立即起作用。

当您执行常规操作时:

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

在Haystack 1.x中,它会过滤所有与“计算” 完全匹配的内容。

您可以通过使用Haystack的Field Lookups来更改该行为,例如,使用“ contains”将对包含给定字符串(Computing,Utingcomp,Comp)的任何内容进行过滤:

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

在Haystack 2.x中,默认过滤器为“包含”,因此它的行为应与您期望的“开箱即用”

查看有关自动完成功能的文档。 您需要设置索引以支持Ngram的索引,但这正是您所需要的。

from haystack.query import SearchQuerySet

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

因此,如果我理解的话,您正在寻找的是SQL中的“ LIKE”。 问题在于支持Haystack的搜索引擎不像RDBMS。

此过滤器的底层实现将涉及使用通配符,但大多数Haystack后端不支持前导通配符,这对于icontains / endswith过滤器而言是必需的。 但是,由于大多数后端都支持尾随通配符,因此Haystack 2.x包含了startswith过滤器。 无法处理的唯一情况是搜索单词的结尾,这看起来是不可能的。

因此,如果您已建立索引:

"Look at our great discounts in Computer section"

然后下面的Haystack查询DO匹配:

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

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

希望能帮助到你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM