我的django app上有一个简单的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)
来自这个应用程序的模板/ search / indexes / systems_management / device_text.txt(命名所有jibe)
...
{{ object.hostname }}
...
问题:
系统名为static1.foo.com:
如果我搜索“静态”,我会得到所有静态服务器的结果(“静态”在其描述字段中)
如果我搜索“static1”,我得到0结果
如果我搜索“static1.foo.com”,我会收到结果,包括此服务器。
我的问题是,为什么haystack / solr与“static1”查询不匹配?
答案 0 :(得分:0)
这可能是一个分析问题。我猜你在schema.xml文件中使用的是StandardTokenizer。
标准标记器将主机名称标记为单个标记。 (参考:http://www.lucidimagination.com/search/document/CDRG_ch05_5.5.1),因此您只能将其与完整的主机名匹配。
如果要逐块搜索,则需要使用其他标记器。 Solr示例中的默认文本字段使用WhitespaceTokenizer和WordDelimeter过滤器,它将拆分主机名。这将允许您通过查询'static1'找到。
答案 1 :(得分:0)
Solr有许多可能的配置。对于您的用例,您可能希望在schema.xml中使用边缘ngram。这是一个例子:
<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>
使用此示例并略微调整它,直到它返回所需的结果。