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     

要回复问题请先登录注册