有没有办法过滤包含通配符星号的查询字符串?
目标:当我的查询字符串为 capi *时,我想找到其他许多文字短语“德国的首都是柏林” of * germa * 。
环境:使用@AnalyzerDef
完成了一个包含StopWordFilter的分析器定义。我使用这个分析器通过Lucene-Query-parser进行索引构建和搜索。
因此,虽然索引像“首都德国柏林”这样的索引被编入索引 - 但是删除了停用词。
问题:查询字符串的处理方式不同,我猜是因为通配符星号。
得到的lucene查询是: +(field:capi *)+(field:of *)+(field:germa *) 如果我删除了通配符星号,则lucene-query为: +(field:capi)+(field:germa)删除它。
问题:有没有办法摆脱甚至查询字符串包含通配符星号的禁用词?有没有其他方法可以做到这一点 - 比如设置一个选项“wildcardeverthing”?
注意:我想重用预定义的分析器,所以我不必重新实现过滤器链来处理查询字符串。
部分代码:
分析器 - 定义(实际版本为德语):
@AnalyzerDef(
name = "whitespaceAnalyzer_DE",
tokenizer = @TokenizerDef( factory = WhitespaceTokenizerFactory.class ),
filters = {
@TokenFilterDef( factory = StandardFilterFactory.class ),
@TokenFilterDef( factory = LowerCaseFilterFactory.class ),
@TokenFilterDef(
factory = GermanStopFilterFactory.class,
params = { @Parameter(name = "ignoreCase",value = "true")}),
@TokenFilterDef(
factory = SnowballPorterFilterFactory.class,
params = { @Parameter( name = "language", value = "German2")})
})
GermanStopFilterFactory
就像它被命名为德语停用词的过滤器。
搜索:
...
String queryString = "capi* of* germa*";
FullTextSession fullTextSession = Search.getFullTextSession( getCurrentSession() );
Analyzer whitespaceAnalyzer_DE = fullTextSession.getSearchFactory().getAnalyzer("whitespaceAnalyzer_DE" );
Map<String, Analyzer> fieldAnalyzer = new HashMap<String, Analyzer>( 3 );
fieldAnalyzer.put( "field", standardAnalyzer_DE );
PerFieldAnalyzerWrapper perFieldAnalyzer = new PerFieldAnalyzerWrapper( new StandardAnalyzer(), fieldAnalyzer );
MultiFieldQueryParser parser = new MultiFieldQueryParser( new String[] {"field"}, perFieldAnalyzer );
parser.setDefaultOperator( Operator.AND );
org.apache.lucene.search.Query luceneQuery = parser.parse( queryString );
FullTextQuery textQuery = fullTextSession.createFullTextQuery( luceneQuery, getGenericsClass() );
List searchResult = textQuery.list();
...
提前谢谢!