微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Solr的Django-Haystack包含搜索

如何解决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 举报,一经查实,本站将立刻删除。