以下问题涉及使用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;在文本字段中(用户将运行此类搜索并期望点击)。
有没有人有任何解决这个问题的建议?
答案 0 :(得分:0)
<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”,同时保留了该字段的其他要求。