Spring数据elasticsearch存储库“StartingWith”在搜索带空格的字符串时抛出InvalidDataAccessApiUsageException

时间:2016-05-11 17:31:24

标签: spring elasticsearch spring-data-elasticsearch

我有一个存储库方法,它在字段userAccount.userName上执行“开始于”(前缀)查询。当我搜索没有空格的字符串时,它会返回正确的结果。但是当我搜索其中包含空格的字符串时,它会引发异常。

我的存储库方法:

public List<EsUser> findByUserAccountUserNameStartingWith(String term);
  

搜索字符串:汤姆克鲁斯

例外:

  

org.springframework.dao.InvalidDataAccessApiUsageException:不能   constructQuery'*“Tom Cruise”'。使用表达式或多个子句   代替。

1 个答案:

答案 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);