一 索引模板(用于通過模板匹配匹配到的所有索引)詳細(xì)請點擊
{
? "order": 0,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 模板優(yōu)先級
? "template": "sample*",? ? ? ? ? ? ? // 模板匹配的名稱方式
? "settings": {...},? ? ? ? ? ? ? ? ? ? ? ? // 索引設(shè)置
? "mappings": {...},? ? ? ? ? ? ? ? ? ? ? ? // 索引中各字段的映射定義
? "aliases": {...}? ? ? ? ? ? ? ? ? ? ? ? ? // 索引的別名
}
(1)模板優(yōu)先級:優(yōu)先級越高,越優(yōu)先執(zhí)行,優(yōu)先級高的會覆蓋優(yōu)先級的索引。
(2)模板匹配:當(dāng)新建的索引時,所有以sample開頭索引的會自動匹配該索引模板。
(3)索引設(shè)置:一般定義的有主分片,拷貝分片,自定義分析器,刷新時間,
? ? ? ? ? ? ? ? ? ? ? ? ? ?一般分析器中有過濾器、分詞器、標(biāo)記過濾器。
? ? ? ? ? ? ? ? ? ? ?映射字符過濾器(mapping char filter)、HTML過濾器(HTML Strip char filter)、格式替換過濾器(Pattern Replace char filter)。html_strip 字符過濾器去除所有的 HTML 標(biāo)簽。
(4)索引映射定義:有動態(tài)映射,自定義映射。
(5)索引別名:利用索引別名,可以實現(xiàn)零停機時間重新索引。
二 傳統(tǒng)數(shù)據(jù)庫與ES之間對比
關(guān)系數(shù)據(jù)庫es
DataBaseindex
Tabletype
RowDocument
ColumnField
注:type在es 7.0以后會為es創(chuàng)建唯一一個映射類型_doc
三 以下的內(nèi)容來源是es的官網(wǎng)
第一類:是關(guān)于index模板的API
在Index APIs 是創(chuàng)建索引的也就是相當(dāng)于創(chuàng)建庫,
一 Document APIs中的方法
1? CreateIndexRequest:這個請求時創(chuàng)建一個索引,在es中的索引相當(dāng)于mysql 中創(chuàng)建一個數(shù)據(jù)庫(create database XX)。
? ? ?settings()方法 中會設(shè)置主分區(qū),拷貝分區(qū),刷新時間。
? ? ?mapping()方法配置映射的。
? ? ?aliases()方法是給模板請別名。
以下是測試方法,請準(zhǔn)備好開發(fā)環(huán)境(下載安裝es及其es head可視化工具)
publicfinalstaticString ES_COLLECTION_NAME="first";publicResponseDatabuildIndexDB()throwsIOException{? ? ? ? CreateIndexRequest createIndexRequest=newCreateIndexRequest();? ? ? ? createIndexRequest.index(ES_COLLECTION_NAME);//setting中會設(shè)置主分區(qū),拷貝分區(qū),刷新時間createIndexRequest.settings(Settings.builder().put("index.number_of_shards","3")? ? ? ? ? ? ? ? ? ? ? ? ? .put("index.number_of_replicas","2"));? ? ? ? Map message=newHashMap<>();? ? ? ? message.put("type","text");? ? ? ? Map properties=newHashMap<>();? ? ? ? properties.put("message",message);? ? ? ? Map mapping=newHashMap<>();? ? ? ? mapping.put("mapping",mapping);//動態(tài)映射createIndexRequest.mapping("{\n"+"? \"properties\": {\n"+"? ? \"message\": {\n"+"? ? ? \"type\": \"text\"\n"+"? ? }\n"+"? }\n"+"}",? ? ? ? ? ? ? ? XContentType.JSON);//起別名createIndexRequest.aliases("hanqiang");//可以為索引設(shè)置setting,mapping,aliases/*createIndexRequest.source("{\n" +
? ? ? ? ? ? ? ? "? ? \"settings\" : {\n" +
? ? ? ? ? ? ? ? "? ? ? ? \"number_of_shards\" : 1,\n" +
? ? ? ? ? ? ? ? "? ? ? ? \"number_of_replicas\" : 0\n" +
? ? ? ? ? ? ? ? "? ? },\n" +
? ? ? ? ? ? ? ? "? ? \"mappings\" : {\n" +
? ? ? ? ? ? ? ? "? ? ? ? \"properties\" : {\n" +
? ? ? ? ? ? ? ? "? ? ? ? ? ? \"message\" : { \"type\" : \"text\" }\n" +
? ? ? ? ? ? ? ? "? ? ? ? }\n" +
? ? ? ? ? ? ? ? "? ? },\n" +
? ? ? ? ? ? ? ? "? ? \"aliases\" : {\n" +
? ? ? ? ? ? ? ? "? ? ? ? \"twitter_alias\" : {}\n" +
? ? ? ? ? ? ? ? "? ? }\n" +
? ? ? ? ? ? ? ? "}", XContentType.JSON);*/RestHighLevelClient esClient=RestClientConfig.restHighLevelClient();? ? ? ? CreateIndexResponse createIndexResponse=esClient.indices().create(createIndexRequest,RequestOptions.DEFAULT);? ? ? ? String name=createIndexResponse.index();? ? ? ? System.out.println("獲得創(chuàng)建的索引名稱 "+name);? ? ? ? RestClientConfig.close(esClient);returnResponseData.success();? ? }publicResponseDatacreateIndex()throwsIOException{? ? ? ? CreateIndexRequest createIndexRequest=newCreateIndexRequest();? ? ? ? createIndexRequest.index(ES_COLLECTION_NAME);//對于索引設(shè)置setting屬性createIndexRequest.settings(Settings.builder()//主分片的個數(shù).put("index.number_of_shards",3)//主分片的拷貝分片個數(shù).put("index.number_of_replicas",2)? ? ? ? );? ? ? ? Map message=newHashMap<>();? ? ? ? message.put("type","text");// message.put("analyzer","lowercase_analyzer");// message.put("index","analyzed");Map propertise=newHashMap<>();? ? ? ? propertise.put("message",message);? ? ? ? Map mapping=newHashMap<>();? ? ? ? mapping.put("propertise",propertise);? ? ? ? createIndexRequest.mapping(String.valueOf(mapping));//以下是通過source方法直接就可以設(shè)置? settings,mappings,aliases/*createIndexRequest.source("{\n" +
? ? ? ? ? ? ? ? "? ? \"settings\" : {\n" +
? ? ? ? ? ? ? ? "? ? ? ? \"number_of_shards\" : 1,\n" +
? ? ? ? ? ? ? ? "? ? ? ? \"number_of_replicas\" : 0\n" +
? ? ? ? ? ? ? ? "? ? },\n" +
? ? ? ? ? ? ? ? "? ? \"mappings\" : {\n" +
? ? ? ? ? ? ? ? "? ? ? ? \"properties\" : {\n" +
? ? ? ? ? ? ? ? "? ? ? ? ? ? \"message\" : { \"type\" : \"text\" }\n" +
? ? ? ? ? ? ? ? "? ? ? ? }\n" +
? ? ? ? ? ? ? ? "? ? },\n" +
? ? ? ? ? ? ? ? "? ? \"aliases\" : {\n" +
? ? ? ? ? ? ? ? "? ? ? ? \"twitter_alias\" : {}\n" +
? ? ? ? ? ? ? ? "? ? }\n" +
? ? ? ? ? ? ? ? "}", XContentType.JSON);*/RestHighLevelClient esClient=RestClientConfig.restHighLevelClient();//同步CreateIndexResponse createIndexResponse=esClient.indices().create(createIndexRequest,RequestOptions.DEFAULT);//獲取索引名稱String name=createIndexResponse.index();//插入一條數(shù)據(jù)Users user=newUsers();? ? ? ? user.setAge(10);? ? ? ? user.setName("han");? ? ? ? esClient.index(newIndexRequest(name).source(user, XContentType.JSON),RequestOptions.DEFAULT);//用完,之后一定養(yǎng)成關(guān)閉數(shù)據(jù)庫的好習(xí)慣。RestClientConfig.close(esClient);returnResponseData.success();? ? }
2? DeleteIndexRequest是刪除索引模板。
? ??timeout()設(shè)置超時時間。
? ? masterNodeTimeout()主節(jié)點超時時間。
publicResponseDatadeleteIndex()throwsIOException{? ? ? ? DeleteIndexRequest deleteIndexRequest=newDeleteIndexRequest(ES_COLLECTION_NAME);? ? ? ? RestHighLevelClient esClient= RestClientConfig.restHighLevelClient();? ? ? ? AcknowledgedResponse deleteIndexResponse=esClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);//用完,之后一定養(yǎng)成關(guān)閉數(shù)據(jù)庫的好習(xí)慣。RestClientConfig.close(esClient);returnResponseData.success(deleteIndexResponse);? ? }
3? ?GetIndexRequest判斷索引是否存在
public ResponseData existsIndex() throws IOException {
? ? ? ? GetIndexRequest getIndexRequest=new GetIndexRequest(ES_COLLECTION_NAME);
? ? ? ? RestHighLevelClient esClient=RestClientConfig.restHighLevelClient();
? ? ? ? Boolean flag=esClient.indices().exists(getIndexRequest,RequestOptions.DEFAULT);
? ? ? ? //用完,之后一定養(yǎng)成關(guān)閉數(shù)據(jù)庫的好習(xí)慣。
? ? ? ? RestClientConfig.close(esClient);
? ? ? ? return ResponseData.success(flag);
? ? }
第二類:是關(guān)于插入文本的API
1? IndexRequest 添加文本數(shù)據(jù)
publicResponseDatasaveDocument()throwsIOException{//連接數(shù)據(jù)庫RestHighLevelClient esClient=RestClientConfig.restHighLevelClient();? ? ? ? Map jsonMap=newHashMap(2);? ? ? ? jsonMap.put("name","han");? ? ? ? jsonMap.put("age","19");? ? ? ? jsonMap.put("sex","男");? ? ? ? jsonMap.put("numberId","11XXXXXXX1213x");? ? ? ? IndexRequest in=newIndexRequest(ES_COLLECTION_NAME).source(jsonMap, XContentType.JSON);? ? ? ? IndexResponse indexResponse=esClient.index(in, RequestOptions.DEFAULT);//用完,之后一定養(yǎng)成關(guān)閉數(shù)據(jù)庫的好習(xí)慣。RestClientConfig.close(esClient);returnResponseData.success(indexResponse);? ? }
2? ?BulkRequest? 批量插入
publicResponseDatabulkDocument()throwsIOException{//連接數(shù)據(jù)庫RestHighLevelClient esClient=RestClientConfig.restHighLevelClient();? ? ? ? BulkRequest bulkRequest=newBulkRequest();for(inti=0;i<6;i++){? ? ? ? ? ? Map jsonMap=newHashMap();? ? ? ? ? ? jsonMap.put("name","han*"+i);? ? ? ? ? ? jsonMap.put("age","19*"+i);? ? ? ? ? ? jsonMap.put("sex","男*"+i);? ? ? ? ? ? jsonMap.put("numberId","11XXXXXXX1213*"+i);? ? ? ? ? ? bulkRequest.add(newIndexRequest(ES_COLLECTION_NAME).source(jsonMap,XContentType.JSON));? ? ? ? }? ? ? ? BulkResponse bulkResponse=esClient.bulk(bulkRequest,RequestOptions.DEFAULT);//用完,之后一定養(yǎng)成關(guān)閉數(shù)據(jù)庫的好習(xí)慣。RestClientConfig.close(esClient);returnResponseData.success(bulkResponse);? ? }
2.1? 批量操作
publicResponseDatabulkCustomDocument()throwsIOException{//連接數(shù)據(jù)庫RestHighLevelClient esClient=RestClientConfig.restHighLevelClient();? ? ? ? BulkRequest bulkRequest=newBulkRequest();//修改指定數(shù)據(jù)Map jsonMap=newHashMap<>(5);? ? ? ? jsonMap.put("name","bulkCustomDocument方法的測試");? ? ? ? jsonMap.put("age","18測試");? ? ? ? jsonMap.put("sex","男測試");? ? ? ? jsonMap.put("numberId","1502222XXXXX2");? ? ? ? UpdateRequest updateRequest=newUpdateRequest(ES_COLLECTION_NAME,"Un0QDHUB_jnDNOQPxN3B");? ? ? ? updateRequest.doc(jsonMap);? ? ? ? bulkRequest.add(updateRequest);//刪除指定數(shù)據(jù)DeleteRequest deleteRequest=newDeleteRequest(ES_COLLECTION_NAME,"U30QDHUB_jnDNOQPxN3B");? ? ? ? bulkRequest.add(deleteRequest);? ? ? ? BulkResponse bulkResponse=esClient.bulk(bulkRequest,RequestOptions.DEFAULT);//用完,之后一定養(yǎng)成關(guān)閉數(shù)據(jù)庫的好習(xí)慣。RestClientConfig.close(esClient);returnResponseData.success(bulkResponse);? ? }
3 UpdateRequest? 修改操作
? public ResponseData updateDocument() throws IOException {
? ? ? ? //連接數(shù)據(jù)庫
? ? ? ? RestHighLevelClient esClient=RestClientConfig.restHighLevelClient();
? ? ? ? //修改數(shù)據(jù)
? ? ? ? Map<String,Object> jsonMap=new HashMap(5);
? ? ? ? jsonMap.put("name","qiaa測試");
? ? ? ? jsonMap.put("age","20測試");
? ? ? ? jsonMap.put("sex","女測試");
? ? ? ? jsonMap.put("numberId","111222XXXXX2");
? ? ? ? UpdateRequest updateRequest=new UpdateRequest(ES_COLLECTION_NAME,"QX0ODHUB_jnDNOQP9t0P");
? ? ? ? updateRequest.doc(jsonMap);
? ? ? ? UpdateResponse updateResponse =esClient.update(updateRequest,RequestOptions.DEFAULT);
? ? ? ? //用完,之后一定養(yǎng)成關(guān)閉數(shù)據(jù)庫的好習(xí)慣。
? ? ? ? RestClientConfig.close(esClient);
? ? ? ? return ResponseData.success(updateResponse);
? ? }
4 DeleteRequest 刪除操作
publicResponseDatadeleteDocument()throwsIOException{//連接數(shù)據(jù)庫RestHighLevelClient esClient=RestClientConfig.restHighLevelClient();? ? ? ? DeleteRequest deleteRequest=newDeleteRequest(ES_COLLECTION_NAME,"OJuOv3QBEFBKZIVoeLzv");? ? ? ? DeleteResponse deleteResponse=esClient.delete(deleteRequest,RequestOptions.DEFAULT);//用完,之后一定養(yǎng)成關(guān)閉數(shù)據(jù)庫的好習(xí)慣。RestClientConfig.close(esClient);returnResponseData.success(deleteResponse);? ? }
5?GetRequest判斷是否存在
publicResponseDatagetDocument()throwsIOException{//連接數(shù)據(jù)庫RestHighLevelClient esClient=RestClientConfig.restHighLevelClient();? ? ? ? GetRequest getRequest=newGetRequest(ES_COLLECTION_NAME,"Un0QDHUB_jnDNOQPxN3B");//由于exists()僅返回true或false,因此我們建議您關(guān)閉提取功能_source和所有存儲的字段,這樣請求的內(nèi)容會稍微減輕一些getRequest.fetchSourceContext(newFetchSourceContext(false));//禁用獲取存儲的字段。getRequest.storedFields("_none_");? ? ? ? GetResponse getResponse=esClient.get(getRequest,RequestOptions.DEFAULT);//用完,之后一定養(yǎng)成關(guān)閉數(shù)據(jù)庫的好習(xí)慣。RestClientConfig.close(esClient);returnResponseData.success(getResponse);? ? }
第三類:是關(guān)于搜索文本的API
1 SearchRequest 查詢?nèi)繑?shù)據(jù)
publicResponseDatasearchAll()throwsIOException{? ? ? ? RestHighLevelClient esClient= RestClientConfig.restHighLevelClient();? ? ? ? SearchRequest searchRequest=newSearchRequest(ES_COLLECTION_NAME);? ? ? ? SearchSourceBuilder searchSourceBuilder=newSearchSourceBuilder();? ? ? ? searchSourceBuilder.query(QueryBuilders.matchAllQuery());? ? ? ? searchRequest.source(searchSourceBuilder);? ? ? ? SearchResponse searchResponse=esClient.search(searchRequest, RequestOptions.DEFAULT);//關(guān)閉連接RestClientConfig.close(esClient);returnResponseData.success(searchResponse);? ? }
2 多條件查詢
publicResponseDatamanySearch()throwsIOException{? ? ? ? RestHighLevelClient esClient=RestClientConfig.restHighLevelClient();? ? ? ? MultiSearchRequest multiSearchRequest=newMultiSearchRequest();? ? ? ? SearchRequest first=newSearchRequest(ES_COLLECTION_NAME);? ? ? ? SearchSourceBuilder searchSourceBuilder=newSearchSourceBuilder();? ? ? ? searchSourceBuilder.query(QueryBuilders.matchQuery("sex","女測試"));? ? ? ? first.source(searchSourceBuilder);? ? ? ? multiSearchRequest.add(first);? ? ? ? SearchRequest two=newSearchRequest(ES_COLLECTION_NAME);? ? ? ? SearchSourceBuilder searchSourceBuilder1=newSearchSourceBuilder();? ? ? ? searchSourceBuilder1.query(QueryBuilders.matchQuery("age","20"));? ? ? ? two.source(searchSourceBuilder1);? ? ? ? multiSearchRequest.add(two);? ? ? ? MultiSearchResponse searchResponse=esClient.msearch(multiSearchRequest,RequestOptions.DEFAULT);//關(guān)閉連接RestClientConfig.close(esClient);returnResponseData.success(searchResponse);? ? }
3 CountRequest 計數(shù)查詢
publicResponseDatacountSearch()throwsIOException{? ? ? ? RestHighLevelClient esClient=RestClientConfig.restHighLevelClient();? ? ? ? CountRequest countRequest=newCountRequest(ES_COLLECTION_NAME);? ? ? ? SearchSourceBuilder searchSourceBuilder=newSearchSourceBuilder();? ? ? ? searchSourceBuilder.query(QueryBuilders.matchAllQuery());? ? ? ? countRequest.source(searchSourceBuilder);? ? ? ? CountResponse countResponse=esClient.count(countRequest,RequestOptions.DEFAULT);//關(guān)閉連接RestClientConfig.close(esClient);returnResponseData.success(countResponse);? ? }
這是一個公共方法連接和關(guān)閉es?
@Configuration
@Slf4j
public class RestClientConfig {
? ? public static RestHighLevelClient restHighLevelClient(){
? ? ? ? RestHighLevelClient client=new RestHighLevelClient(
? ? ? ? ? ? ? ? RestClient.builder(new HttpHost("127.0.0.1",9200,"http")));
? ? ? ? //如果是集群
//? ? ? ? RestHighLevelClient client = new RestHighLevelClient(
//? ? ? ? ? ? ? ? RestClient.builder(new HttpHost("127.0.0.1", 9200, "http")
//? ? ? ? ? ? ? ? ? ? ? ? , new HttpHost("127.0.0.1", 9201, "http")
//? ? ? ? ? ? ? ? ? ? ? ? , new HttpHost("127.0.0.1", 9202, "http")));
? ? ? ? return client;
? ? }
? ? /**
? ? * 關(guān)閉es連接
? ? * @param client es客戶端
? ? * @throws IOException io異常
? ? */
? ? public static void close(RestHighLevelClient client) {
? ? ? ? try {
? ? ? ? ? ? client.close();
? ? ? ? } catch (IOException e) {
? ? ? ? ? ? log.error("關(guān)閉es連接失?。?,e);
? ? ? ? }
? ? }