该版本仍在开发中,尚未被视为稳定。对于最新稳定版本,请使用Spring Data Elasticsearch 5.5.5spring-doc.cadn.net.cn

查询方法

查询查找策略

Elasticsearch 模块支持所有基础的查询构建功能,如字符串查询、原生搜索查询、基于条件的查询,或可从方法名称中派生。spring-doc.cadn.net.cn

声明查询

仅凭方法名称推导查询并不总是足够,且可能导致方法名无法读取。 在这种情况下,可以使用@Query注释(参见使用@Query注释)。spring-doc.cadn.net.cn

查询创建

通常,Elasticsearch 的查询创建机制的工作原理如《定义查询方法》中所述。 这里有一个简短的示例,说明Elasticsearch查询方法的具体含义:spring-doc.cadn.net.cn

例子1。从方法名创建查询
interface BookRepository extends Repository<Book, String> {
  List<Book> findByNameAndPrice(String name, Integer price);
}

上述方法名称将被翻译成以下 Elasticsearch json 查询spring-doc.cadn.net.cn

{
    "query": {
        "bool" : {
            "must" : [
                { "query_string" : { "query" : "?", "fields" : [ "name" ] } },
                { "query_string" : { "query" : "?", "fields" : [ "price" ] } }
            ]
        }
    }
}

下面展示了支持Elasticsearch的关键词列表。spring-doc.cadn.net.cn

表1。方法名中支持的关键词
关键词 样本 Elasticsearch 查询字符串

spring-doc.cadn.net.cn

查找名字和价格spring-doc.cadn.net.cn

{ “查询” : { “Bool” : { “必须”:[ { “query_string” : { “查询” : “?”, “fields” : [ “name” ] } }, { “query_string” : { “查询” : “?”, “fields” : [ “price” ] } } ] } }}spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

查找名字或价格spring-doc.cadn.net.cn

{ “查询” : { “Bool” : { “应该”: [ { “query_string” : { “查询” : “?”, “fields” : [ “name” ] } }, { “query_string” : { “查询” : “?”, “fields” : [ “price” ] } } ] } }}spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

findByNamespring-doc.cadn.net.cn

{ “查询” : { “Bool” : { “必须”:[ { “query_string” : { “查询” : “?”, “fields” : [ “name” ] } } ] } }}spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

找名不spring-doc.cadn.net.cn

{ “查询” : { “Bool” : { “must_not”:[ { “query_string” : { “查询” : “?”, “fields” : [ “name” ] } } ] } }}spring-doc.cadn.net.cn

之间spring-doc.cadn.net.cn

查找价格之间spring-doc.cadn.net.cn

{ “查询” : { “Bool” : { “必须”:[ {“范围” : {“价格” : {“从” : ?, “到” : ?, “include_lower” : true, “include_upper” : true } } } ] } }}spring-doc.cadn.net.cn

LessThanspring-doc.cadn.net.cn

findByPriceLessThanspring-doc.cadn.net.cn

{ “查询” : { “Bool” : { “必须”:[ {“范围” : {“价格” : {“from” : null, “to” : ?, “include_lower” : true, “include_upper” : false } ] } }}spring-doc.cadn.net.cn

不平等spring-doc.cadn.net.cn

找到PriceLessThanEqualspring-doc.cadn.net.cn

{ “查询” : { “Bool” : { “必须”:[ {“范围” : {“价格” : {“from” : null, “to” : ?, “include_lower” : true, “include_upper” : true } ] } }}spring-doc.cadn.net.cn

伟大超越spring-doc.cadn.net.cn

BuyPriceGreaterThan 的查找spring-doc.cadn.net.cn

{ “查询” : { “Bool” : { “必须”:[ {“范围” : {“价格” : {“from” : ?, “to” : null, “include_lower” : false, “include_upper” : true } ] } }}spring-doc.cadn.net.cn

比平等更伟大spring-doc.cadn.net.cn

寻找价格比平等者spring-doc.cadn.net.cn

{ “查询” : { “Bool” : { “必须”:[ {“范围” : {“价格” : {“from” : ?, “to” : null, “include_lower” : true, “include_upper” : true } ] } }}spring-doc.cadn.net.cn

以前spring-doc.cadn.net.cn

找ByPriceBeforespring-doc.cadn.net.cn

{ “查询” : { “Bool” : { “必须”:[ {“范围” : {“价格” : {“from” : null, “to” : ?, “include_lower” : true, “include_upper” : true } ] } }}spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

BuyByPriceAfterspring-doc.cadn.net.cn

{ “查询” : { “Bool” : { “必须”:[ {“范围” : {“价格” : {“from” : ?, “to” : null, “include_lower” : true, “include_upper” : true } ] } }}spring-doc.cadn.net.cn

喜欢spring-doc.cadn.net.cn

找名spring-doc.cadn.net.cn

{ “查询” : { “Bool” : { “必须”:[ { “query_string” : { “query” : “?*”, “fields” : [ “name” ] }, “analyze_wildcard”: true } ] } }}spring-doc.cadn.net.cn

开始spring-doc.cadn.net.cn

找找名字开始找spring-doc.cadn.net.cn

{ “查询” : { “Bool” : { “必须”:[ { “query_string” : { “query” : “?*”, “fields” : [ “name” ] }, “analyze_wildcard”: true } ] } }}spring-doc.cadn.net.cn

结尾spring-doc.cadn.net.cn

找到名字结尾spring-doc.cadn.net.cn

{ “查询” : { “Bool” : { “必须”:[ { “query_string” : { “query” : “*?”, “fields” : [ “name” ] }, “analyze_wildcard”: true } ] } }}spring-doc.cadn.net.cn

包含/封存spring-doc.cadn.net.cn

findByNameContainingspring-doc.cadn.net.cn

{ “查询” : { “Bool” : { “必须”:[ { “query_string” : { “query” : “*?*”, “fields” : [ “name” ] }, “analyze_wildcard”: true } ] } }}spring-doc.cadn.net.cn

(当标注为FieldType.Keyword时)spring-doc.cadn.net.cn

findByNameIn(Collection<String>names)spring-doc.cadn.net.cn

{ “查询” : { “Bool” : { “必须”:[ {“bool” : {“must” : [ {“terms” : {“name” : [“?”,“?”]}} ] } } ] } }}spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

findByNameIn(Collection<String>names)spring-doc.cadn.net.cn

{ “query”: {“bool”: {“must”: [{“query_string”:{“query”: “\”?\“ \”?\“, ”fields“: [”name“]}}spring-doc.cadn.net.cn

非罪(当标注为FieldType.Keyword时)spring-doc.cadn.net.cn

findByNameNotIn(Collection<String>names)spring-doc.cadn.net.cn

{ “查询” : {“布尔” : {“必须” : [{“布尔” : {“must_not” : [{“术语” : {“名称” : [“?”,“?”]}} ] } } ] } }}spring-doc.cadn.net.cn

非罪spring-doc.cadn.net.cn

findByNameNotIn(Collection<String>names)spring-doc.cadn.net.cn

{“query”: {“bool”: {“must”: [{“query_string”: {“query”: “NOT(\”?\“ \”?\“)”, “fields”: [“name”]}}}}}spring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

找到可获得真实spring-doc.cadn.net.cn

{ “查询” : {“bool” : {“必须” : [{ “query_string” : { “查询” : “true”, “fields” : [ “可用” ] } } ] } }}spring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

查找可利用错误spring-doc.cadn.net.cn

{ “查询” : {“bool” : {“must” : [{ “query_string” : { “query” : “false”, “fields” : [ “可用” ] } } ] } }}spring-doc.cadn.net.cn

OrderByspring-doc.cadn.net.cn

findByAvailableTrueOrderByNameDescspring-doc.cadn.net.cn

{ “查询” : {“bool” : {“must” : [{ “query_string” : { “query” : “true”, “fields” : [ “可用” ] } } ] } }, “sort”:[{“name”:{“order”:“desc”}}] }spring-doc.cadn.net.cn

存在spring-doc.cadn.net.cn

findByNameExistsspring-doc.cadn.net.cn

{“query”:{“bool”:{“must”:[{“exists”:{“field”:name“}}}}}spring-doc.cadn.net.cn

IsNullspring-doc.cadn.net.cn

查找由NameIsNullspring-doc.cadn.net.cn

{“query”:{“bool”:{“must_not”:[{“exists”:{“field”:“name”}spring-doc.cadn.net.cn

IsNotNullspring-doc.cadn.net.cn

查找ByNameIsNotNullspring-doc.cadn.net.cn

{“query”:{“bool”:{“must”:[{“exists”:{“field”:name“}}}}}spring-doc.cadn.net.cn

是空的spring-doc.cadn.net.cn

findByNameIsEmptyspring-doc.cadn.net.cn

{“query”:{“bool”:{“must”:[{“bool”:{“must”:[{“exists”:{“field”:name“}}],”must_not“:[{”wildcard“:{”name“:{”wildcard“:”*“}}spring-doc.cadn.net.cn

IsNotEmptyspring-doc.cadn.net.cn

findByNameIsNotEmptyspring-doc.cadn.net.cn

{“query”:{“bool”:{“must”:[{“wildcard”:{“name”:{“wildcard”:“*”}}spring-doc.cadn.net.cn

构建地理形状查询的方法名称GeoJson不支持参数。 用弹性搜索作标准查询如果你需要在仓库里有这样的函数,那就在自定义仓库实现中。

方法返回类型

存储库方法可以定义为返回多个元素时具有以下返回类型:spring-doc.cadn.net.cn

使用@Query注释

示例2。在方法上声明查询,使用@Query注解。

传递给方法的参数可以插入查询字符串中的占位符中。占位符的形式为?0,?1,?2等等,针对第一、第二、第三参数等。spring-doc.cadn.net.cn

interface BookRepository extends ElasticsearchRepository<Book, String> {
    @Query("{\"match\": {\"name\": {\"query\": \"?0\"}}}")
    Page<Book> findByName(String name,Pageable pageable);
}

作为注释参数的字符串必须是有效的 Elasticsearch JSON 查询。它将作为查询元素的值发送到 Easticsearch;例如,如果函数被调用为 John 参数,则会产生以下查询主体:spring-doc.cadn.net.cn

{
  "query": {
    "match": {
      "name": {
        "query": "John"
      }
    }
  }
}
例子3。@Query对取集合参数的方法的注释

一种存储方法spring-doc.cadn.net.cn

@Query("{\"ids\": {\"values\": ?0 }}")
List<SampleEntity> getByIds(Collection<String> ids);

会通过 ID 查询返回所有匹配的文档。因此,调用 方法列表[“id1”, “id2”, “id3”]会产生查询主体spring-doc.cadn.net.cn

{
  "query": {
    "ids": {
      "values": ["id1", "id2", "id3"]
    }
  }
}

使用 SpEL 表达式

示例4。在方法上声明查询,使用以下条件@Query带有SpEL表达式的注释。

在定义查询时也支持SpEL表达@Query.spring-doc.cadn.net.cn

interface BookRepository extends ElasticsearchRepository<Book, String> {
    @Query("""
        {
          "bool":{
            "must":[
              {
                "term":{
                  "name": "#{#name}"
                }
              }
            ]
          }
        }
        """)
    Page<Book> findByName(String name, Pageable pageable);
}

例如,如果调用该函数,参数为 John,则会产生以下查询体:spring-doc.cadn.net.cn

{
  "bool":{
    "must":[
      {
        "term":{
          "name": "John"
        }
      }
    ]
  }
}
示例5。访问参数属性。

假设我们有以下类作为查询参数类型:spring-doc.cadn.net.cn

public record QueryParameter(String value) {
}

通过符号访问参数很容易,然后引用属性#简单.:spring-doc.cadn.net.cn

interface BookRepository extends ElasticsearchRepository<Book, String> {
    @Query("""
            {
              "bool":{
                "must":[
                  {
                    "term":{
                      "name": "#{#parameter.value}"
                    }
                  }
                ]
              }
            }
            """)
    Page<Book> findByName(QueryParameter parameter, Pageable pageable);
}

我们可以过新查询参数(“John”)现在将参数 设为 ,它会生成与上面相同的查询字符串。spring-doc.cadn.net.cn

示例6。访问Bean财产。

也支持使用豆属性访问。假设存在一个名为queryParameter类型QueryParameter,我们可以用符号访问豆子,而非 ,无需声明类型参数@#QueryParameter在查询方法中:spring-doc.cadn.net.cn

interface BookRepository extends ElasticsearchRepository<Book, String> {
    @Query("""
            {
              "bool":{
                "must":[
                  {
                    "term":{
                      "name": "#{@queryParameter.value}"
                    }
                  }
                ]
              }
            }
            """)
    Page<Book> findByName(Pageable pageable);
}
示例7。SpEL 和收集参数。

收集参数也支持,使用简便如常字符串,例如以下条款查询:spring-doc.cadn.net.cn

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”)将产生以下术语查询:spring-doc.cadn.net.cn

{
  "bool":{
    "must":[
      {
        "terms":{
          "name": ["name1", "name2"]
        }
      }
    ]
  }
}
示例8。访问属性收集参数。

收集参数不是普通的字符串:spring-doc.cadn.net.cn

interface BookRepository extends ElasticsearchRepository<Book, String> {
    @Query("""
            {
              "bool":{
                "must":[
                  {
                    "terms":{
                      "name": #{#parameters.![value]}
                    }
                  }
                ]
              }
            }
            """)
    Page<Book> findByName(Collection<QueryParameter> parameters, Pageable pageable);
}

这将提取所有作为新的物业价值收集QueryParameter因此,集合效应与上述相同。spring-doc.cadn.net.cn

示例9。通过使用@Param

通过 SpEL 访问参数时,修改参数名称也非常有用,通过@ParamSping Data中的注释:spring-doc.cadn.net.cn

interface BookRepository extends ElasticsearchRepository<Book, String> {
    @Query("""
            {
              "bool":{
                "must":[
                  {
                    "terms":{
                      "name": #{#another.![value]}
                    }
                  }
                ]
              }
            }
            """)
    Page<Book> findByName(@Param("another") Collection<QueryParameter> parameters, Pageable pageable);
}