问题描述
|
我在使用
solr
作为后端的项目中使用haystack
。我希望能够执行包含搜索,类似于Django.filter(something__contains=\"...\")
顾名思义,“ 3”选项不符合我们的需求,它会查找以字符串开头的单词。
我尝试使用类似*keyword*
的方法,但Solr不允许将*
用作第一个字符
谢谢。
解决方法
要获得“包含”功能,可以使用:
<tokenizer class=\"solr.WhitespaceTokenizerFactory\"/>
<filter class=\"solr.EdgeNGramFilterFactory\" minGramSize=\"1\" maxGramSize=\"100\" side=\"back\"/>
<filter class=\"solr.LowerCaseFilterFactory\" />
作为索引分析器。
这将为您的字段中每个空格分隔的单词创建ngram。例如:
\"Index this!\" => x,ex,dex,ndex,index,!,s!,is!,his!,this!
如您所见,这将大大扩展索引,但是如果您现在输入如下查询:
\"nde*\"
它将与\“ ndex \”匹配,从而为您带来成功。
请仔细使用此方法,以确保索引不会太大。如果增加minGramSize或减小maxGramSize,它将不会扩展索引,而会降低“包含”功能。例如,设置minGramSize = \“ 3 \”将要求您的包含查询中至少包含3个字符。
, 您无需触摸solr模式即可实现相同的行为。在索引中,将文本字段设置为EdgeNgramField而不是CharField。在引擎盖下,这将生成与lindstromhenrik建议的模式类似的模式。
, 我正在使用类似这样的表达式:
.filter(something__startswith = \'... \')
.filter_or(name = \'\'+ s \'... \')
好像solr不喜欢\'... * \'这样的表达式,但是与or结合使用
, 这里没有任何答案可以进行真正的子字符串搜索*keyword*
。
他们找不到较大字符串(不是前缀或后缀)一部分的关键字。
在索引中使用EdgeNGramFilterFactory
或EdgeNgramField
只能执行\“ startswith \”或\“ endswith \”类型的过滤。
解决方案是使用这样的NgramField:
class MyIndex(indexes.SearchIndex,indexes.Indexable):
...
field_to_index= indexes.NgramField(model_attr=\'field_name\')
...
这非常优雅,因为您无需手动将任何内容添加到schema.xml