2017-01-07 78 views
1

我有搜索很多次,但不能修复我的问题, 这里是我的代码:的Apache Lucene搜索与停止的话

BooleanJunction<BooleanJunction> booleanJunction = queryBuilder.bool(); 

    String[] fields = new String[]{"field1","field2","field2"}; 
    MultiFieldQueryParser mfqp = new MultiFieldQueryParser(fields,new StandardAnalyzer(CharArraySet.EMPTY_SET)); 
    for (String token : tokens) { 
     booleanJunction.should(mfqp.parse(token + "*")); 
    } 

在这种情况下,没有例外,当令牌是禁用词(和,一,等等),但它不搜索确切的关键字。

E.g,如果有索引“andtest”,它返回此项目,但如果有“和测试”但这并没有搜索这个项目。

可不可以给我一个建议,这里有什么错?

回答

1

当指数“和测试”中,StandardAnalyzer(这是默认设置)将令牌化这两个不同的方面:“和”和“测试”。因此,搜索“和测试*”将不匹配其中具有“和测试”的文档。

的常用方法来匹配文档中的多个方面是使用短语查询,但those don't support wildcards

如果你想解决你的具体问题,并使“和*”匹配和测试通配符,一个具有shingle filter的自定义分析器可能是要走的路。我从来没有用过它,但你可以试试看。

你或许应该考虑this resource有关分析概念的详细信息(here尤其是)。这是Solr的文档,所以一些概念无关的你(尤其是XML片断),但大部分高层次的概念(标记化,过滤,词干,...)仍然适用。最重要的是,这个页面列出了一堆分析器/标记器/过滤器,这些都可以在Hibernate Search/Lucene中使用。

对于相关的一切在Hibernate Search的配置分析,看看here

在一个侧面说明,如果您要添加通配符(“*”)自己,它可能意味着你应该使用自定义分析仪代替edgeNGramFilter。但它有点复杂,因为在索引和查询时你必须使用不同的分析器。所以通配符应该现在:)

被罚款