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')
...