这是我在架构中声明的字段类型:
<fieldType name="c_string" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.ReversedWildcardFilterFactory" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
我可以毫无问题地使用通配符进行搜索。但我有突出功能的一些问题。 Solr突出了整个而不仅仅是匹配的短语。例如,我的搜索查询是title:Keyword*
。所以solr只会显示与wilcard匹配的文档。但重点是:
"title": [
"<em>Keyword and the rest of title</em>"
但我想:
"title": [
"<em>Keyword</em> and the rest of title"
如果我像这样使用 solr.EdgeNGramFilterFactory ,这就像我想要的那样:
<fieldType name="text_general_edge_ngram" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
</analyzer>
</fieldType>
如果我使用它,突出显示就可以,但忽略通配符。 Solr始终使用通配符进行搜索,title:Keyword
title:Keyword*
的工作原理相同 - 显然title:Keyword
不应与任何内容匹配。
你有任何提示吗?
[加入] 示例查询:
select?q=text_dsc%3A*dobry*&rows=200&wt=json&indent=true&hl=true&hl.fl=text_dsc&hl.simple.pre=<em>&hl.simple.post=<%2Fem>
示例突出显示结果:
"highlighting":{
"25352":{
"text_dsc":["<em>14276|\nDzień dobry - dokument testowy. \n\n \n\nTEST. \n\n\n</em>"]},
"25353":{
"text_dsc":["<em>14276|\nDzień dobry - dokument testowy. \n\n \n\nTEST. \n\n\n</em>"]},
"26693":{
"text_dsc":["<em>14276|\nDzień dobry - dokument testowy. \n\n \n\nTEST. \n\n\n</em>"]}}}
如您所见,查询字符串是 dobry ,但整个字段都会突出显示。为什么?如果我使用上面提到的solr.EdgeNGramFilterFactory,使用相同的查询突出显示是正确的但搜索不正确(总是通配符)
答案 0 :(得分:3)
使用StandardTokenizerFactory,您将获得所需的输出:
<fieldType name="c_string" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.ReversedWildcardFilterFactory" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
这个问题很好地解释了StandardTokenizerFactory和KeywordTokenizerFactory工厂之间的区别: difference between StandardTokenizerFactory and KeywordTokenizerFactory in SoLR
<强>更新强>
将text_dsc索引在两个不同的字段中,例如
<fieldType name="text_dsc" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.ReversedWildcardFilterFactory" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
<fieldType name="text_dsc_standard" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.ReversedWildcardFilterFactory" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
</fieldType>
在您的搜索查询中设置hl.fl = text_dsc_standard。