我正在使用Spring Data Elasticsearch,我有以下查询,
findByStatusIdAndLinkStartingWith(String statusId, String link);
findByStatusIdAndLinkEndingWith(String statusId, String link);
而且效果很好。但我需要知道如何在CriteriaQuery
或NativeSearchQueryBuilder
中实现这一点?我也看到StartingWith
与Prefix Query
是可能的,但它会变慢。那么,spring数据弹性搜索在findByStatusIdAndLinkStartingWith
中使用的底层查询是什么呢?在像CriteriaQuery
或NativeSearchQueryBuilder
这样的单个查询中实现上述内容的正确和最佳方式是什么?
Spring Data Elasticsearch为一个存储库方法内部构建了一个CriteriaQuery
,该方法的名称中包含StartingWith:
https://github.com/spring-projects/spring-data-elasticsearch/blob/main/src/main/java/org/springframework/data/elasticsearch/repository/query/parser/ElasticsearchQueryCreator.java#L113-L116:
case STARTING_WITH:
return criteria.startsWith(parameters.next().toString());
case ENDING_WITH:
return criteria.endsWith(parameters.next().toString());
然后将该CriteriaQuery
处理为ElasticsearchQueryBuilder
(https://github.com/spring-projects/spring-data-elasticsearch/blob/main/src/main/java/org/springframework/data/elasticsearch/core/CriteriaQueryProcessor.java#L205-L210(:
case STARTS_WITH:
query = queryStringQuery(searchText + '*').field(fieldName).analyzeWildcard(true);
break;
case ENDS_WITH:
query = queryStringQuery('*' + searchText).field(fieldName).analyzeWildcard(true);
break;
然后将其提供给CCD_ 11。
因此,如果您使用CriteriaQuery
,这将以发送到Elasticsearch的相同查询结束。如果您有一个不同的性能查询,那么您需要使用NativeSearchQuery
来创建它。