我有一个存储库方法,它在字段userAccount.userName
上执行“开始于”(前缀)查询。当我搜索没有空格的字符串时,它会返回正确的结果。但是当我搜索其中包含空格的字符串时,它会引发异常。
我的存储库方法:
public List<EsUser> findByUserAccountUserNameStartingWith(String term);
搜索字符串:汤姆克鲁斯
例外:
org.springframework.dao.InvalidDataAccessApiUsageException:不能 constructQuery'*“Tom Cruise”'。使用表达式或多个子句 代替。
答案 0 :(得分:2)
对使用通配符(例如*)的elasticsearch的查询必须是单个标记。默认情况下,标记由空格分隔。 “汤姆克鲁斯”是两个令牌。
如果需要包含多个令牌,请考虑实现自定义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);