查询方法
查询查找策略
Elasticsearch 模块支持所有基础的查询构建功能,如字符串查询、原生搜索查询、基于条件的查询,或可从方法名称中派生。
声明查询
仅凭方法名称推导查询并不总是足够,且可能导致方法名无法读取。
在这种情况下,可以使用@Query注释(参见使用@Query注释)。
另一种可能是使用搜索模板,(参见使用@SearchTemplateQuery注释)。
查询创建
通常,Elasticsearch 的查询创建机制的工作原理如《定义查询方法》中所述。 这里有一个简短的示例,说明Elasticsearch查询方法的具体含义:
interface BookRepository extends Repository<Book, String> {
List<Book> findByNameAndPrice(String name, Integer price);
}
上述方法名称将被翻译成以下 Elasticsearch json 查询
{
"query": {
"bool" : {
"must" : [
{ "query_string" : { "query" : "?", "fields" : [ "name" ] } },
{ "query_string" : { "query" : "?", "fields" : [ "price" ] } }
]
}
}
}
下面展示了支持Elasticsearch的关键词列表。
| 关键词 | 样本 | Elasticsearch 查询字符串 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
构建地理形状查询的方法名称GeoJson不支持参数。
用弹性搜索作跟标准查询如果你需要在仓库里有这样的函数,那就在自定义仓库实现中。 |
方法返回类型
存储库方法可以定义为返回多个元素时具有以下返回类型:
-
List<T> -
Stream<T> -
SearchHits<T> -
列表<搜索<T>> -
Stream<SearchHit<T>> -
搜索页面<T>
使用 @Query 注释
@Query注解。传递给方法的参数可以插入查询字符串中的占位符中。
占位符的形式为?0,?1,?2等等,针对第一、第二、第三参数等。
interface BookRepository extends ElasticsearchRepository<Book, String> {
@Query("{\"match\": {\"name\": {\"query\": \"?0\"}}}")
Page<Book> findByName(String name,Pageable pageable);
}
作为注释参数的字符串必须是有效的 Elasticsearch JSON 查询。 它将作为查询元素的值发送到 Easticsearch;例如,如果调用该函数,参数为John,则会产生以下查询主体:
{
"query": {
"match": {
"name": {
"query": "John"
}
}
}
}
@Query对取集合参数的方法的注释一种存储方法
@Query("{\"ids\": {\"values\": ?0 }}")
List<SampleEntity> getByIds(Collection<String> ids);
会发送ID查询以返回所有匹配的文档。
所以用 a 来调用方法列表之[“id1”, “id2”, “id3”]会产生查询主体
{
"query": {
"ids": {
"values": ["id1", "id2", "id3"]
}
}
}
使用 SpEL 表达式
@Query带有SpEL表达式的注释。在定义查询时也支持SpEL表达式@Query.
interface BookRepository extends ElasticsearchRepository<Book, String> {
@Query("""
{
"bool":{
"must":[
{
"term":{
"name": "#{#name}"
}
}
]
}
}
""")
Page<Book> findByName(String name, Pageable pageable);
}
例如,如果调用该函数,参数为 John,则会产生以下查询体:
{
"bool":{
"must":[
{
"term":{
"name": "John"
}
}
]
}
}
假设我们有以下类作为查询参数类型:
public record QueryParameter(String value) {
}
通过符号访问参数很容易,然后引用属性#值简单.:
interface BookRepository extends ElasticsearchRepository<Book, String> {
@Query("""
{
"bool":{
"must":[
{
"term":{
"name": "#{#parameter.value}"
}
}
]
}
}
""")
Page<Book> findByName(QueryParameter parameter, Pageable pageable);
}
我们可以过新查询参数(“John”)现在将参数 设为 ,它会生成与上面相同的查询字符串。
Bean Property 也支持访问。
假设有一颗名为queryParameter类型QueryParameter,我们可以用符号访问豆子,而非 ,无需声明类型参数@#QueryParameter在查询方法中:
interface BookRepository extends ElasticsearchRepository<Book, String> {
@Query("""
{
"bool":{
"must":[
{
"term":{
"name": "#{@queryParameter.value}"
}
}
]
}
}
""")
Page<Book> findByName(Pageable pageable);
}
收集参数。收集参数也支持,使用简便如常字符串,例如以下条款查询:
interface BookRepository extends ElasticsearchRepository<Book, String> {
@Query("""
{
"bool":{
"must":[
{
"terms":{
"name": #{#names}
}
}
]
}
}
""")
Page<Book> findByName(Collection<String> names, Pageable pageable);
}
| 声明 ElasticSearch JSON 查询时不应引用集合值。 |
一组名称喜欢List.of(“name1”, “name2”)将产生以下术语查询:
{
"bool":{
"must":[
{
"terms":{
"name": ["name1", "name2"]
}
}
]
}
}
收集参数。interface BookRepository extends ElasticsearchRepository<Book, String> {
@Query("""
{
"bool":{
"must":[
{
"terms":{
"name": #{#parameters.![value]}
}
}
]
}
}
""")
Page<Book> findByName(Collection<QueryParameter> parameters, Pageable pageable);
}
这将提取所有值作为新的物业价值收集从QueryParameter因此,集合效应与上述相同。
@Param通过 SpEL 访问参数时,修改参数名称也非常有用,通过@ParamSping Data中的注释:
interface BookRepository extends ElasticsearchRepository<Book, String> {
@Query("""
{
"bool":{
"must":[
{
"terms":{
"name": #{#another.![value]}
}
}
]
}
}
""")
Page<Book> findByName(@Param("another") Collection<QueryParameter> parameters, Pageable pageable);
}
使用 @SearchTemplateQuery 注释
使用Elasticsearch搜索模板时——(参见搜索模板支持)可以通过添加@SearchTemplateQuery对该方法进行注释。
假设存在一个名为“book-by-title”的搜索模板,且该模板需要一个名为“title”的参数,那么可以使用该搜索模板的存储方法可以定义如下:
interface BookRepository extends ElasticsearchRepository<Book, String> {
@SearchTemplateQuery(id = "book-by-title")
SearchHits<Book> findByTitle(String title);
}
存储库方法的参数以键值对的形式发送到 seacrh 模板,其中键为参数名称,调用方法时取自实际值。