6索引管理

6索引管理

6.1 搭建工程

6.1.1 ES客户端

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

1、TransportClient

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

2、RestClient

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

ES在6.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>

6.1.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); 
    } 
}

6.2创建索引库

6.2.1 API

创建索引:

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

{ 
    "settings":{ 
        "index":{ 
            "number_of_shards":1,#分片的数量 
            "number_of_replicas":0#副本数量 
        } 
    } 
}

创建映射:

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

创建类型为xc_course的映射,共包括三个字段:name、description、studymodel

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" 
        } 
    } 
}

6.2.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); 
    } 
}

6.3 添加文档

6.3.1 API

格式如下: PUT /{index}/{type}/{id} { “fifield”: “value”, … }

如果不指定id,ES会自动生成。

一个例子:

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 
}

6.3.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); 
} 

6.4 查询文档

6.4.1 API

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

6.4.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.5 更新文档

6.5.1 Api

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

索引。

通过请求Url有两种方法:

1、完全替换

Post:http://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
    } 
}

6.5.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); 
}

6.6 删除文档

6.6.1 Api

根据id删除,格式如下:

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

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

POST /{index}/{type}/_delete_by_query

下边是搜索条件例子:

{ "query":{ "term":{ "studymodel":"201001" } } }

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

6.6.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、付费专栏及课程。

余额充值