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

How to search Startswith and Endswith in Elasticsearch using Java?

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

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

而且效果很好。但我需要知道如何在 CriteriaQueryNativeSearchQueryBuilder 中实现它?而且我还看到 StartingWith 可以用 Prefix Query 但说它会变慢。那么 spring-data-elasticsearch 在 findByStatusIdAndLinkStartingWith 中使用的底层查询是什么?在 CriteriaQueryNativeSearchQueryBuilder 之类的单个查询中实现上述内容的正确和最佳方法是什么?

Spring Data Elasticsearch 在内部为名称中包含 StartingWith 的存储库方法构建 CriteriaQuery

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 处理为 Elasticsearch QueryBuilder (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;

然后将给 RestHighLevelClient

因此,如果您使用 CriteriaQuery,这将以发送到 Elasticsearch 的相同查询结束。如果您有不同的高性能查询,那么您需要使用 NativeSearchQuery 来创建它。