【发布时间】: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