Python Django Haystack和Solr包含搜索

Python Django Haystack和Solr包含搜索,python,django,solr,django-haystack,Python,Django,Solr,Django Haystack,我在一个项目中使用haystack,使用solr作为后端。我希望能够执行包含搜索,类似于Django.filter(something\uu contains=“…”) \uu startswith选项不适合我们的需要,因为顾名思义,它查找以字符串开头的单词 我尝试使用类似于*关键字*的东西,但Solr不允许将*用作第一个字符 谢谢。要获得“包含”功能,您可以使用: <tokenizer class="solr.WhitespaceTokenizerFactory"/> <fi

我在一个项目中使用
haystack
,使用
solr
作为后端。我希望能够执行包含搜索,类似于Django
.filter(something\uu contains=“…”)

\uu startswith
选项不适合我们的需要,因为顾名思义,它查找以字符串开头的单词

我尝试使用类似于
*关键字*
的东西,但Solr不允许将
*
用作第一个字符

谢谢。

要获得“包含”功能,您可以使用:

<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="100" side="back"/>
<filter class="solr.LowerCaseFilterFactory" />
如您所见,这将大大扩展索引,但如果您现在输入以下查询:

"nde*"
它将匹配“ndex”,给你一个打击


仔细使用此方法以确保索引不会变得太大。如果增加minGramSize或减少maxGramSize,则不会将索引扩展为mutch,而是会减少“contains”功能。例如,设置minGramSize=“3”要求您的contains查询中至少有3个字符。

我使用的表达式如下: .filter(某物\uu startswith='…') .filter_或(name=''+s'…'))
看起来solr不喜欢像“…*”这样的表达式,但与之结合或将要做的事

您可以实现相同的行为,而无需接触solr模式。在索引中,将文本字段设置为EdgeNgramField而不是CharField。在引擎盖下,这将生成一个类似于lindstromhenrik建议的模式。

这里的答案都没有真正的子字符串搜索
*关键字*

他们找不到属于较大字符串的关键字(不是前缀后缀

使用索引中的
EdgeNGramFilterFactory
EdgeNgramField
,只能执行“启动”或“结束”类型的过滤

解决方案是使用如下的NgramField

class MyIndex(indexes.SearchIndex, indexes.Indexable):
    ...
    field_to_index= indexes.NgramField(model_attr='field_name')
    ...

这非常优雅,因为您不需要手动向架构添加任何内容。xml

是“关键字”是一个完整的单词还是您正在尝试搜索部分单词?粘贴在此处的解决方案:
class MyIndex(indexes.SearchIndex, indexes.Indexable):
    ...
    field_to_index= indexes.NgramField(model_attr='field_name')
    ...