ES的索引管理
轉(zhuǎn)載自?ES的索引管理
6索引管理
6.1 搭建工程
6.1.1 ES客戶端
ES提供多種不同的客戶端:
1、TransportClient
ES提供的傳統(tǒng)客戶端,官方計(jì)劃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,不過當(dāng)前它還處于完善中,有些功能還沒有。
我們準(zhǔn)備采用 Java High Level REST Client,如果它有不支持的功能,則使用Java Low Level REST Client。
1、添加依賴:
2、配置文件
server:port: ${port:40100} spring:application:name: xc-search-service xuecheng:elasticsearch:hostlist: ${eshostlist:127.0.0.1:9200} #多個(gè)結(jié)點(diǎn)中間用逗號(hào)分隔3、配置類
@Configuration public class ElasticsearchConfig {@Value("${xuecheng.elasticsearch.hostlist}")private String hostlist;@Beanpublic RestHighLevelClient restHighLevelClient(){//解析hostlist配置信息String[] split = hostlist.split(",");//創(chuàng)建HttpHost數(shù)組,其中存放es主機(jī)和端口的配置信息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");}//創(chuàng)建RestHighLevelClient客戶端return new RestHighLevelClient(RestClient.builder(httpHostArray));}//項(xiàng)目主要使用RestHighLevelClient,對(duì)于低級(jí)的客戶端暫時(shí)不用@Beanpublic RestClient restClient(){//解析hostlist配置信息String[] split = hostlist.split(",");//創(chuàng)建HttpHost數(shù)組,其中存放es主機(jī)和端口的配置信息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();}}?
6.2創(chuàng)建索引庫
@SpringBootTest @RunWith(SpringRunner.class) public class TestSearch {@AutowiredRestHighLevelClient restHighLevelClient;@AutowiredRestClient restClient;@Testpublic void creatIndex() throws IOException {//創(chuàng)建索引請求對(duì)象CreateIndexRequest createIndexRequest = new CreateIndexRequest("xc_course");//設(shè)置索引參數(shù)createIndexRequest.settings(Settings.builder().put("number_of_shards",1).put("number_of_replicas",0));//設(shè)置映射createIndexRequest.mapping("doc","{\n" +"\"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" +"\"timestamp\": {\n" +"\"type\": \"date\",\n" +"\"format\": \"yyyy‐MM‐dd HH:mm:ss||yyyy‐MM‐dd||epoch_millis\"\n" +"}\n" +"}\n" +"}\n" ,XContentType.JSON);//鏈接客戶端IndicesClient client = restHighLevelClient.indices();//創(chuàng)建響應(yīng)對(duì)象CreateIndexResponse response = client.create(createIndexRequest);//響應(yīng)boolean acknowledged = response.isAcknowledged();System.out.println(acknowledged);}@Testpublic void delIndex() throws IOException {//創(chuàng)建索引請求對(duì)象DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("xc_course");//鏈接客戶端IndicesClient client = restHighLevelClient.indices();//刪除索引DeleteIndexResponse delete = client.delete(deleteIndexRequest);//響應(yīng)boolean acknowledged = delete.isAcknowledged();System.out.println(acknowledged);}}6.3 添加文檔
@Testpublic void addDoc() throws IOException {//準(zhǔn)備json數(shù)據(jù)Map<String, Object> jsonMap = new HashMap<>();jsonMap.put("name", "spring cloud實(shí)戰(zhàn)");jsonMap.put("description", "本課程主要從四個(gè)章節(jié)進(jìn)行講解: 1.微服務(wù)架構(gòu)入門 2.spring cloud 基礎(chǔ)入門 3.實(shí)戰(zhàn)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);//創(chuàng)建索引請求對(duì)象IndexRequest indexRequest = new IndexRequest("xc_course","doc");//指定索引添加文檔indexRequest.source(jsonMap);//鏈接客戶端IndexResponse indexResponse = restHighLevelClient.index(indexRequest);//獲取響應(yīng)結(jié)果DocWriteResponse.Result result = indexResponse.getResult();System.out.println(result);}6.4 查詢文檔
@Testpublic void queryDoc() throws IOException {GetRequest getRequest = new GetRequest("xc_course","doc","5W8t9WgBMHjTRj0U9GkF");GetResponse getResponse = restHighLevelClient.get(getRequest);boolean exists = getResponse.isExists();Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();System.out.println(sourceAsMap);}?
7搜索管理
7.1 準(zhǔn)備環(huán)境
創(chuàng)建xc_course索引庫。 創(chuàng)建映射: post:http://localhost:9200/xc_course/doc/_mapping {"properties": {"description": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},"name": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},"pic":{"type":"text","index":false},"price": {"type": "float"},"studymodel": {"type": "keyword"},"timestamp": {"type": "date","format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"}}}初始化文檔:http://localhost:9200/xc_course/doc/1 { "name": "Bootstrap開發(fā)", "description": "Bootstrap是由Twitter推出的一個(gè)前臺(tái)頁面開發(fā)框架,是一個(gè)非常流行的開發(fā)框架,此框架集成了多種頁面效果。此開發(fā)框架包含了大量的CSS、JS程序代碼,可以幫助開發(fā)者(尤其是不擅長頁面開發(fā)的程序人員)輕松的實(shí)現(xiàn)一個(gè)不受瀏覽器限制的精美界面效果。", "studymodel": "201002", "price":38.6, "timestamp":"2018-04-25 19:11:35", "pic":"group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg" } http://localhost:9200/xc_course/doc/2 { "name": "java編程基礎(chǔ)", "description": "java語言是世界第一編程語言,在軟件開發(fā)領(lǐng)域使用人數(shù)最多。", "studymodel": "201001", "price":68.6, "timestamp":"2018-03-25 19:11:35", "pic":"group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg" } http://localhost:9200/xc_course/doc/3 { "name": "spring開發(fā)基礎(chǔ)", "description": "spring 在java領(lǐng)域非常流行,java程序員都在用。", "studymodel": "201001", "price":88.6, "timestamp":"2018-02-24 19:11:35", "pic":"group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg" }7.3 DSL搜索
DSL(Domain Specific Language)是ES提出的基于json的搜索方式,在搜索時(shí)傳入特定的json格式的數(shù)據(jù)來完成不同的搜索需求。
DSL比URI搜索方式功能強(qiáng)大,在項(xiàng)目中建議使用DSL方式來完成搜索。
7.3.1 查詢所有文檔
@SpringBootTest @RunWith(SpringRunner.class) public class TestSearch {@AutowiredRestHighLevelClient restHighLevelClient;@AutowiredRestClient restClient;@Testpublic void queryAll() throws IOException, ParseException {//搜索請求對(duì)象SearchRequest searchRequest = new SearchRequest("xc_course");//指定類型searchRequest.types("doc");//搜索源構(gòu)建對(duì)象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//搜索方式//matchAllQuery搜索全部searchSourceBuilder.query(QueryBuilders.matchAllQuery());//設(shè)置源字段過慮,第一個(gè)參數(shù)結(jié)果集包括哪些字段,第二個(gè)參數(shù)表示結(jié)果集不包括哪些字段searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});//向搜索請求對(duì)象中設(shè)置搜索源searchRequest.source(searchSourceBuilder);//執(zhí)行搜索,向ES發(fā)起http請求SearchResponse searchResponse = restHighLevelClient.search(searchRequest);//搜索結(jié)果SearchHits hits = searchResponse.getHits();//匹配到的總記錄數(shù)long totalHits = hits.getTotalHits();//得到匹配度高的文檔SearchHit[] searchHits = hits.getHits();//日期格式化對(duì)象SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");for(SearchHit hit:searchHits){//文檔的主鍵String id = hit.getId();//源文檔內(nèi)容Map<String, Object> sourceAsMap = hit.getSourceAsMap();String name = (String) sourceAsMap.get("name");//由于前邊設(shè)置了源文檔字段過慮,這時(shí)description是取不到的String description = (String) sourceAsMap.get("description");//學(xué)習(xí)模式String studymodel = (String) sourceAsMap.get("studymodel");//價(jià)格Double price = (Double) sourceAsMap.get("price");//日期Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp"));System.out.println(name);System.out.println(studymodel);System.out.println(description);}} }7.3.2 分頁查詢
ES支持分頁查詢,傳入兩個(gè)參數(shù):from和size。
form:表示起始文檔的下標(biāo),從0開始。
size:查詢的文檔數(shù)量。
7.3.3 Term Query
Term Query為精確查詢,在搜索時(shí)會(huì)整體匹配關(guān)鍵字,不再將關(guān)鍵字分詞
//TermQuery@Testpublic void testTermQuery() throws IOException, ParseException {//搜索請求對(duì)象SearchRequest searchRequest = new SearchRequest("xc_course");//指定類型searchRequest.types("doc");//搜索源構(gòu)建對(duì)象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//設(shè)置分頁參數(shù)//頁碼int page = 1;//每頁記錄數(shù)int size = 1;//計(jì)算出記錄起始下標(biāo)int from = (page-1)*size;searchSourceBuilder.from(from);//起始記錄下標(biāo),從0開始searchSourceBuilder.size(size);//每頁顯示的記錄數(shù)//搜索方式//termQuerysearchSourceBuilder.query(QueryBuilders.termQuery("name","spring"));//設(shè)置源字段過慮,第一個(gè)參數(shù)結(jié)果集包括哪些字段,第二個(gè)參數(shù)表示結(jié)果集不包括哪些字段searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});//向搜索請求對(duì)象中設(shè)置搜索源searchRequest.source(searchSourceBuilder);//執(zhí)行搜索,向ES發(fā)起http請求SearchResponse searchResponse = client.search(searchRequest);//搜索結(jié)果SearchHits hits = searchResponse.getHits();//匹配到的總記錄數(shù)long totalHits = hits.getTotalHits();//得到匹配度高的文檔SearchHit[] searchHits = hits.getHits();//日期格式化對(duì)象SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");for(SearchHit hit:searchHits){//文檔的主鍵String id = hit.getId();//源文檔內(nèi)容Map<String, Object> sourceAsMap = hit.getSourceAsMap();String name = (String) sourceAsMap.get("name");//由于前邊設(shè)置了源文檔字段過慮,這時(shí)description是取不到的String description = (String) sourceAsMap.get("description");//學(xué)習(xí)模式String studymodel = (String) sourceAsMap.get("studymodel");//價(jià)格Double price = (Double) sourceAsMap.get("price");//日期Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp"));System.out.println(name);System.out.println(studymodel);System.out.println(description);}}7.3.4 根據(jù)id精確匹配
ES提供根據(jù)多個(gè)id值匹配的方法:
//根據(jù)id查詢@Testpublic void testTermQueryByIds() throws IOException, ParseException {//搜索請求對(duì)象SearchRequest searchRequest = new SearchRequest("xc_course");//指定類型searchRequest.types("doc");//搜索源構(gòu)建對(duì)象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//搜索方式//根據(jù)id查詢//定義idString[] ids = new String[]{"1","2"};searchSourceBuilder.query(QueryBuilders.termsQuery("_id",ids));//設(shè)置源字段過慮,第一個(gè)參數(shù)結(jié)果集包括哪些字段,第二個(gè)參數(shù)表示結(jié)果集不包括哪些字段searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});//向搜索請求對(duì)象中設(shè)置搜索源searchRequest.source(searchSourceBuilder);//執(zhí)行搜索,向ES發(fā)起http請求SearchResponse searchResponse = client.search(searchRequest);//搜索結(jié)果SearchHits hits = searchResponse.getHits();//匹配到的總記錄數(shù)long totalHits = hits.getTotalHits();//得到匹配度高的文檔SearchHit[] searchHits = hits.getHits();//日期格式化對(duì)象SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");for(SearchHit hit:searchHits){//文檔的主鍵String id = hit.getId();//源文檔內(nèi)容Map<String, Object> sourceAsMap = hit.getSourceAsMap();String name = (String) sourceAsMap.get("name");//由于前邊設(shè)置了源文檔字段過慮,這時(shí)description是取不到的String description = (String) sourceAsMap.get("description");//學(xué)習(xí)模式String studymodel = (String) sourceAsMap.get("studymodel");//價(jià)格Double price = (Double) sourceAsMap.get("price");//日期Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp"));System.out.println(name);System.out.println(studymodel);System.out.println(description);}}7.3.9 排序
可以在字段上添加一個(gè)或多個(gè)排序,支持在keyword、date、float等類型上添加,text類型的字段上不允許添加排序。
//Sort@Testpublic void testSort() throws IOException, ParseException {//搜索請求對(duì)象SearchRequest searchRequest = new SearchRequest("xc_course");//指定類型searchRequest.types("doc");//搜索源構(gòu)建對(duì)象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//boolQuery搜索方式//定義一個(gè)boolQueryBoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();//定義過慮器boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(0).lte(100));searchSourceBuilder.query(boolQueryBuilder);//添加排序searchSourceBuilder.sort("studymodel", SortOrder.DESC);searchSourceBuilder.sort("price", SortOrder.ASC);//設(shè)置源字段過慮,第一個(gè)參數(shù)結(jié)果集包括哪些字段,第二個(gè)參數(shù)表示結(jié)果集不包括哪些字段searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});//向搜索請求對(duì)象中設(shè)置搜索源searchRequest.source(searchSourceBuilder);//執(zhí)行搜索,向ES發(fā)起http請求SearchResponse searchResponse = client.search(searchRequest);//搜索結(jié)果SearchHits hits = searchResponse.getHits();//匹配到的總記錄數(shù)long totalHits = hits.getTotalHits();//得到匹配度高的文檔SearchHit[] searchHits = hits.getHits();//日期格式化對(duì)象SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");for(SearchHit hit:searchHits){//文檔的主鍵String id = hit.getId();//源文檔內(nèi)容Map<String, Object> sourceAsMap = hit.getSourceAsMap();String name = (String) sourceAsMap.get("name");//由于前邊設(shè)置了源文檔字段過慮,這時(shí)description是取不到的String description = (String) sourceAsMap.get("description");//學(xué)習(xí)模式String studymodel = (String) sourceAsMap.get("studymodel");//價(jià)格Double price = (Double) sourceAsMap.get("price");//日期Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp"));System.out.println(name);System.out.println(studymodel);System.out.println(description);}}
?
總結(jié)
- 上一篇: 电脑锁屏设置的方法台式电脑如何锁屏
- 下一篇: ES集群管理