老实说,在安装时候确实踩了不少的坑,但是可幸的是最终可以从坑里爬出来。
坑一 elasticsearch 8
这个版本的 es 有较大改动,安装后的首次启动需要记录 密码 和 CA证书,否则?就吓唬你一下,直接去 log 里面找就好,这都小问题。
另外,在浏览器访问的时候,需要通过 https 访问,否则会报错
坑二 ik 分词器版本必须和 es 完全一致
分词器的版本必须和 es 完全一致,否则,你这辈子都起不来,不要相信 github 上 ik 分词器作者所说到的 7.x。。。。。
也就这点吧 其他的证书问题 在springboot上随机应变就好。
分词:即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一一个匹配操作,默认的中文分词是将每个字看成一个词(不使用用IK分词器的情况下),比如“我爱狂神”会被分为”我”,”爱”,”狂”,”神” ,这显然是不符合要求的,所以我们需要安装中文分词器ik来解决这个问题。
IK提供了两个分词算法: ik_smart和k_max_word,其中ik_smart为最少切分, ik_max_word为最细粒度划分!
只需要在 ik 分词器下的 config 文件夹中寻找 xml 文件,进去之后你要啥都懂了。
之后在上一次目录新建 .dic 文件格式的字典就可以,切记吧文件名写入刚才的 xml 文件
一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
method | url地址 | 描述 |
---|---|---|
PUT(创建,修改) | localhost:9200/索引名称/类型名称/文档id | 创建文档(指定文档id) |
POST(创建) | localhost:9200/索引名称/类型名称 | 创建文档(随机文档id) |
POST(修改) | localhost:9200/索引名称/类型名称/文档id/_update | 修改文档 |
DELETE(删除) | localhost:9200/索引名称/类型名称/文档id | 删除文档 |
GET(查询) | localhost:9200/索引名称/类型名称/文档id | 查询文档通过文档ID |
POST(查询) | localhost:9200/索引名称/类型名称/文档id/_search | 查询所有数据 |
字段数据类型
字符串类型
text、
keyword
数值型
日期类型
te布尔类型
二进制类型
等等…
指定字段的类型(也就是创建规则),需要留心的是:即使不添加规则,也会自动生成规则
使用基本工具集
通过以下命令可以获得巨多的信息
GET _cat/health
修改数据
方法有俩种,第一直接使用 PUT 命令覆盖,这样的缺点在于不灵活,如果修改的数据少写某一条则会造成数据丢失。
第二种是采用 POST 命令,这样就不会出现丢失情况。
POST /users/_doc/1/_update
{
"doc":{
"name":"世界上最帅的男人"
}
}
结果:
删除 (指定到具体位置就好)
什么是 Hit??
结果过滤
采用 _source 字段,选取要展示的字段。
设置超时时间
GET /shenzizai/user/_search
{
"timeout":"2s",
"query":{
"match": {
"name": "沈自在"
}
}
}
排序
分页查询
布尔值查询(精确查询)
must 命令,所有的条件都需要符合
should 命令,表示或操作
not 命令,如 not must
过滤器
gt 大于、lt 小于, e的意思是equal
匹配多个条件
多个条件使用空格隔开
精确查询
term 查询是直接通过倒排索引指定的词条进程精确查找的
关于分词:
term 直接进行精确查询
match 会通过分词器分词
GET /shenzizai/user/_search
{
"query": {
"term": {
"desc":"我"
}
}
}
高亮查询
切记:搜索的内容再搜索的结果中会高亮显示
可以通过 “pro_tags”:“<>”
“post_tags”:"<>"自定义高亮。
GET /shenzizai/user/_search
{
"query": {
"match": {
"name":"沈自在"
}
},
"highlight": {
"pro_tags":"<>"
"post_tags":"<>"
"fields": {
"name":{}
}
}
}
导入依赖并且统一版本
<properties>
<java.version>1.8java.version>
<elasticsearch.version>7.6.1elasticsearch.version>
properties>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-elasticsearchartifactId>
dependency>
<dependency>
<groupId>org.elasticsearch.clientgroupId>
<artifactId>elasticsearch-rest-high-level-clientartifactId>
<version>7.6.2version>
dependency>
创建并编写配置类
@Configuration
public class ElasticSearchClientConfig {
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost",9200,"http"))
);
return client;
}
}
索引三连
// 创建索引
@Test
void createIndex() throws IOException {
CreateIndexRequest request = new CreateIndexRequest("test-shenzizai-01");
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
boolean acknowledged = response.isAcknowledged();
System.out.println(acknowledged);
}
// 判断索引是否存在
@Test
void isExistIndex() throws IOException {
GetIndexRequest request = new GetIndexRequest("test-shenzizai-05");
boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}
// 删除索引
@Test
void deleteIndex() throws IOException {
DeleteIndexRequest request = new DeleteIndexRequest("test-shenzizai-01");
AcknowledgedResponse delete = client.indices().delete(request,RequestOptions.DEFAULT);
System.out.printf(String.valueOf(delete.isAcknowledged()));
}
添加文档
//创建文档
@Test
void createDocument() throws IOException {
CreateIndexRequest request = new CreateIndexRequest("haoran");
CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
if (createIndexResponse.isAcknowledged() == true){
User user = new User("沈自在",21,"不要羡慕哥,哥只是一个传说");
IndexRequest writeRequest = new IndexRequest("haoran");
writeRequest.id("1");
writeRequest.timeout(TimeValue.timeValueSeconds(1));
writeRequest.source(JSON.toJSONString(user), XContentType.JSON);
IndexResponse response = client.index(writeRequest, RequestOptions.DEFAULT);
System.out.println(response.status());
System.out.println(response);
}
}
获取文档 判断文档是否存在
//获取文档
@Test
void getDocument() throws IOException {
GetRequest request = new GetRequest("haoran","2");
//此处设置不在返回 source
request.fetchSourceContext(new FetchSourceContext(false));
request.storedFields("_none_");
//GetResponse response = client.get(request, RequestOptions.DEFAULT);
//判断是否存在
boolean exists = client.exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}
更新文档
//文档更新
@Test
void updateDocument() throws IOException {
UpdateRequest request = new UpdateRequest("haoran","1");
User user = new User("沈自在大帅哥",21,"我二弟天下无敌");
request.timeout(TimeValue.timeValueSeconds(3));
request.doc(JSON.toJSONString(user),XContentType.JSON);
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
System.out.println(response.getVersion());
}
文档删除
//文档删除
@Test
void deleteDocument() throws IOException {
DeleteRequest request = new DeleteRequest("haoran","1");
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
System.out.println(response.status());
}
批量处理文档(添加文档)
//批量添加文档
@Test
void bulkDocument() throws IOException {
BulkRequest request = new BulkRequest();
request.timeout(TimeValue.timeValueSeconds(3));
List<User> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
User user = new User("沈自在 "+i,21,"不要迷恋哥,哥只是一个传说");
list.add(user);
}
for (int i = 0; i < list.size(); i++) {
request.add(
new IndexRequest("haoran")
.id((i+1)+"")
.source(JSON.toJSONString(list.get(i)),XContentType.JSON)
);
}
BulkResponse bulk = client.bulk(request,RequestOptions.DEFAULT);
System.out.println(bulk.status());
}
搜索文档
@Test
void searchDocument() throws IOException {
SearchRequest request = new SearchRequest();
//构建搜索条件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//TermQueryBuilder termQuery = QueryBuilders.termQuery("name", "沈自在1");
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "沈自在");
//条件投入
searchSourceBuilder.query(matchQueryBuilder);
//添加条件到请求
request.source(searchSourceBuilder);
//查看返回结果
SearchResponse search = client.search(request, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
System.out.println(JSON.toJSONString(hits));
for (SearchHit hit : hits.getHits()) {
System.out.println(hit.getSourceAsMap());
}
}