ElasticSearch入门篇

文章目录

  • 控制台RESTFULL操作
    • REST风格说明
      • 基于REST命令说明:
    • es支持的数据类型
      • 核心数据类型
    • ik分词器使用
      • ik_smart最少切分
      • ik_max_word最细粒度
    • 索引操作
      • 索引库创建
      • 创建文档方式
        • 指定索引类型(以后这种方式会被弃用)
        • 不指定索引类型利用默认的_doc类型
      • 更新文档
        • 方式一:
        • 方式二:推荐使用这种方式修改更加高效
      • 删除操作
    • 查询操作
      • 按照id查询
      • 搜索
        • 简单查询
        • 匹配
        • 结果过滤:
        • 排序
        • 分页查询
        • 匹配多个条件
        • 精确查询
      • 高亮查询
      • 默认高亮标签
        • 自定义高亮标签
      • 布尔查询
        • match
        • should
        • must_not
        • filter
  • java API使用
    • 官方文档
    • RestClient和TransportClient区别?
    • Java Low Level REST Client 和 Java High Level REST Client区别?
    • API使用
      • 获取连接
      • 创建索引库
      • 删除索引库/判断索引库是否存在
      • 添加文档
      • 更新文档
      • 获取新闻文档
      • 批量插入文档
      • 搜索
    • springBoot整合elasticSearch 7
      • 新建项目
      • 导入依赖
      • 创建类
        • 配置类
        • 实体类
        • 测试类

控制台RESTFULL操作

使用工具Cerebro v0.8.3

REST风格说明

一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简介,更有层次,更易于实现缓存等机制

基于REST命令说明:

methodurl地址描述
PUTlocalhost:9200/索引名称/类型名称/文档id创建文档(指定文档id)
POSTlocalhost:9200/索引名称/类型名称创建文档(随机文档id)
POSTlocalhost:9200/索引名称/类型名称/文档id/_update更新文档
DELETElocalhost:9200/索引名称/类型名称/文档id删除文档
GETlocalhost:9200/索引名称/类型名称/文档id通过docId查询文档
POSTlocalhost:9200/索引名称/类型名称/_search查询所有数据

es支持的数据类型

核心数据类型

(1)字符串类型: text, keyword

(2)数字类型:long, integer, short, byte, double, float, half_float, scaled_float

(3)日期:date

(4)日期 纳秒:date_nanos

(5)布尔型:boolean

(6)Binary:binary

(7)Range: integer_range, float_range, long_range, double_range, date_range

其他类型!

ik分词器使用

ik_smart最少切分

请求服务名:_analyze
请求方式:GET
请求体:

{"analyzer":"ik_smart","text":" 和尚和未结婚的和尚结婚了"
}

返回:

{"tokens": [{"token": "和尚","start_offset": 1,"end_offset": 3,"type": "CN_WORD","position": 0},{"token": "和","start_offset": 3,"end_offset": 4,"type": "CN_CHAR","position": 1},{"token": "未","start_offset": 4,"end_offset": 5,"type": "CN_CHAR","position": 2},{"token": "结婚","start_offset": 5,"end_offset": 7,"type": "CN_WORD","position": 3},{"token": "的","start_offset": 7,"end_offset": 8,"type": "CN_CHAR","position": 4},{"token": "和尚","start_offset": 8,"end_offset": 10,"type": "CN_WORD","position": 5},{"token": "结婚","start_offset": 10,"end_offset": 12,"type": "CN_WORD","position": 6},{"token": "了","start_offset": 12,"end_offset": 13,"type": "CN_CHAR","position": 7}]
}

操作截图
在这里插入图片描述

ik_max_word最细粒度

请求服务名:_analyze
请求方式:GET
请求体:

{"analyzer":"ik_max_word","text":" 和尚和未结婚的和尚结婚了"
}

返回:

{"tokens": [{"token": "和尚","start_offset": 1,"end_offset": 3,"type": "CN_WORD","position": 0},{"token": "和","start_offset": 3,"end_offset": 4,"type": "CN_CHAR","position": 1},{"token": "未结","start_offset": 4,"end_offset": 6,"type": "CN_WORD","position": 2},{"token": "结婚","start_offset": 5,"end_offset": 7,"type": "CN_WORD","position": 3},{"token": "的","start_offset": 7,"end_offset": 8,"type": "CN_CHAR","position": 4},{"token": "和尚","start_offset": 8,"end_offset": 10,"type": "CN_WORD","position": 5},{"token": "结婚","start_offset": 10,"end_offset": 12,"type": "CN_WORD","position": 6},{"token": "了","start_offset": 12,"end_offset": 13,"type": "CN_CHAR","position": 7}]
}

操作截图:

在这里插入图片描述

索引操作

索引库创建

mappings好比mysql数据库中创建表结构,es通过mappings来创建索引规则

PUT 索引库名称

例如:PUT test2

{"mappings":{"properties":{"name":{"type":"text"},"age":{"type":"long"},"birthday":{"type":"date"}}}}

返回:

{"acknowledged": true,"shards_acknowledged": true,"index": "test2"
}

在这里插入图片描述

查看索引库是否创建成功:GET test2

{"test2": {"aliases": {},"mappings": {"properties": {"age": {"type": "long"},"birthday": {"type": "date"},"name": {"type": "text"}}},"settings": {"index": {"creation_date": "1605249683965","number_of_shards": "1","number_of_replicas": "1","uuid": "TuEFwhYdRHC01ZRvkcZiGQ","version": {"created": "7070099"},"provided_name": "test2"}}}
}

创建文档方式

如果索引库没有配置mapping,es会给我们默认配置字段类型

methodurl地址描述
PUTlocalhost:9200/索引名称/类型名称/文档id创建文档(指定文档id)

指定索引类型(以后这种方式会被弃用)

在这里插入图片描述

不指定索引类型利用默认的_doc类型

PUT test3/_doc/1

{"name":"魏杰","age":25,"birth":"1995-10-01"
}  

返回:

{"_index": "test3","_type": "_doc","_id": "1","_version": 1,"result": "created","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 0,"_primary_term": 1
}

在这里插入图片描述
查看索引库会自动配置默认字段类型
请求:GET test2
返回:

{"test2": {"aliases": {},"mappings": {"properties": {"age": {"type": "long"},"birth": {"type": "date"},"birthday": {"type": "date"},"name": {"type": "text"}}},"settings": {"index": {"creation_date": "1605249683965","number_of_shards": "1","number_of_replicas": "1","uuid": "TuEFwhYdRHC01ZRvkcZiGQ","version": {"created": "7070099"},"provided_name": "test2"}}}
}

在这里插入图片描述

更新文档

修改 提交还是使用PUT即可!然后覆盖!最新办法使用update!

方式一:

PUT test3/_doc/1
{"name":"魏杰2","age":21,"birth":"1995-11-01"}

返回:

{"_index": "test3","_type": "_doc","_id": "1","_version": 2,"result": "updated","_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 1,"_primary_term": 1
}

_version可以看出版本号发生了更新,result是updated表示发生了更新
这种更新方式的缺点是每次都需要传所有数据,而不能指定某个域去更新数据

方式二:推荐使用这种方式修改更加高效

POST test3/_doc/1/_update
{"doc":{"name":"盲僧"}
}

删除操作

通过DELETE命令实现删除,根据你的请求来判断是删除索引还是删除文档记录!
使用RESTFUL风格是es推荐大家使用的

查询操作

按照id查询

GET user/_doc/1

搜索

简单查询

GET user/_doc/_search?q=name:c

匹配

GET user/_doc/_search
{"query":{"match":{"name":"c"}}
}

在这里插入图片描述

结果过滤:

_source:字段用来过滤搜索出的结果

GET user/_doc/_search
{"query":{"match":{"name":"c"}},"_source":["name","age"]
}

排序

利用sort构建排序,asc:升序、desc:降序 可以结合mysql来记忆

GET user/_doc/_search
{"query":{"match":{"name":"c"}},"sort":[{"age":{"order":"desc"}}]
}

分页查询

添加from、size参数即可

GET user/_doc/_search
{"query":{"match":{"name":"c"}},"sort":[{"age":{"order":"desc"}}],"from":0,"size":1
}

匹配多个条件

利用空格隔开

user/_doc/_search
{"query":{"match":{"name":"c java"}}
}

在这里插入图片描述

精确查询

term查询是直接通过倒排索引指定的词条进行精确查找的
关于分词:

  • term:直接从倒排中精准查询
  • match:会使用分词器解析,先分析文档,然后再查询

两个类型 text 和 keyword

  • keyword类型不会被分词器分词,keyword类型只能被精准查询
  • text类型会被分词器分词
    在这里插入图片描述

利用term + bool可以精确查询多个值

高亮查询

默认高亮标签

highlight->fields->name:表示对name字段值输出高亮显示

{"query":{"bool":{"should":[{"match":{"name":"杰"}}]}},"highlight":{"fields":{"name":{}}}
}

在这里插入图片描述

自定义高亮标签

{"query":{"bool":{"should":[{"match":{"name":"杰"}}]}},"highlight":{"pre_tags":"<p class='key' style='color:red'>","post_tags":"</p>","fields":{"name":{}}}
}

在这里插入图片描述

布尔查询

加上bool参数

match

对应mysql中的and,两个条件必须都满足

GET user/_doc/_search
{"query":{"bool":{"must":[{"match":{"name":"c"}},{"match":{"age":25}}]}}
}

should

对应mysql中的or,两个满足一个即可

GET user/_doc/_search
{"query":{"bool":{"should":[{"match":{"name":"c"}},{"match":{"age":28}}]}}
}

must_not

对应mysql中的not

GET user/_doc/_search
{"query":{"bool":{"must_not":[{"match":{"name":"c"}}]}}
}

filter

利用filter对数据过滤,区间查询

GET user/_doc/_search
{"query":{"bool":{"must":[{"match":{"name":"c"}}],"filter":{"range":{"age":{"lt":25}}}}}
}
  • gt:大于
  • gte:大于等于
  • lt:小于
  • lte:小于等于!

java API使用

官方文档

RestClient和TransportClient区别?

TransportClient基于TCP协议、Rest Client 基于Http协议;
详细说明:https://blog.csdn.net/huoqilinheiqiji/article/details/89713412

Java Low Level REST Client 和 Java High Level REST Client区别?

低级别客户端:允许通过http请求与es集群进行通信,API本身不负责数据的编码解码,由用于去编码解码,它与所有的es版本兼容。

高级别客户端:es官方高级客户端,基于低级客户端,它定义的API,已经对请求与响应数据包进行编解码

API使用

获取连接

    @Beanpublic RestHighLevelClient restHighLevelClient(){RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1", 9200, "http")));return client;}

创建索引库

	/*** 创建索引库 PUT test_index*/@Testvoid createIndex() throws IOException {//1.创建索引请求CreateIndexRequest request = new CreateIndexRequest(INDEX_NAME);//2.执行创建请求,获取响应 indices:index复数CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);System.out.println(createIndexResponse);}

删除索引库/判断索引库是否存在

	/*** 获取索引库 GET test_index*/@Testvoid testExistIndex() throws IOException {GetIndexRequest request = new GetIndexRequest(INDEX_NAME);
//		new DeleteIndexRequest() 删除索引库boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);Assertions.assertEquals(true, exists);}

添加文档

	/*** 添加文档* PUT test_index/_doc/1* {*     "name":"小明",*     "age":"25";* }*/@Testvoid createDocument() throws IOException {//创建对象User user = new User("小明", 25);//创建请求IndexRequest indexRequest = new IndexRequest(INDEX_NAME);// PUT indexName/_doc/1indexRequest.id("1").timeout(TimeValue.timeValueSeconds(1));//将我们的数据放入请求 jsonindexRequest.source(JSON.toJSONString(user), XContentType.JSON);//客户端发送请求IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);//对应我们命令返回的状态:created/updatedSystem.out.println(indexResponse.status());System.out.println(indexRequest.toString());}

更新文档

	/*** 更新文档方式一:* PUT test_index/_doc/1* {*     "name":"小红",*     "age":"25"* }* 更新文档方式二:* PUT test_index/_doc/1/_update* {*     "doc"{*         "name":"小红"*     }* }*/@Testvoid updateDocument() throws IOException {UpdateRequest updateRequest = new UpdateRequest(INDEX_NAME, "1");//方式一
//		HashMap<String, Object> updateFieldsMap = new HashMap<>();
//		updateFieldsMap.put("name", "小红");
//		updateRequest.doc(updateFieldsMap);//方式二User user = new User("疾风剑豪",25);updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);client.update(updateRequest, RequestOptions.DEFAULT);queryDocument();}

获取新闻文档

	/*** 获取文档* GET test_index/_doc/1*/@Testvoid queryDocument() throws IOException{GetRequest request = new GetRequest(INDEX_NAME);request.id("1");//不返回 _source结果,效率更高
//		request.fetchSourceContext(new FetchSourceContext(false));//设置某个字段单独放在GetResponse对象中
//		request.storedFields("_none_");//判断文档是否存在
//		boolean exists = client.exists(request, RequestOptions.DEFAULT);GetResponse response = client.get(request, RequestOptions.DEFAULT);String cnt = response.getSourceAsString();System.out.println(cnt);//返回全部内容和命令一样/*** {*   "_index": "test_index",*   "_type": "_doc",*   "_id": "1",*   "_version": 1,*   "_seq_no": 0,*   "_primary_term": 1,*   "found": true,*   "_source": {*     "age": 25,*     "name": "小明"*   }* }*/System.out.println(response);}

批量插入文档

	/*** 批量插入数据*/@Testvoid bulkRequest() throws IOException {BulkRequest bulkRequest = new BulkRequest();bulkRequest.timeout("10s");for (int i = 2; i < 10; i++){User user = new User("name-" + i, i);IndexRequest indexRequest = new IndexRequest(INDEX_NAME);//不用id会生成一个随机的idindexRequest.id(i + "").source(JSON.toJSONString(user), XContentType.JSON);bulkRequest.add(indexRequest);}client.bulk(bulkRequest, RequestOptions.DEFAULT);}

搜索

	/*** 查询* GET test_index/_doc/_search?* {*     "query":{*         "match":"name:剑豪"*     }* }*/@Testvoid search() throws IOException {SearchRequest searchRequest = new SearchRequest(INDEX_NAME);//构建搜索条件,我们可以使用QueryBuilders工具来实现SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();/**"highlight":{"pre_tags":"<p class='key' style='color:red'>","post_tags":"</p>","fields":{"name":{}}}*/HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.field("name");//关闭多个高亮显示,只高亮首次匹配即可highlightBuilder.requireFieldMatch(false);highlightBuilder.preTags("<span style='color:red'>");highlightBuilder.postTags("</span>");sourceBuilder.highlighter(highlightBuilder);
//		QueryBuilder queryBuilder = new QueryBuilder();MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "name");sourceBuilder.query(queryBuilder);//设置查询超时时间sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
//		sourceBuilder.from(0);
//		sourceBuilder.size(20);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);SearchHit[] hits = searchResponse.getHits().getHits();for (SearchHit hit : hits){//解析高亮的字段Map<String, HighlightField> highlightFields = hit.getHighlightFields();HighlightField name = highlightFields.get("name");Map<String, Object> sourceAsMap = hit.getSourceAsMap();//如果当前高亮字段不为null,将原来的字段换成我们高亮的字段即可if (name != null){//获取高亮的片段Text[] fragments = name.fragments();//替换StringBuilder stringBuilder = new StringBuilder();for (Text text : fragments){stringBuilder.append(text);}sourceAsMap.put("name", stringBuilder.toString());}System.out.println(sourceAsMap.toString());}}

springBoot整合elasticSearch 7

新建项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

导入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.0</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>csdn.dreamzuora</groupId><artifactId>es-api</artifactId><version>0.0.1-SNAPSHOT</version><name>es-api</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><!--自定义es版本依赖,保证和自己版本一致--><elasticsearch.version>7.6.1</elasticsearch.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.75</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

注意:如果当前springBoot版本默认导入的spring-boot-starter-data-elasticsearch使用的是老版本需要<elasticsearch.version>7.6.1</elasticsearch.version>中去指定版本

创建类

配置类

package csdn.dreamzuora.config;import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Title: es客户端配置信息* Description:** @version 1.0* @author: weijie* @date: 2020/11/19 18:15*/
@Configuration
public class EsConfig {@Beanpublic RestHighLevelClient restHighLevelClient(){RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1", 9200, "http")));return client;}}

实体类

package csdn.dreamzuora.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** Title:* Description:** @version 1.0* @author: weijie* @date: 2020/11/19 18:40*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private String name;private int age;
}

测试类

package csdn.dreamzuora;import com.alibaba.fastjson.JSON;
import csdn.dreamzuora.pojo.User;
import org.apache.lucene.util.QueryBuilder;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;@SpringBootTest
class EsApiApplicationTests {@Autowired@Qualifier("restHighLevelClient")private RestHighLevelClient client;private String INDEX_NAME = "test_index";/*** 创建索引库 PUT test_index*/@Testvoid createIndex() throws IOException {//1.创建索引请求CreateIndexRequest request = new CreateIndexRequest(INDEX_NAME);//2.执行创建请求,获取响应 indices:index复数CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);System.out.println(createIndexResponse);}/*** 获取索引库 GET test_index*/@Testvoid testExistIndex() throws IOException {GetIndexRequest request = new GetIndexRequest(INDEX_NAME);
//		new DeleteIndexRequest() 删除索引库boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);Assertions.assertEquals(true, exists);}/*** 添加文档* PUT test_index/_doc/1* {*     "name":"小明",*     "age":"25";* }*/@Testvoid createDocument() throws IOException {//创建对象User user = new User("小明", 25);//创建请求IndexRequest indexRequest = new IndexRequest(INDEX_NAME);// PUT indexName/_doc/1indexRequest.id("1").timeout(TimeValue.timeValueSeconds(1));//将我们的数据放入请求 jsonindexRequest.source(JSON.toJSONString(user), XContentType.JSON);//客户端发送请求IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);//对应我们命令返回的状态:created/updatedSystem.out.println(indexResponse.status());System.out.println(indexRequest.toString());}/*** 更新文档方式一:* PUT test_index/_doc/1* {*     "name":"小红",*     "age":"25"* }* 更新文档方式二:* PUT test_index/_doc/1/_update* {*     "doc"{*         "name":"小红"*     }* }*/@Testvoid updateDocument() throws IOException {UpdateRequest updateRequest = new UpdateRequest(INDEX_NAME, "1");//方式一
//		HashMap<String, Object> updateFieldsMap = new HashMap<>();
//		updateFieldsMap.put("name", "小红");
//		updateRequest.doc(updateFieldsMap);//方式二User user = new User("疾风剑豪",25);updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);client.update(updateRequest, RequestOptions.DEFAULT);queryDocument();}/*** 获取文档* GET test_index/_doc/1*/@Testvoid queryDocument() throws IOException{GetRequest request = new GetRequest(INDEX_NAME);request.id("1");//不返回 _source结果,效率更高
//		request.fetchSourceContext(new FetchSourceContext(false));//设置某个字段单独放在GetResponse对象中
//		request.storedFields("_none_");//判断文档是否存在
//		boolean exists = client.exists(request, RequestOptions.DEFAULT);GetResponse response = client.get(request, RequestOptions.DEFAULT);String cnt = response.getSourceAsString();System.out.println(cnt);//返回全部内容和命令一样/*** {*   "_index": "test_index",*   "_type": "_doc",*   "_id": "1",*   "_version": 1,*   "_seq_no": 0,*   "_primary_term": 1,*   "found": true,*   "_source": {*     "age": 25,*     "name": "小明"*   }* }*/System.out.println(response);}/*** 批量插入数据*/@Testvoid bulkRequest() throws IOException {BulkRequest bulkRequest = new BulkRequest();bulkRequest.timeout("10s");for (int i = 2; i < 10; i++){User user = new User("name-" + i, i);IndexRequest indexRequest = new IndexRequest(INDEX_NAME);//不用id会生成一个随机的idindexRequest.id(i + "").source(JSON.toJSONString(user), XContentType.JSON);bulkRequest.add(indexRequest);}client.bulk(bulkRequest, RequestOptions.DEFAULT);}/*** 查询* GET test_index/_doc/_search?* {*     "query":{*         "match":"name:剑豪"*     }* }*/@Testvoid search() throws IOException {SearchRequest searchRequest = new SearchRequest(INDEX_NAME);//构建搜索条件,我们可以使用QueryBuilders工具来实现SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();/**"highlight":{"pre_tags":"<p class='key' style='color:red'>","post_tags":"</p>","fields":{"name":{}}}*/HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.field("name");//关闭多个高亮显示,只高亮首次匹配即可highlightBuilder.requireFieldMatch(false);highlightBuilder.preTags("<span style='color:red'>");highlightBuilder.postTags("</span>");sourceBuilder.highlighter(highlightBuilder);
//		QueryBuilder queryBuilder = new QueryBuilder();MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "name");sourceBuilder.query(queryBuilder);//设置查询超时时间sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
//		sourceBuilder.from(0);
//		sourceBuilder.size(20);searchRequest.source(sourceBuilder);SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);SearchHit[] hits = searchResponse.getHits().getHits();for (SearchHit hit : hits){//解析高亮的字段Map<String, HighlightField> highlightFields = hit.getHighlightFields();HighlightField name = highlightFields.get("name");Map<String, Object> sourceAsMap = hit.getSourceAsMap();//如果当前高亮字段不为null,将原来的字段换成我们高亮的字段即可if (name != null){//获取高亮的片段Text[] fragments = name.fragments();//替换StringBuilder stringBuilder = new StringBuilder();for (Text text : fragments){stringBuilder.append(text);}sourceAsMap.put("name", stringBuilder.toString());}System.out.println(sourceAsMap.toString());}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【待完成】并发包下常用到线程工具类汇总

文章目录并发容器BlockingQueueArrayBlockingQueueLinkedBlockingQueuePriorityBlockingDelayQueueSynchronousQueueBlockingDequeCopyOnWriteCopyOnWriteArrayListCopyOnWriteArraySetConcurrentLinkedQueue/DequeConcurrentHashMapConcurrentSkipListMap/Set同步工具类AQS实现…

爬虫中如何获取页面编码类型

获取页面的编码格式的三种方式&#xff1a; 根据Response中的header获取编码格式根据页面标签中的meta获取根据页面内容识别自动识别出编码格式&#xff0c;经过测试准确率比较高 三种方式可以结合使用&#xff0c;由于inputStream不能够被复用&#xff0c;但是inputStrem没有…

Spark集群部署与架构

在大数据时代&#xff0c;处理海量数据需要分布式计算框架。Apache Spark作为一种强大的大数据处理工具&#xff0c;可以在集群中高效运行&#xff0c;处理数十TB甚至PB级别的数据。本文将介绍如何构建和管理Spark集群&#xff0c;以满足大规模数据处理的需求。 Spark集群架构…

java核心技术-多线程并发设计原理以及常见面试题

文章目录写在前面多线程回顾Thread和Runnable面试官&#xff1a;为什么我们在项目中推荐使用使用Runnable方法而不用继承Thread&#xff1f;面试官&#xff1a;Callable为什么可以带返回值&#xff0c;你知道底层原理&#xff1f;面试题&#xff1a;线程了解&#xff1f;给我讲…

java核心技术-jvm基础知识

文章目录JVM回顾JVM、JRE、JDK之间关系&#xff1f;Java程序执行过程&#xff1f;面试官&#xff1a;解释执行和JIT(及时编译)两种执行方式有什么区别&#xff1f;java虚拟机内存管理jvm整体架构JVM只是定义内存划分规范等&#xff0c;具体实现依赖不同虚拟机实现&#xff0c;如…

多线程场景下利用ThreadLocal是线程安全?

文章目录背景多线程场景测试代码结论背景 ThreadLocal原理以及基本概念这里我就不介绍了&#xff0c;这里我们主要关注ThreadLocal是否是线程安全吗&#xff1f;其实如果我们知道ThreadLocal原理我们肯定知道它是线程安全的&#xff0c;但是我在开发的时候不放心做了个测试&am…

深入剖析线程池基本原理以及常见面试题详解

文章目录面试官&#xff1a;能给我讲讲线程池的实现原理&#xff1f;线程池类继承关系ThreadPoolExecutor核心数据结构面试官&#xff1a;给我讲讲线程池的有哪些参数&#xff1f;面试官&#xff1a;如何优雅的关闭线程&#xff1f;线程的生命周期面试官&#xff1a;线程池哪五…

设计模式七大设计原则

文章目录设计模式七大设计原则开闭原则里氏替换原则依赖倒置原则接口隔离原则迪米特法则-最少知道原则单一职责原则合成复用原则设计模式 面向对象的三个基本特征&#xff1a; 继承封装多态 设计模式体现了代码的耦合性、内聚性、可维护性、可扩展性、重用性、灵活性。 代码…

从框架源码中学习结构型设计模式

文章目录从框架源码学习结构型设计模式适配器模式应用实例案例一&#xff1a;dubbo框架日志适配器Logger接口日志实现类Logger适配器接口LoggerAdapter实现类Logger日志工厂桥接模式应用场景案例&#xff1a;dubbo源码-远程调用模块channelHandler设计ChannelHandler是一个SPI拓…

MDC日志logback整合使用

MDC日志logback整合使用 为什么使用MDC记录日志&#xff1f; 场景&#xff1a; 由于我的搜索服务并发量比较高&#xff0c;而处理一次搜索请求需要记录多个日志&#xff0c;因此日志特别多的情况下去查一次搜索整个日志打印情况会比较复杂。 解决方案&#xff1a; 可以使用用…

如何合理的配置线程数?

文章目录题记Java并发编程实战美团技术团队追求参数设置合理性线程池参数动态化题记 我想不管是在面试中、还是工作中&#xff0c;我们总会面临这种问题&#xff0c;那么到底有没有一种计算公式去告诉我们如何去配置呢&#xff1f; 答案是&#xff1a;没有 想要合理的配置线…

基于CompletableFuture并发任务编排实现

文章目录并发任务编排实现不带返回值/参数传递任务串行执行并行执行并行执行-自定义线程池阻塞等待&#xff1a;多并行任务执行完再执行任意一个任务并发执行完就执行下个任务串并行任务依赖场景带返回值/参数传递任务带返回值实现串行执行多线程任务串行执行对任务并行执行&am…

搜索研发工程师需要掌握的一些技能

文章目录基础语言数据结构与算法工程方面搜索相关搜索主要模块电商搜索流程分词相关搜索召回相似度算法相关词推荐排序相关国美搜索搜索算法工程师需要掌握的技能基础 语言 大部分公司用的是Solr、ElasticSearch&#xff0c;都是基于Java实现的&#xff0c;因此熟悉掌握Java语…

Flink入门看完这篇文章就够了

文章目录第一章&#xff1a;概述第一节&#xff1a;什么是Flink&#xff1f;第二节&#xff1a;Flink特点&#xff1f;第三节&#xff1a;Flink应用场景&#xff1f;第四节&#xff1a;Flink核心组成第五节&#xff1a;Flink处理模型&#xff1a;流处理和批处理第六节&#xff…

word小结

域代码/域结果显示设置 word选项---->>高级------>>显示域代码而非域值将样式传给其它文件使用 首先启动Word打开包含这些样式的一个文件&#xff0c;然后选择“工具”---->“模板和加载项”。在弹出的对话框中单击“管理器”按钮。在弹出的“管理器”对话框中&…

线程属性总结

今天面试那哥们问起线程属性&#xff0c;me竟然就说出了一个&#xff0c;囧 学习&#xff1a;http://blog.csdn.net/zsf8701/article/details/7842392 http://blog.csdn.net/jxhnuaa/article/details/3254299 http://blog.sina.com.cn/s/blog_9bd573450101hgdr.html int pthre…

百度2015校园招聘软件开发笔试题及答案

简单题&#xff08;本题共30分&#xff09; 请简述Tcp-ip的3次握手以及4次挥手过程&#xff1f;并解释为何关闭连接需要4次挥手(10分) 详细答案参见TCP/IP协议三次握手与四次握手流程解析 TCP三次握手、四次挥手过程如下: 通常情况下&#xff0c;一个正常的TCP连接&#xf…

linux ps 命令使用

Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照&#xff0c;就是执行ps命令的那个时刻的那些进程&#xff0c;如果想要动态的显示进程信息&#xff0c;就可以使用top命令。 linux上进程有5种状态 ps命令使…

UML序列图总结

序列图主要用于展示对象之间交互的顺序。 序列图将交互关系表示为一个二维图。纵向是时间轴&#xff0c;时间沿竖线向下延伸。横向轴代表了在协作中各独立对象的类元角色。类元角色用生命线表示。当对象存在时&#xff0c;角色用一条虚线表示&#xff0c;当对象的过程处于激活…