我一直在与Solr v4.10.2与通配符的PhraseQuery抗争!我的字段定义如下:
<!-- Search field -->
<field name="title" type="text_pt_en" indexed="true" stored="true" />
<!-- Field definition -->
<fieldType name="text_pt_en" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<charFilter class="solr.HTMLStripCharFilterFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_pt.txt" format="snowball" enablePositionIncrements="true" />
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<!-- <tokenizer class="solr.KeywordTokenizerFactory" /> -->
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false" />
<filter class="solr.ReversedWildcardFilterFactory" />
</analyzer>
<analyzer type="query">
<charFilter class="solr.HTMLStripCharFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_pt.txt" format="snowball" enablePositionIncrements="true" />
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<!-- <tokenizer class="solr.KeywordTokenizerFactory" /> -->
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false" />
</analyzer>
</fieldType>
让我们假设我将以下值添加到上面字段的索引中(葡萄牙语):
Teste de texto; Será quebrado em espaços em branco!
根据分析器链添加到索引中的值将是(来自Solr"Analysis"):
etset teste ;otxet texto; odarbeuq quebrado socapse espacos !ocnarb branco!
今天,我可以搜索,例如:
title:teste
title:(teste texto)
title:(teste de texto)
title:("teste de texto;") // (PhraseQuery) matches because of ";" in the end of the string
但是,如果我尝试搜索(PhraseQuery):
title:("teste de texto")
"parsedquery": "PhraseQuery(title:"teste ? texto")"
title:("teste de texto*")
"parsedquery": "PhraseQuery(title:"teste ? texto*")"
不返回任何结果。
我已经阅读了关于这个问题的可能解决方案,但它们似乎都不起作用:
- MultitermQueryAnalysis
- 复杂短语查询解析器
和我只是不能理解为什么查询通配符在最后:"*"不工作,没有返回结果。
一些评论:
- 我无法控制在搜索中输入的内容,它是由应用程序的用户输入的,但我希望它像"文件列表"一样工作,就像一个简单的"glob";
- 今天我不能改变我的标记器为:"StandardTokenizerFactory"(在这种情况下会工作),因为我需要搜索电子邮件,冒号的单词,例如;
- 我尝试了:"KeywordTokenizer",但我有与上面相同的行为;
- 我读到:"ShingleFilterFactory",但我的索引将是巨大的,因为我需要索引全文(超过30000个字符);
你能帮我了解发生了什么,如果有办法使一个通配符的PhraseQuery工作,我的选择是什么?
如果您需要进一步的信息,请告诉我,非常感谢您的关注和帮助!
我用下面的配置找到了解决问题的方法:
<analyzer type="index">
<charFilter class="solr.HTMLStripCharFilterFactory" />
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory" preserveOriginal="false" />
<filter class="solr.ReversedWildcardFilterFactory" />
</analyzer>
使用复杂短语查询解析器进行搜索,如下所示,现在返回所需的文档:
{!complexphrase df=title}"teste de texto*"
我认为我最后一个字段设置的问题是StopFilterFactory,正如复杂短语查询解析器文档所述:"建议不要在此查询解析器中使用停止词消除。"[1]
我已经做了一些测试,到目前为止,这个设置符合我的需求(查询)。
[1] https://cwiki.apache.org/confluence/display/solr/Other +解析器# OtherParsers-ComplexPhraseQueryParser