Lucene Hibernate-Search - 过滤查询字符串

时间:2015-07-03 12:48:25

标签: java filter lucene wildcard hibernate-search

有没有办法过滤包含通配符星号的查询字符串?

目标:当我的查询字符串为 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();
...
提前谢谢!
罗伯特

0 个答案:

没有答案