我有一个存储库方法,对字段userAccount.userName
进行“开头为”(前缀)查询。当我搜索没有空格的字符串时,它将返回正确的结果。但是,当我搜索其中带有空格的字符串时,它将引发异常。
我的存储库方法:
public List<EsUser> findByUserAccountUserNameStartingWith(String term);
异常(exception):
最佳答案
使用通配符(例如*)的对Elasticsearch的查询必须是单个 token 。默认情况下, token 按空格分隔。 “汤姆·克鲁斯”是两个象征。
如果您需要包括多个 token ,请考虑实现自定义Spring Data ES存储库,并使用以下Elasticsearch API QueryBuilder。像这样:
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
QueryBuilder matchPhraseQuery = QueryBuilders.matchPhrasePrefixQuery("userName", "Tom Cruise");
QueryBuilder nestedQuery = QueryBuilders.nestedQuery("userAccount", matchPhraseQuery);
nativeSearchQueryBuilder.withQuery(nestedQuery);
NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder.build();
//auto wire elastic search template
FacetedPage<EsUser> results = template.queryForPage(nativeSearchQuery, EsUser.class);