django/haystack/solr简单配置 - 部分字段匹配问题
我在我的Django应用中配置了一个简单的haystack/solr:
来自这个应用的models.py文件:
class device(models.Model):
...
hostname = models.CharField(max_length=45, help_text="The hostname for this device")
...
来自这个应用的search_sites.py文件:
class devIndex(indexes.SearchIndex):
'''Haystack class to allow for indexing device objects in TOMS'''
text = indexes.CharField(document=True, use_template=True)
来自这个应用的templates/search/indexes/systems_management/device_text.txt文件(这里面列出了所有的名称)
...
{{ object.hostname }}
...
问题是:
有一个系统叫做static1.foo.com:
如果我搜索“static”,我会得到所有静态服务器的结果(因为“static”在它们的描述字段里)
如果我搜索“static1”,我没有得到任何结果
如果我搜索“static1.foo.com”,我得到了结果,包括这个服务器。
我的问题是,为什么haystack/solr没有匹配到“static1”的查询?
2 个回答
0
Solr有很多配置选项。根据你的需求,你可能需要在schema.xml文件中使用边缘n-gram。下面是一个例子:
<fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="1"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="15" side="front" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="1"/>
</analyzer>
你可以参考这个例子,稍微调整一下,直到它返回你想要的结果。
0
这可能是分析的问题。我猜您在schema.xml文件中为这个字段使用了标准分词器(StandardTokenizer)。
标准分词器会把主机名当作一个整体来处理,也就是说,它会把整个主机名看作一个单独的词(参考链接:http://www.lucidimagination.com/search/document/CDRG_ch05_5.5.1),所以您只能用完整的主机名来进行匹配。
如果您想按部分来搜索,就需要使用不同的分词器。Solr示例中的默认文本字段使用的是空格分词器(WhitespaceTokenizer)和词分隔符过滤器(WordDelimeter filter),这会把主机名拆分开来。这样您就可以通过查询'静态1'来找到相关内容。