如何使用Java在Elasticsearch中搜索Startswith和Endswith



我正在使用Spring Data Elasticsearch,我有以下查询,

findByStatusIdAndLinkStartingWith(String statusId, String link);
findByStatusIdAndLinkEndingWith(String statusId, String link);

而且效果很好。但我需要知道如何在CriteriaQueryNativeSearchQueryBuilder中实现这一点?我也看到StartingWithPrefix Query是可能的,但它会变慢。那么,spring数据弹性搜索在findByStatusIdAndLinkStartingWith中使用的底层查询是什么呢?在像CriteriaQueryNativeSearchQueryBuilder这样的单个查询中实现上述内容的正确和最佳方式是什么?

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来创建它。

最新更新