0

我的 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)

来自此应用程序的模板/搜索/索引/systems_management/device_text.txt(名称全部为jibe)

...
{{ object.hostname }}
...

问题:

一个名为 static1.foo.com 的系统:

如果我搜索“静态”,我会得到所有静态服务器的结果(“静态”在它们的描述字段中)

如果我搜索“static1”,我得到 0 个结果

如果我搜索“static1.foo.com”,我会得到结果,包括这个服务器。

我的问题是,为什么 haystack/solr 不匹配“static1”查询?

4

2 回答 2

0

这可能是一个分析问题。我猜您在 schema.xml 文件中为此字段使用了 StandardTokenizer。

标准标记器将主机名标记为单个标记。(参考:http ://www.lucidimagination.com/search/document/CDRG_ch05_5.5.1 ),所以你只能将它与完整的主机名匹配。

如果要按部分搜索,则需要使用不同的分词器。Solr 示例中的默认文本字段使用 WhitespaceTokenizer 和 WordDelimeter 过滤器,它将拆分主机名。这将允许您通过“static1”的查询来查找。

于 2010-02-05T21:43:36.577 回答
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>

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

于 2011-12-22T09:22:43.990 回答