我一直在与 Solr v4.10.2 一起使用 PhraseQuery with wildcard 进行挣扎! 我的字段定义如下:
<!-- 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*\")"
不会返回任何结果。
我已经阅读过有关此问题的可能解决方案,但它们似乎都没有效果:
而我无法理解为什么最后使用通配符的查询:“*”不起作用,不会返回任何结果。
一些意见:
如果有办法用通配符制作PhraseQuery并有什么选择,请你帮我理解会发生什么?
如果您需要进一步的信息,请告诉我,非常感谢您的关注和帮助!
答案 0 :(得分:0)
我通过以下配置找到了解决问题的方法:
<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+Parsers#OtherParsers-ComplexPhraseQueryParser