最新的稳定版本请使用 Spring Data Elasticsearch 5.3.1! |
最新的稳定版本请使用 Spring Data Elasticsearch 5.3.1! |
查询查找策略
Elasticsearch 模块支持所有基本的查询构建功能,如字符串查询、本机搜索查询、基于条件的查询或从方法名称派生的查询。
声明的查询
从方法名称派生查询并不总是足够的,并且/或可能导致方法名称不可读。
在这种情况下,可以使用注释(请参阅使用@Query注释)。@Query
查询创建
通常,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 查询字符串 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
不支持使用方法名称来构建采用参数的 Geo-shape 查询。
如果需要在存储库中具有此类函数,请在自定义存储库实现中使用 with。GeoJson ElasticsearchOperations CriteriaQuery |
关键词 | 样本 | Elasticsearch 查询字符串 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
不支持使用方法名称来构建采用参数的 Geo-shape 查询。
如果需要在存储库中具有此类函数,请在自定义存储库实现中使用 with。GeoJson ElasticsearchOperations CriteriaQuery |
方法返回类型
可以将存储库方法定义为具有以下返回类型,用于返回多个元素:
-
List<T>
-
Stream<T>
-
SearchHits<T>
-
List<SearchHit<T>>
-
Stream<SearchHit<T>>
-
SearchPage<T>
使用@Query注
@Query
传递给该方法的参数可以插入到查询字符串的占位符中。占位符的形式为 、 、 等,表示第一个、第二个、第三个参数等。?0
?1
?2
interface BookRepository extends ElasticsearchRepository<Book, String> {
@Query("{\"match\": {\"name\": {\"query\": \"?0\"}}}")
Page<Book> findByName(String name,Pageable pageable);
}
设置为注释参数的 String 必须是有效的 Elasticsearch JSON 查询。 它将作为查询元素的值发送到 Easticsearch;例如,如果使用参数 John 调用函数,它将生成以下查询正文:
{
"query": {
"match": {
"name": {
"query": "John"
}
}
}
}
@Query
存储库方法,例如
@Query("{\"ids\": {\"values\": ?0 }}")
List<SampleEntity> getByIds(Collection<String> ids);
将进行 ID 查询以返回所有匹配的文档。因此,使用 of 调用该方法将生成查询正文List
["id1", "id2", "id3"]
{
"query": {
"ids": {
"values": ["id1", "id2", "id3"]
}
}
}