Django-Haystack与Solr的搜索功能

8 投票
4 回答
2995 浏览
提问于 2025-04-16 19:30

我在一个项目中使用了 haystack,而这个项目的后台是 solr。我想实现一种包含搜索,类似于 Django 中的 .filter(something__contains="...")

但是 __startswith 这个选项不太适合我们,因为它的意思是查找以某个字符串开头的单词。

我尝试使用像 *keyword* 这样的方式,但 Solr 不允许 * 作为第一个字符使用。

谢谢。

4 个回答

0

我正在使用这样的表达式:
.filter(something__startswith='...')
.filter_or(name=''+s'...')
看起来solr不喜欢像'
...'这样的表达式,但和“或”结合使用就可以了。

2

你可以在不修改solr的结构文件的情况下,达到相同的效果。在你的索引中,把你的文本字段设置为EdgeNgramField,而不是CharField。这样做的背后,会生成一个和lindstromhenrik建议的类似的结构。

10

要实现“包含”功能,你可以使用:

<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="100" side="back"/>
<filter class="solr.LowerCaseFilterFactory" />

作为索引分析器。

这会为你字段中每个用空格分开的单词创建n-gram。举个例子:

"Index this!" => x, ex, dex, ndex, index, !, s!, is!, his!, this!

正如你所看到的,这会大大扩展你的索引,但如果你现在输入一个查询,比如:

"nde*"

它会匹配“ndex”,这样就能找到结果。

使用这种方法时要小心,以确保你的索引不会变得太大。如果你增加minGramSize,或者减少maxGramSize,索引的扩展会减少,但“包含”功能也会降低。例如,将minGramSize设置为“3”就意味着你的查询中至少要有3个字符。

撰写回答