【问题标题】:Django Haystack Whoosh Tokenized SearchDjango Haystack Whoosh 标记化搜索
【发布时间】:2013-07-28 19:34:24
【问题描述】:

假设我在搜索索引中有一条包含此字符串“hairdresser doing great work”的记录。

如何使搜索查询“奥克兰的理发师”仍然在搜索结果中返回上述记录?

我试过了,但我觉得这不是正确的做法:

for word in query.split(' '):
  result = SearchQuerySet().filter_or(content=word)

而且我不想使用 SOLR 我觉得安装 SOLR 只是为了解决这种不会一直发生的搜索。

【问题讨论】:

  • 你用的是什么版本的 haystack?
  • @twil django-haystack==1.2.7

标签: django tokenize django-haystack whoosh


【解决方案1】:

另一种更干燥的方法是指定您自己的input type,它处理将字符串转换为一系列或过滤器。您还可以使用 Raw 输入类型传递特定于 Whoosh 的查询。

如果你只需要在几个地方使用它,我会坚持你现在的做法。否则我会为它指定一个输入类型。

编辑:Whoosh 的默认解析器使用简单的boolean operators。正如您在文档中看到的,默认运算符是AND。要获得 Whoosh 的正确查询,只需执行以下操作:

query = ' OR '.join(query.split(' '))
result = SearchQuerySet().filter(content=Raw(Clean(query)))

Clean 自动转义输入以防止恶意代码注入。

【讨论】:

  • 你知道谁的语法吗?
  • @JamesLin 我用Raw 输入类型的正确代码更新了我的答案。
  • 我已恢复使用 1.2.7,因为 whoosh 不会缩小模型并且 xapian 没有得到很好的支持。现在我只能使用 raw_search(),但是当我使用它时,我得到了unbound method Query_empty() must be called with Query instance as first argument (got str instance instead)
  • 这就是我所拥有的results = SearchQuerySet().raw_search('listing: "photo"').models(Listing)
  • @James 使用 raw_search 时不能使用默认方法链接,这就是 models(Listing) 抛出错误的原因。这是raw_search 的限制,它是一个原始搜索查询,仅此而已。要么在原始搜索中包含 models() 约束(如果可能的话,我不知道 Whoosh 查询解析的细节)或使用 filter_or 方法。
【解决方案2】:

我设法通过使用auto_query() 实现(某种程度)这个目标

whoosh 或 xapian 都能够搜索查询中单词的顺序丢弃,但如果搜索查询包含索引中不存在的单词,则不会匹配任何内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    相关资源
    最近更新 更多