【问题标题】:django / haystack / solr simple config - partial field matching issuedjango / haystack / solr 简单配置 - 部分字段匹配问题
【发布时间】:2010-02-03 03:16:14
【问题描述】:

我在 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”查询?

【问题讨论】:

    标签: python django solr django-haystack pysolr


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的意见。我从配置中看到了 schema.xml 中的拼写位置。我将我的 schema.xml 编辑为如下所示: 然后我重建了我的索引,但我搜索部分主机名仍然没有结果: ... static1 ... 我不知道我缺少什么(其他)。
    【解决方案2】:

    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>
    

    使用这个例子并稍微调整一下,直到它返回所需的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 2012-07-17
      • 2015-04-07
      • 1970-01-01
      相关资源
      最近更新 更多