django/haystack/solr简单配置 - 部分字段匹配问题

0 投票
2 回答
1410 浏览
提问于 2025-04-15 18:49

我在我的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'来找到相关内容。

撰写回答