【问题标题】:SOLR Haystack splitting numericsSOLR Haystack 拆分数字
【发布时间】:2016-01-07 11:23:53
【问题描述】:

以下问题与使用 SOLR (4.9.0) 和 Haystack 的 Django 应用程序 (1.8.8) 有关。

我需要搜索的数据包含“A1234”和“ABCDE1”等各种字符串;这些字符串将出现在“文本”和“名称”字段中,定义如下:

name = indexes.CharField(indexed=True, model_attr="name")
text = indexes.EdgeNgramField(document=True, use_template=True)

如果在文本字段中搜索上述字符串之一,则不会找到,但在名称字段中搜索没有问题。如果我在文本字段中搜索时省略了该字母(例如,我搜索“1234”),那么我可以找到我要查找的内容。

在启用调试的情况下直接查询 SOLR 服务器显示这些字符串被拆分:

// text field - no hits
rawquerystring: "A1234",
querystring: "A1234",
parsedquery: "+text:a +text:1234",
parsedquery_toString: "+text:a +text:1234",
explain: { },
QParser: "LuceneQParser",

// name field - finds the correct records
rawquerystring: "name:A1234",
querystring: "name:A1234",
parsedquery: "name:a1234",
parsedquery_toString: "name:a1234",
explain: { },
QParser: "LuceneQParser",

schema.xml中与edge_ngram字段相关的部分(上面的文本字段就是这样)如下:

<fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1">
  <analyzer type="index">
    <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15"/>
    <filter class="solr.LowerCaseFilterFactory" />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1"        generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="
0" splitOnCaseChange="1" splitOnNumerics="0"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" 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="0" splitOnCaseChange="1"/>
  </analyzer>
</fieldType>

那么,有什么方法可以防止这些字符串的分裂?我原以为 splitOnNumerics="0" 选项可以解决问题(如Solr: Can't search for numbers mixed with characters 中所建议的那样),但似乎这不能应用于 solr.EdgeNGramFilterFactory。我使用了后一种工厂,因为它解决了另一个问题,即搜索“foo bar”在文本字段中找不到“foobar.com”(用户将运行这种搜索并期待命中)。

有没有人有任何解决这个问题的建议?

【问题讨论】:

    标签: solr django-haystack


    【解决方案1】:

    终于找到了。 edge_ngram 字段类型包含以下内容:

      <tokenizer class="solr.WhitespaceTokenizerFactory" />                                                                                              
        <filter class="solr.LowerCaseFilterFactory" />                                                                                                   
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 
    

    修改 WordDelimiterFilterFactory 以设置 generateNumberParts="0" 可以解决问题,同时保留该字段的其他要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多