我已多次搜索,但无法解决我的问题, 这是我的代码:
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 + "*"));
}
在这种情况下,没有例外,当令牌是停用词(和,等等),但它不会搜索确切的关键字。
例如,如果有索引“andtest”,则返回此项,但如果有“和测试”,则不会搜索此项目。
你可以给我一个建议,这里有什么不对吗?答案 0 :(得分:1)
当您对“并测试”进行索引时,StandardAnalyzer
(这是默认值)会将其标记为两个不同的术语:“和”和“测试”。因此,搜索“和测试*”将与文档中的“和测试”不匹配。
匹配文档中多个术语的常用方法是使用词组查询,但those don't support wildcards。
如果您想解决您的特定问题,并使“和*”与通配符匹配“并测试”,则可能需要使用shingle filter的自定义分析器。我自己从未使用它,但你可以尝试一下。
您应该查看this resource以获取有关分析概念的更多信息(特别是here)。它是Solr文档,因此一些概念与您无关(特别是XML片段),但大多数高级概念(标记化,过滤,词干......)仍然相关。最重要的是,这个页面列出了一堆分析器/标记器/过滤器,这些都可以在Hibernate Search / Lucene中使用。
有关在Hibernate Search中配置分析器的所有内容,请查看here
另外,如果您自己添加通配符(“*”),则可能意味着您应该使用带有edgeNGramFilter的自定义分析器。但它有点复杂,因为在索引和查询时你必须使用不同的分析器。所以通配符现在应该没问题了:)