【问题标题】:Django Haystack similarity searchDjango Haystack 相似性搜索
【发布时间】:2012-12-29 16:39:38
【问题描述】:

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

编辑:

我还尝试了什么?安装 haystack 2.0,遵循this 教程,安装 solr 而不是 whoosh,尝试 Ngram 字段,重建索引 10 次,重写 search_indexes.py。一切。不工作。如果我输入 Comp,它不会找到 Computing。还有什么我可以做的吗?我注意到在上面的教程中,一切都像魅力一样立即发挥作用。

【问题讨论】:

    标签: django search solr django-haystack whoosh


    【解决方案1】:

    当你照常做时:

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

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

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

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

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

    【讨论】:

    • 我真的不知道如何设置。我只是通过教程使其工作并且不知道如何做到这一点。
    • 最简单的可行方法是升级到 Haystack 2.x (pip install -e git+github.com/toastdriven/…) - 它仍处于测试阶段,但我发现它足够稳定,可以使用。下一个最好的事情,但本教程并未真正涵盖(尽管随着您习惯 Django 开发,您最终会做这种事情),是使用上述更改创建您自己的搜索表单 (django-haystack.readthedocs.org/en/latest/…)。
    • 不,这不起作用。我安装了 haystack 2,安装了嗖嗖声,不起作用。安装了solr,不行。啊,好吧。
    • 我尝试过使用 __contains 字段查找。它总是返回 0 个结果。我可以执行 SearchQuerySet.all() 并获得结果,但不能使用过滤器。这太痛苦了!有什么建议吗?
    【解决方案2】:

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

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

    【讨论】:

    • 这不是我想要的。
    • 但使用“戴绿帽子”加 1 :)
    【解决方案3】:

    所以,如果我理解的话,您正在寻找的是相当于 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 将匹配token 的开头(即完整句子中的每个单词)。

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-25
      • 2013-02-12
      • 2014-07-17
      • 1970-01-01
      • 2015-12-28
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多