django / haystack / solr simple config - 部分字段匹配问题

时间:2010-02-03 03:16:14

标签: python django solr django-haystack pysolr

我的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”查询不匹配?

2 个答案:

答案 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>

使用此示例并略微调整它,直到它返回所需的结果。