ES的索引管理
轉載自?ES的索引管理
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。
1、添加依賴:
2、配置文件
server:port: ${port:40100} spring:application:name: xc-search-service xuecheng:elasticsearch:hostlist: ${eshostlist:127.0.0.1:9200} #多個結點中間用逗號分隔3、配置類
@Configuration public class ElasticsearchConfig {@Value("${xuecheng.elasticsearch.hostlist}")private String hostlist;@Beanpublic 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,對于低級的客戶端暫時不用@Beanpublic 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();}}?
6.2創建索引庫
@SpringBootTest @RunWith(SpringRunner.class) public class TestSearch {@AutowiredRestHighLevelClient restHighLevelClient;@AutowiredRestClient restClient;@Testpublic void creatIndex() 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" +"\"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();//創建響應對象CreateIndexResponse response = client.create(createIndexRequest);//響應boolean acknowledged = response.isAcknowledged();System.out.println(acknowledged);}@Testpublic void delIndex() throws IOException {//創建索引請求對象DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("xc_course");//鏈接客戶端IndicesClient client = restHighLevelClient.indices();//刪除索引DeleteIndexResponse delete = client.delete(deleteIndexRequest);//響應boolean acknowledged = delete.isAcknowledged();System.out.println(acknowledged);}}6.3 添加文檔
@Testpublic void addDoc() 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 = restHighLevelClient.index(indexRequest);//獲取響應結果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 準備環境
創建xc_course索引庫。 創建映射: 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開發", "description": "Bootstrap是由Twitter推出的一個前臺頁面開發框架,是一個非常流行的開發框架,此框架集成了多種頁面效果。此開發框架包含了大量的CSS、JS程序代碼,可以幫助開發者(尤其是不擅長頁面開發的程序人員)輕松的實現一個不受瀏覽器限制的精美界面效果。", "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編程基礎", "description": "java語言是世界第一編程語言,在軟件開發領域使用人數最多。", "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開發基礎", "description": "spring 在java領域非常流行,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的搜索方式,在搜索時傳入特定的json格式的數據來完成不同的搜索需求。
DSL比URI搜索方式功能強大,在項目中建議使用DSL方式來完成搜索。
7.3.1 查詢所有文檔
@SpringBootTest @RunWith(SpringRunner.class) public class TestSearch {@AutowiredRestHighLevelClient restHighLevelClient;@AutowiredRestClient restClient;@Testpublic void queryAll() throws IOException, ParseException {//搜索請求對象SearchRequest searchRequest = new SearchRequest("xc_course");//指定類型searchRequest.types("doc");//搜索源構建對象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//搜索方式//matchAllQuery搜索全部searchSourceBuilder.query(QueryBuilders.matchAllQuery());//設置源字段過慮,第一個參數結果集包括哪些字段,第二個參數表示結果集不包括哪些字段searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});//向搜索請求對象中設置搜索源searchRequest.source(searchSourceBuilder);//執行搜索,向ES發起http請求SearchResponse searchResponse = restHighLevelClient.search(searchRequest);//搜索結果SearchHits hits = searchResponse.getHits();//匹配到的總記錄數long totalHits = hits.getTotalHits();//得到匹配度高的文檔SearchHit[] searchHits = hits.getHits();//日期格式化對象SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");for(SearchHit hit:searchHits){//文檔的主鍵String id = hit.getId();//源文檔內容Map<String, Object> sourceAsMap = hit.getSourceAsMap();String name = (String) sourceAsMap.get("name");//由于前邊設置了源文檔字段過慮,這時description是取不到的String description = (String) sourceAsMap.get("description");//學習模式String studymodel = (String) sourceAsMap.get("studymodel");//價格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支持分頁查詢,傳入兩個參數:from和size。
form:表示起始文檔的下標,從0開始。
size:查詢的文檔數量。
7.3.3 Term Query
Term Query為精確查詢,在搜索時會整體匹配關鍵字,不再將關鍵字分詞
//TermQuery@Testpublic void testTermQuery() throws IOException, ParseException {//搜索請求對象SearchRequest searchRequest = new SearchRequest("xc_course");//指定類型searchRequest.types("doc");//搜索源構建對象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//設置分頁參數//頁碼int page = 1;//每頁記錄數int size = 1;//計算出記錄起始下標int from = (page-1)*size;searchSourceBuilder.from(from);//起始記錄下標,從0開始searchSourceBuilder.size(size);//每頁顯示的記錄數//搜索方式//termQuerysearchSourceBuilder.query(QueryBuilders.termQuery("name","spring"));//設置源字段過慮,第一個參數結果集包括哪些字段,第二個參數表示結果集不包括哪些字段searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});//向搜索請求對象中設置搜索源searchRequest.source(searchSourceBuilder);//執行搜索,向ES發起http請求SearchResponse searchResponse = client.search(searchRequest);//搜索結果SearchHits hits = searchResponse.getHits();//匹配到的總記錄數long totalHits = hits.getTotalHits();//得到匹配度高的文檔SearchHit[] searchHits = hits.getHits();//日期格式化對象SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");for(SearchHit hit:searchHits){//文檔的主鍵String id = hit.getId();//源文檔內容Map<String, Object> sourceAsMap = hit.getSourceAsMap();String name = (String) sourceAsMap.get("name");//由于前邊設置了源文檔字段過慮,這時description是取不到的String description = (String) sourceAsMap.get("description");//學習模式String studymodel = (String) sourceAsMap.get("studymodel");//價格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 根據id精確匹配
ES提供根據多個id值匹配的方法:
//根據id查詢@Testpublic void testTermQueryByIds() throws IOException, ParseException {//搜索請求對象SearchRequest searchRequest = new SearchRequest("xc_course");//指定類型searchRequest.types("doc");//搜索源構建對象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//搜索方式//根據id查詢//定義idString[] ids = new String[]{"1","2"};searchSourceBuilder.query(QueryBuilders.termsQuery("_id",ids));//設置源字段過慮,第一個參數結果集包括哪些字段,第二個參數表示結果集不包括哪些字段searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});//向搜索請求對象中設置搜索源searchRequest.source(searchSourceBuilder);//執行搜索,向ES發起http請求SearchResponse searchResponse = client.search(searchRequest);//搜索結果SearchHits hits = searchResponse.getHits();//匹配到的總記錄數long totalHits = hits.getTotalHits();//得到匹配度高的文檔SearchHit[] searchHits = hits.getHits();//日期格式化對象SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");for(SearchHit hit:searchHits){//文檔的主鍵String id = hit.getId();//源文檔內容Map<String, Object> sourceAsMap = hit.getSourceAsMap();String name = (String) sourceAsMap.get("name");//由于前邊設置了源文檔字段過慮,這時description是取不到的String description = (String) sourceAsMap.get("description");//學習模式String studymodel = (String) sourceAsMap.get("studymodel");//價格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 排序
可以在字段上添加一個或多個排序,支持在keyword、date、float等類型上添加,text類型的字段上不允許添加排序。
//Sort@Testpublic void testSort() throws IOException, ParseException {//搜索請求對象SearchRequest searchRequest = new SearchRequest("xc_course");//指定類型searchRequest.types("doc");//搜索源構建對象SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//boolQuery搜索方式//定義一個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);//設置源字段過慮,第一個參數結果集包括哪些字段,第二個參數表示結果集不包括哪些字段searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});//向搜索請求對象中設置搜索源searchRequest.source(searchSourceBuilder);//執行搜索,向ES發起http請求SearchResponse searchResponse = client.search(searchRequest);//搜索結果SearchHits hits = searchResponse.getHits();//匹配到的總記錄數long totalHits = hits.getTotalHits();//得到匹配度高的文檔SearchHit[] searchHits = hits.getHits();//日期格式化對象SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");for(SearchHit hit:searchHits){//文檔的主鍵String id = hit.getId();//源文檔內容Map<String, Object> sourceAsMap = hit.getSourceAsMap();String name = (String) sourceAsMap.get("name");//由于前邊設置了源文檔字段過慮,這時description是取不到的String description = (String) sourceAsMap.get("description");//學習模式String studymodel = (String) sourceAsMap.get("studymodel");//價格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);}}
?
總結
- 上一篇: 电脑锁屏设置的方法台式电脑如何锁屏
- 下一篇: ES集群管理