SOLR干草堆分裂数字

时间:2016-01-07 11:23:53

标签: solr django-haystack

以下问题涉及使用SOLR(4.9.0)和Haystack的Django应用程序(1.8.8)。

我需要搜索的数据包含各种字符串,例如" A1234"和" ABCDE1&#34 ;;这些字符串会出现在" text"和"名称"字段定义如下:

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",

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

<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 =&#34; 0&#34;选项会对问题进行排序(如Solr: Can't search for numbers mixed with characters中所示),但似乎无法应用于solr.EdgeNGramFilterFactory。我使用了后一个工厂,因为它解决了另一个搜索&#34; foo bar&#34;找不到&#34; foobar.com&#34;在文本字段中(用户将运行此类搜索并期望点击)。

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

1 个答案:

答案 0 :(得分:0)

终于找到了它。 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”,同时保留了该字段的其他要求。