前言
目标:通过分词能达到预期的数据检索结果,并能完成数据的统计分析
ES版本:7.10.2
客户端语言:DSL、Java
针对Java 使用的是spring-data-elasticsearch-4.2.x框架
基础的增删改查
索引(添加)数据
- 添加单条数据
POST hotel/_doc/001
{
"title": "喜来乐酒店",
"city": "苏州",
"price": 578.23
}
- 批量添加数据
基本查询
查询这块是最复杂的,也是难点所在
- 按照id查询数据
GET hotel/_doc/001
- term查询
全词匹配,一般用于keyword、数字类型的字段
GET hotel/_search
{
"query": {
"term": {
"city": "苏州"
}
}
}
- match查询
模糊匹配,并对结果进行打分
GET hotel/_search
{
"query": {
"match": {
"title": "来乐"
}
}
}
更新数据
ES底层是无法完成部分字段更新功能的,只能对整个文档进行更新,即使ES提供了部分字段更新的api,也是内部先把整个文档获取出来,然后再进行更新,每次更新后,对应的版本号也会自动增加.
- 根据id进行更新
POST /hotel/_update/001
{
"doc": {
"title" : "喜来乐酒店",
"city" : "南京",
"price" : 578.23
}
}
- update_by_query
更新符合指定条件的文档,类似SQL中的 update Table set xx=‘’,bb=‘’ where q1 and q2.
POST /hotel/_update_by_query
{
"query": {
"term": {
"city": {
"value": "盐城"
}
}
},
"script": {
"source": "ctx._source['city']='苏州'",
"lang": "painless"
}
}
JAVA 实现方式
String script = "ctx._source['city']=params['newCityName']";
Map<String, Object> params = Collections.singletonMap("newCityName", "苏州");
UpdateByQueryRequest request = new UpdateByQueryRequest("hotel") //
.setQuery(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("city", "盐城"))) //
.setAbortOnVersionConflict(true) //
.setRefresh(true) //
.setScript(new Script(ScriptType.INLINE, "painless", script, params)); //
elasticsearchRestTemplate.execute(client -> client.updateByQuery(request, RequestOptions.DEFAULT));
删除数据
- 根据id删除数据
DELETE /hotel/_doc/001
- delete by query
根据指定的条件删除数据
POST /hotel/_delete_by_query
{
"query": {
"term": {
"city": {
"value": "盐城"
}
}
}
}
JAVA 实现方式
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.termQuery("city", "盐城"))
.build();
elasticsearchRestTemplate.delete(searchQuery, Hotel.class);