这是我在模式中声明的字段类型:
<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. nn nnTEST. nnn</em>"]},
"25353":{
"text_dsc":["<em>14276|nDzień dobry - dokument testowy. nn nnTEST. nnn</em>"]},
"26693":{
"text_dsc":["<em>14276|nDzień dobry - dokument testowy. nn nnTEST. nnn</em>"]}}}
正如您所看到的,查询字符串是dobry,但整个字段都高亮显示。为什么?如果我使用solr。EdgeNGramFilterFactory如上所述,具有相同的查询高亮显示是正确的,但搜索是不正确的(总是通配符)
使用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工厂之间的区别在这个问题中得到了很好的解释:SoLR 中StandardTokenizerFactory和KeywordTokenizerFactory的区别
更新
在两个不同的字段(如)中索引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.