|
对于最新稳定版本,请使用Spring Data Elasticsearch 5.5.5! |
弹性搜索运算
Spring Data Elasticsearch 使用多个接口来定义可以针对 Elasticsearch 索引调用的作(关于响应式接口的描述,请参见响应式 Elasticsearch作)。
这些接口对应于 Elasticsearch API 的结构化。
默认的接口实现包括:
-
索引管理功能。
-
域类型的读写映射支持。
-
一个丰富的查询和标准API。
-
资源管理与例外翻译。
|
索引管理及索引及映射的自动创建。
这 这些作都不是由 的实现自动完成的 使用Spring Data Elasticsearch仓库时,支持自动创建索引并编写映射,参见“自动创建索引与对应映射” |
使用示例
示例展示了如何使用注入弹性搜索作Spring REST 控制器中的实例。示例假设人是一个注释为@Document,@Id等等(参见映射注释概述)。
@RestController
@RequestMapping("/")
public class TestController {
private ElasticsearchOperations elasticsearchOperations;
public TestController(ElasticsearchOperations elasticsearchOperations) { (1)
this.elasticsearchOperations = elasticsearchOperations;
}
@PostMapping("/person")
public String save(@RequestBody Person person) { (2)
Person savedEntity = elasticsearchOperations.save(person);
return savedEntity.getId();
}
@GetMapping("/person/{id}")
public Person findById(@PathVariable("id") Long id) { (3)
Person person = elasticsearchOperations.get(id.toString(), Person.class);
return person;
}
}
| 1 | 让Spring注入提供的弹性搜索作《Bean》在Constructor。 |
| 2 | 在Elasticsearch集群中存储某个实体。id是从返回的实体读取的,因为它可能在人对象,由Elasticsearch创建。 |
| 3 | 用 get by id 检索该实体。 |
以全面展现弹性搜索作请参阅API文档。
搜索结果类型
当文档被检索到以下方法时,文档作界面时,只返回找到的实体。当使用该方法搜索时搜索作界面上,每个实体都可以获得额外信息,例如所找到实体的分数或排序值。
为了返回这些信息,每个实体都被包裹在搜索击中包含该实体特定附加信息的对象。
这些搜索击中对象本身在搜索精选该对象还包含整个搜索的信息,如maxScore或请求的聚合,或完成请求所需的执行时间。
以下类别和接口现已可用:
包含以下信息:
-
身份
-
得分
-
排序值
-
高亮场
-
内层击中(这是嵌入式的
搜索精选包含最终返回的内部击中对象) -
检索的类型为<T的实体>
包含以下信息:
-
总击球数
-
总命中数关系
-
最高分
-
一份列表
SearchHit<T>对象 -
返回的聚合
-
返回建议结果
定义Spring数据页包含一个SearchHits<T>元素和可以通过仓库方法进行分页访问。
由低级滚动API函数返回弹性搜索Rest模板,它丰富了SearchHits<T>带有Elasticsearch卷轴ID。
通过流函数返回的迭代器搜索作接口。
响应式搜索作有返回 a 的方法单<反应搜索命中<>>,这包含与SearchHits<T>但会提供包含的SearchHit<T>对象作为Flux<SearchHit<T>>而且不是作为一个列表。
查询
几乎所有定义在搜索作和响应式搜索作接口取一个查询定义查询以执行搜索的参数。查询是一个接口,Spring Data Elasticsearch 提供三种实现:标准查询,字符串查询和原生查询.
标准查询
标准查询基于查询的查询允许在不了解 Elasticsearch 查询的语法或基础知识的情况下创建搜索数据的查询。
它们允许用户通过简单地串联和组合来构建查询标准指定搜索文档必须满足条件的对象。
| 在讨论 AND 或 OR 时,结合条件时请记住,在 Elasticsearch 中,AND 被转换为必须条件,OR 被转换为应当条件 |
标准它们的用法最好用例子来解释(假设我们有书具有价格财产):
Criteria criteria = new Criteria("price").is(42.0);
Query query = new CriteriaQuery(criteria);
同一字段的条件可以串联,它们会与逻辑 AND 结合:
Criteria criteria = new Criteria("price").greaterThan(42.0).lessThan(34.0);
Query query = new CriteriaQuery(criteria);
链式连接标准,默认使用与逻辑:
Criteria criteria = new Criteria("lastname").is("Miller") (1)
.and("firstname").is("James") (2)
Query query = new CriteriaQuery(criteria);
| 1 | 第一标准 |
| 2 | AND() 创建新的标准并将其锁链绑在第一个上。 |
如果你想创建嵌套查询,你需要使用子查询来实现这一点。 假设我们想找到所有姓米勒、名字为Jack或John的人:
Criteria miller = new Criteria("lastName").is("Miller") (1)
.subCriteria( (2)
new Criteria().or("firstName").is("John") (3)
.or("firstName").is("Jack") (4)
);
Query query = new CriteriaQuery(criteria);
| 1 | 创造一个第一标准关于姓氏 |
| 2 | 该条件与 AND 结合为子准则 |
| 3 | 本子版块“标准”是名字John的手术室组合 |
| 4 | 以及名字杰克 |
请参阅标准类别中对不同可用作的完整概述。
字符串查询
该类将 Elasticsearch 查询当作 JSON 字符串。 以下代码显示了一个查询,搜索名字为“Jack”的人:
Query query = new StringQuery("{ \"match\": { \"firstname\": { \"query\": \"Jack\" } } } ");
SearchHits<Person> searchHits = operations.search(query, Person.class);
用字符串查询如果你已经有 Elasticsearch 查询,可能更合适。
原生查询
原生查询当你遇到复杂查询,或无法用标准比如在构建查询和使用聚合时,API。
它允许使用所有不同的方法co.elastic.clients.elasticsearch._types.query_dsl.查询因此,Elasticsearch库中的实现被称为“native”。
以下代码展示了如何搜索具有特定条件的人名称对于发现的文档,具有一个术语汇总,用于统计姓氏对于这些人:
Query query = NativeQuery.builder()
.withAggregation("lastNames", Aggregation.of(a -> a
.terms(ta -> ta.field("lastName").size(10))))
.withQuery(q -> q
.match(m -> m
.field("firstName")
.query(firstName)
)
)
.withPageable(pageable)
.build();
SearchHits<Person> searchHits = operations.search(query, Person.class);
SearchTemplateQuery
这是查询接口可与存储的搜索模板结合使用。
更多信息请参见搜索模板支持。