如何使用 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);
而且效果很好。但我需要知道如何在 CriteriaQuery
或 NativeSearchQueryBuilder
中实现它?而且我还看到 StartingWith
可以用 Prefix Query
但说它会变慢。那么 spring-data-elasticsearch 在 findByStatusIdAndLinkStartingWith
中使用的底层查询是什么?在 CriteriaQuery
或 NativeSearchQueryBuilder
之类的单个查询中实现上述内容的正确和最佳方法是什么?
Spring Data Elasticsearch 在内部为名称中包含 StartingWith 的存储库方法构建 CriteriaQuery
:
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
来创建它。
我正在使用 Spring-Data-Elasticsearch,我有以下查询,
findByStatusIdAndLinkStartingWith(String statusId, String link);
findByStatusIdAndLinkEndingWith(String statusId, String link);
而且效果很好。但我需要知道如何在 CriteriaQuery
或 NativeSearchQueryBuilder
中实现它?而且我还看到 StartingWith
可以用 Prefix Query
但说它会变慢。那么 spring-data-elasticsearch 在 findByStatusIdAndLinkStartingWith
中使用的底层查询是什么?在 CriteriaQuery
或 NativeSearchQueryBuilder
之类的单个查询中实现上述内容的正确和最佳方法是什么?
Spring Data Elasticsearch 在内部为名称中包含 StartingWith 的存储库方法构建 CriteriaQuery
:
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
来创建它。