ElasticSearch------索引管理

1.ES客户端

ES提供多种不同的客户端:

1TransportClient

ES提供的传统客户端,官方计划8.0版本删除此客户端。

2RestClient

RestClient是官方推荐使用的,它包括两种:Java Low Level REST ClientJava High Level REST Client

ES6.0之后提供 Java High Level REST Client, 两种客户端官方更推荐使用 Java High Level REST Client,不过当

前它还处于完善中,有些功能还没有。

本教程准备采用 Java High Level REST Client,如果它有不支持的功能,则使用Java Low Level REST Client

添加依赖:

<dependency>

<groupId>org.elasticsearch.client</groupId>

<artifactId>elasticsearch‐rest‐high‐level‐client</artifactId>

<version>6.2.1</version>

</dependency>

<dependency>

<groupId>org.elasticsearch</groupId>

<artifactId>elasticsearch</artifactId>

<version>6.2.1</version>

</dependency>

2.创建搜索工程

创建搜索工程(maven工程):xc-service-search,添加RestHighLevelClient依赖及junit依赖。

pom.xml

<?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

http://maven.apache.org/xsd/maven‐4.0.0.xsd">

<parent>

<artifactId>xc‐framework‐parent</artifactId>

<groupId>com.xuecheng</groupId>

<version>1.0‐SNAPSHOT</version>

<relativePath>../xc‐framework‐parent/pom.xml</relativePath>

</parent>

<modelVersion>4.0.0</modelVersion>

<artifactId>xc‐service‐search</artifactId>

<dependencies>

<dependency>

<groupId>com.xuecheng</groupId>

<artifactId>xc‐framework‐model</artifactId>

<version>1.0‐SNAPSHOT</version>

</dependency>

<dependency>

<groupId>com.xuecheng</groupId>

<artifactId>xc‐framework‐common</artifactId>

<version>1.0‐SNAPSHOT</version>

</dependency>

<dependency>

<groupId>com.xuecheng</groupId>

<artifactId>xc‐service‐api</artifactId>

<version>1.0‐SNAPSHOT</version>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring‐boot‐starter‐web</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring‐boot‐starter‐web</artifactId>

</dependency>

<dependency>

<groupId>org.elasticsearch.client</groupId>

<artifactId>elasticsearch‐rest‐high‐level‐client</artifactId>

<version>6.2.1</version>

</dependency>

<dependency>

<groupId>org.elasticsearch</groupId>

<artifactId>elasticsearch</artifactId>

<version>6.2.1</version>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring‐boot‐starter‐test</artifactId>

<scope>test</scope>

</dependency>

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>fastjson</artifactId>

</dependency>

<dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons‐io</artifactId>

</dependency>

<dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons‐lang3</artifactId>

</dependency>

</dependencies>

</project>

2、配置文件

application.yml

server:

port: ${port:40100}

spring:

application:

name: xc‐search‐service

xuecheng:

elasticsearch:

hostlist: ${eshostlist:127.0.0.1:9200} #多个结点中间用逗号分隔

3、配置类

创建com.xuecheng.search.confifig

在其下创建配置类

package com.xuecheng.search.config;

import org.apache.http.HttpHost;

import org.elasticsearch.client.RestClient;

import org.elasticsearch.client.RestHighLevelClient;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class ElasticsearchConfig {

@Value("${xuecheng.elasticsearch.hostlist}")

private String hostlist;

@Bean

public RestHighLevelClient restHighLevelClient(){

//解析hostlist配置信息

String[] split = hostlist.split(",");

//创建HttpHost数组,其中存放es主机和端口的配置信息

HttpHost[] httpHostArray = new HttpHost[split.length];

for(int i=0;i<split.length;i++){

String item = split[i];

httpHostArray[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")

[1]), "http");

}

//创建RestHighLevelClient客户端

return new RestHighLevelClient(RestClient.builder(httpHostArray));

}

//项目主要使用RestHighLevelClient,对于低级的客户端暂时不用

@Bean

public RestClient restClient(){

//解析hostlist配置信息

String[] split = hostlist.split(",");

//创建HttpHost数组,其中存放es主机和端口的配置信息

HttpHost[] httpHostArray = new HttpHost[split.length];

for(int i=0;i<split.length;i++){

String item = split[i];

httpHostArray[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")

[1]), "http");

}

return RestClient.builder(httpHostArray).build();

}

}

3、启动类

@SpringBootApplication

@EntityScan("com.xuecheng.framework.domain.search")//扫描实体类

@ComponentScan(basePackages={"com.xuecheng.api"})//扫描接口

@ComponentScan(basePackages={"com.xuecheng.search"})//扫描本项目下的所有类

@ComponentScan(basePackages={"com.xuecheng.framework"})//扫描common下的所有类

public class SearchApplication {

public static void main(String[] args) throws Exception {

SpringApplication.run(SearchApplication.class, args);

}

}

3.创建索引库

1.API

创建索引:

put http://localhost:9200/索引名称

{

"settings":{

"index":{

"number_of_shards":1,#分片的数量

"number_of_replicas":0#副本数量

}

}

}

创建映射:

发送:put http://localhost:9200/索引库名称/类型名称/_mapping

创建类型为xc_course的映射,共包括三个字段:namedescriptionstudymodel

http://localhost:9200/xc_course/doc/_mapping

{

"properties": {

"name": {

"type": "text",

"analyzer":"ik_max_word",

"search_analyzer":"ik_smart"

},

"description": {

"type": "text",

"analyzer":"ik_max_word",

"search_analyzer":"ik_smart"

},

"studymodel": {

"type": "keyword"

},

"price": {

"type": "float"

},

"timestamp": {

"type": "date",

"format": "yyyy‐MM‐dd HH:mm:ss||yyyy‐MM‐dd||epoch_millis"

}

}

}

2.Java Client

@SpringBootTest

@RunWith(SpringRunner.class)

public class TestIndex {

@Autowired

RestHighLevelClient client;

@Autowired

RestClient restClient;

//创建索引库

@Test

public void testCreateIndex() throws IOException {

//创建索引请求对象,并设置索引名称

CreateIndexRequest createIndexRequest = new CreateIndexRequest("xc_course");

//设置索引参数

createIndexRequest.settings(Settings.builder().put("number_of_shards",1)

.put("number_of_replicas",0));

//设置映射

createIndexRequest.mapping("doc"," {\n" +

" \t\"properties\": {\n" +

" \"name\": {\n" +

" \"type\": \"text\",\n" +

" \"analyzer\":\"ik_max_word\",\n" +

" \"search_analyzer\":\"ik_smart\"\n" +

" },\n" +

" \"description\": {\n" +

" \"type\": \"text\",\n" +

" \"analyzer\":\"ik_max_word\",\n" +

" \"search_analyzer\":\"ik_smart\"\n" +

" },\n" +

" \"studymodel\": {\n" +

" \"type\": \"keyword\"\n" +

" },\n" +

" \"price\": {\n" +

" \"type\": \"float\"\n" +

" }\n" +

" }\n" +

"}", XContentType.JSON);

//创建索引操作客户端

IndicesClient indices = client.indices();

//创建响应对象

CreateIndexResponse createIndexResponse = indices.create(createIndexRequest);

//得到响应结果

boolean acknowledged = createIndexResponse.isAcknowledged();

System.out.println(acknowledged);

}

//删除索引库

@Test

public void testDeleteIndex() throws IOException {

//删除索引请求对象

DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("xc_course");

//删除索引

DeleteIndexResponse deleteIndexResponse = client.indices().delete(deleteIndexRequest);

//删除索引响应结果

boolean acknowledged = deleteIndexResponse.isAcknowledged();

System.out.println(acknowledged);

}

}

4.添加文档

1.API

格式如下: PUT /{index}/{type}/{id} { "fifield": "value", ... }

如果不指定idES会自动生成。

一个例子:

put http://localhost:9200/xc_course/doc/3

{

"name":"spring cloud实战",

"description":"本课程主要从四个章节进行讲解: 1.微服务架构入门 2.spring cloud 基础入门 3.实战Spring

Boot 4.注册中心eureka",

"studymodel":"201001"

"price":5.6

}

2.Java Client

//添加文档

@Test

public void testAddDoc() throws IOException {

//准备json数据

Map<String, Object> jsonMap = new HashMap<>();

jsonMap.put("name", "spring cloud实战");

jsonMap.put("description", "本课程主要从四个章节进行讲解: 1.微服务架构入门 2.spring cloud

基础入门 3.实战Spring Boot 4.注册中心eureka");

jsonMap.put("studymodel", "201001");

SimpleDateFormat dateFormat =new SimpleDateFormat("yyyy‐MM‐dd HH:mm:ss");

jsonMap.put("timestamp", dateFormat.format(new Date()));

jsonMap.put("price", 5.6f);

//索引请求对象

IndexRequest indexRequest = new IndexRequest("xc_course","doc");

//指定索引文档内容

indexRequest.source(jsonMap);

//索引响应对象

IndexResponse indexResponse = client.index(indexRequest);

//获取响应结果

DocWriteResponse.Result result = indexResponse.getResult();

System.out.println(result);

}

5.查询文档

1.API

格式如下: GET /{index}/{type}/{id}

2.Java Client

//查询文档

@Test

public void getDoc() throws IOException {

GetRequest getRequest = new GetRequest(

"xc_course",

"doc",

"4028e581617f945f01617f9dabc40000");

GetResponse getResponse = client.get(getRequest);

boolean exists = getResponse.isExists();

Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();

System.out.println(sourceAsMap);

}

6.更新文档

1.Api

ES更新文档的顺序是:先检索到文档、将原来的文档标记为删除、创建新文档、删除旧文档,创建新文档就会重建

索引。

通过请求Url有两种方法:

1、完全替换

Posthttp://localhost:9200/xc_test/doc/3

{

"name":"spring cloud实战",

"description":"本课程主要从四个章节进行讲解: 1.微服务架构入门 2.spring cloud 基础入门 3.实战Spring

Boot 4.注册中心eureka",

"studymodel":"201001"

"price":5.6

}

2、局部更新

下边的例子是只更新price字段。

post: http://localhost:9200/xc_test/doc/3/_update

{

"doc":{"price":66.6}

}

2.Java Client

使用 Client Api更新文档的方法同上边第二种局部更新方法。

可以指定文档的部分字段也可以指定完整的文档内容。

//更新文档

@Test

public void updateDoc() throws IOException {

UpdateRequest updateRequest = new UpdateRequest("xc_course", "doc",

"4028e581617f945f01617f9dabc40000");

Map<String, String> map = new HashMap<>();

map.put("name", "spring cloud实战");

updateRequest.doc(map);

UpdateResponse update = client.update(updateRequest);

RestStatus status = update.status();

System.out.println(status);

}

7.删除文档

1.Api

根据id删除,格式如下:

DELETE /{index}/{type}/{id}

搜索匹配删除,将搜索出来的记录删除,格式如下:

POST /{index}/{type}/_delete_by_query

下边是搜索条件例子:

{

"query":{

"term":{

"studymodel":"201001"

}

}

}

上边例子的搜索匹配删除会将studymodel201001的记录全部删除。

2.Java Client

//根据id删除文档

@Test

public void testDelDoc() throws IOException {

//删除文档id

String id = "eqP_amQBKsGOdwJ4fHiC";

//删除索引请求对象

DeleteRequest deleteRequest = new DeleteRequest("xc_course","doc",id);

//响应对象

DeleteResponse deleteResponse = client.delete(deleteRequest);

//获取响应结果

DocWriteResponse.Result result = deleteResponse.getResult();

System.out.println(result);

}

搜索匹配删除还没有具体的api,可以采用先搜索出文档id,根据文档id删除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值