如何解决Solr的Django-Haystack包含搜索
| 我在使用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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。