本篇文章主要介紹了詳解spring中使用Elasticsearch的程式碼實現,具有一定的參考價值,有興趣的可以了解一下
在使用Elasticsearch之前,先給大家聊一點乾貨。
1. ES和solr都是作為全文搜尋引擎出現的。都是基於Lucene的搜尋伺服器。
2. ES不是可靠的儲存系統,不是資料庫,它有遺失資料的風險。
3. ES不是即時系統,資料寫入成功只是trans log成功(類似MySQL的bin log),寫入成功後立刻查詢查不到是正常的。因為資料此刻可能還在記憶體裡而不是進入儲存引擎。同理,刪除一條資料後也不是馬上消失。寫入何時可查詢? ES內部有一個後台線程,定時將記憶體中的一批資料寫入到儲存引擎,此後資料可見。預設後台執行緒一秒運行一次。該執行緒運行的越頻繁,寫入效能越低。運行的頻率越低,寫入的效能越高(不會無限高)。
4. 目前已知的單ES叢集可以儲存PB層級的數據,不過這個就非常費力了。 TB等級數據沒壓力。
5. 若使用ES官方提供的jar包訪問,則需要JDK1.7以上。
6. 使用對應的版本存取ES server。如果ES server端的版本是1.7,那麼請使用ES 1.7的client。如果ES server是2.1,請使用2.1的client。
7. ES索引存在Linux伺服器的檔案系統之上(背後是檔案系統,不是類似HDFS的分散式檔案系統)
date的能力。所有的update都是標記刪除舊文檔,然後重新insert一條新文檔。
首先:
##增加我們的spring配置
<bean id="client" factory-bean="esClientBuilder" factory-method="init" destroy-method="close"/> <bean id="esClientBuilder" class="com.***.EsClientBuilder"> <property name="clusterName" value="集群名称" /> <property name="nodeIpInfo" value="集群地址" /> </bean>
寫我們的EsClientBuilder類別初始化我們的ES參數
package ***; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.HashMap; import java.util.Map; import org.elasticsearch.client.Client; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; public class EsClientBuilder { private String clusterName; private String nodeIpInfo; private TransportClient client; public Client init(){ //设置集群的名字 Settings settings = Settings.settingsBuilder() .put("client.transport.sniff", false) .put("cluster.name", clusterName) .build(); //创建集群client并添加集群节点地址 client = TransportClient.builder().settings(settings).build(); Map<String, Integer> nodeMap = parseNodeIpInfo(); for (Map.Entry<String,Integer> entry : nodeMap.entrySet()){ try { client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(entry.getKey()), entry.getValue())); } catch (UnknownHostException e) { e.printStackTrace(); } } return client; } /** * 解析节点IP信息,多个节点用逗号隔开,IP和端口用冒号隔开 * * @return */ private Map<String, Integer> parseNodeIpInfo(){ String[] nodeIpInfoArr = nodeIpInfo.split(","); Map<String, Integer> map = new HashMap<String, Integer>(nodeIpInfoArr.length); for (String ipInfo : nodeIpInfoArr){ String[] ipInfoArr = ipInfo.split(":"); map.put(ipInfoArr[0], Integer.parseInt(ipInfoArr[1])); } return map; } public String getClusterName() { return clusterName; } public void setClusterName(String clusterName) { this.clusterName = clusterName; } public String getNodeIpInfo() { return nodeIpInfo; } public void setNodeIpInfo(String nodeIpInfo) { this.nodeIpInfo = nodeIpInfo; } }
下面我們就可以寫自己的service類別了,此類別就可以透過es的原生
來操作我們的es(這裡我們展示的2.X版本的)indexName相當於資料庫名,typeName相當於表名
#請參考EsServiceImpl.Java檔案
package ***; @Service("esService") public class EsServiceImpl{ @Autowired private Client client; /** * 用docId获取document * @param indexName * @param typeName * @param docId */ private static void getWithId(String indexName, String typeName, String docId) { //get with id GetResponse gResponse = client.prepareGet(indexName, typeName, docId).execute().actionGet(); System.out.println(gResponse.getIndex()); System.out.println(gResponse.getType()); System.out.println(gResponse.getVersion()); System.out.println(gResponse.isExists()); Map<String, Object> results = gResponse.getSource(); if(results != null) { for(String key : results.keySet()) { Object field = results.get(key); System.out.println(key); System.out.println(field); } } } private static void indexWithBulk(String index, String type) { //指定索引名称,type名称和documentId(documentId可选,不设置则系统自动生成)创建document IndexRequest ir1 = new IndexRequest(); String source1 = "{" + "\"user\":\"kimchy\"," + "\"price\":\"6.3\"," + "\"tid\":\"20001\"," + "\"message\":\"Elasticsearch\"" + "}"; ir1.index(index).type(type).id("100").source(source1); IndexRequest ir2 = new IndexRequest(); String source2 = "{" + "\"user\":\"kimchy2\"," + "\"price\":\"7.3\"," + "\"tid\":\"20002\"," + "\"message\":\"Elasticsearch\"" + "}"; ir2.index(index).type(type).id("102").source(source2); IndexRequest ir3 = new IndexRequest(); String source3 = "{" + "\"user\":\"kimchy3\"," + "\"price\":\"8.3\"," + "\"tid\":\"20003\"," + "\"message\":\"Elasticsearch\"" + "}"; ir3.index(index).type(type).id("103").source(source3); BulkResponse response = client.prepareBulk().add(ir1).add(ir2).add(ir3).execute().actionGet(); BulkItemResponse[] responses = response.getItems(); if(responses != null && responses.length > 0) { for(BulkItemResponse r : responses) { String i = r.getIndex(); String t = r.getType(); System.out.println(i+","+t); } } } private static void sumCountSearch(String indexName, String typeName, String sumField, String countField, String searchField, String searchValue) { SumBuilder sb = AggregationBuilders.sum("sumPrice").field(sumField); TermQueryBuilder tb = QueryBuilders.termQuery(searchField, searchValue); SearchResponse sResponse = client.prepareSearch(indexName).setTypes(typeName).setQuery(tb).addAggregation(sb).execute().actionGet(); Map<String, Aggregation> aggMap = sResponse.getAggregations().asMap(); if(aggMap != null && aggMap.size() > 0) { for(String key : aggMap.keySet()) { if("sumPrice".equals(key)) { Sum s = (Sum)aggMap.get(key); System.out.println(key + "," + s.getValue()); } else if("countTid".equals(key)) { StatsBuilder c = (StatsBuilder)aggMap.get(key); System.out.println(key + "," + c.toString()); } } } } private static void updateDoc(String indexName, String typeName, String id) throws IOException, InterruptedException, ExecutionException { UpdateRequest updateRequest = new UpdateRequest(); updateRequest.index(indexName); updateRequest.type(typeName); updateRequest.id(id); updateRequest.doc(jsonBuilder().startObject().field("gender", "male").endObject()); UpdateResponse resp = client.update(updateRequest).get(); resp.getClass(); } private static void scrollSearch(String indexName, String typeName, String... ids) { IdsQueryBuilder qb = QueryBuilders.idsQuery().addIds(ids); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) .setSearchType(SearchType.SCAN) .setQuery(qb) .setScroll(new TimeValue(100)) .setSize(50) .execute() .actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards+","+timeCost+","+sShards); while (true) { SearchHits hits = sResponse.getHits(); SearchHit[] hitArray = hits.getHits(); for(int i = 0; i < hitArray.length; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for(String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } sResponse = client.prepareSearchScroll(sResponse.getScrollId()).setScroll(new TimeValue(100)).execute().actionGet(); if (sResponse.getHits().getHits().length == 0) { break; } } } private static void deleteDocuments(String string, String string2) { SearchResponse sResponse = client.prepareSearch(string) .setTypes(string2) .setSearchType(SearchType.QUERY_THEN_FETCH) .setQuery(QueryBuilders.matchAllQuery()) .setFrom(0).setSize(60) .execute() .actionGet(); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); List<String> ids = new ArrayList<String>(hitArray.length); for(int i = 0; i < count; i++) { System.out.println("=================================="); SearchHit hit = hitArray[i]; ids.add(hit.getId()); } for(String id : ids) { DeleteResponse response = client.prepareDelete(string, string2, id).execute().actionGet(); } } private static void dateRangeSearch(String indexName, String typeName, String termName, String from, String to) { // 构建range query //2015-08-20 12:27:11 QueryBuilder qb = QueryBuilders.rangeQuery(termName).from(from).to(to); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) // 设置search type // 常用search type用:query_then_fetch // query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) // 查询的termName和termvalue .setQuery(qb) // 设置排序field .addSort(termName, SortOrder.DESC) // 设置分页 .setFrom(0).setSize(60).execute().actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards + "," + timeCost + "," + sShards); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for (int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for (String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } private static void dateRangeSearch2(String indexName, String typeName, String termName, String from, String to) { // 构建range query QueryBuilder qb = QueryBuilders.rangeQuery(termName).from(from).to(to); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) // 设置search type // 常用search type用:query_then_fetch // query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) // 查询的termName和termvalue .setQuery(qb) // 设置排序field .addSort(termName, SortOrder.DESC) // 设置分页 .setFrom(0).setSize(60).execute().actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards + "," + timeCost + "," + sShards); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for (int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for (String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } private static void countWithQuery(String indexName, String typeName, String termName, String termValue, String sortField, String highlightField) { //search result get source CountResponse cResponse = client.prepareCount(indexName) .setTypes(typeName) .setQuery(QueryBuilders.termQuery(termName, termValue)) .execute() .actionGet(); int tShards = cResponse.getTotalShards(); int sShards = cResponse.getSuccessfulShards(); System.out.println(tShards+","+sShards); long count = cResponse.getCount(); } private static void rangeSearchWithOtherSearch(String indexName, String typeName, String termName, String min, String max, String termQueryField) { // 构建range query QueryBuilder qb = QueryBuilders.rangeQuery(termName).from(min).to(max); TermQueryBuilder tb = QueryBuilders.termQuery(termName, termQueryField); BoolQueryBuilder bq = boolQuery().must(qb).must(tb); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) // 设置search type // 常用search type用:query_then_fetch // query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) // 查询的termName和termvalue .setQuery(bq) // 设置排序field .addSort(termName, SortOrder.DESC) // 设置分页 .setFrom(0).setSize(60).execute().actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards + "," + timeCost + "," + sShards); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for (int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for (String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } private static void termRangeSearch(String indexName, String typeName, String termName, String min, String max, String highlightField) { QueryBuilder qb = QueryBuilders.rangeQuery(termName).from(min).to(max); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) // 设置search type // 常用search type用:query_then_fetch // query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) // 查询的termName和termvalue .setQuery(qb) // 设置排序field .addSort(termName, SortOrder.DESC) //设置高亮field .addHighlightedField(highlightField) // 设置分页 .setFrom(0).setSize(60).execute().actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards + "," + timeCost + "," + sShards); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for (int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for (String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } private static void sumOneField(String indexName, String typeName, String fieldName) { SumBuilder sb = AggregationBuilders.sum("sum").field(fieldName); //search result get source SearchResponse sResponse = client.prepareSearch(indexName).setTypes(typeName).addAggregation(sb).execute().actionGet(); Map<String, Aggregation> aggMap = sResponse.getAggregations().asMap(); if(aggMap != null && aggMap.size() > 0) { for(String key : aggMap.keySet()) { Sum s = (Sum)aggMap.get(key); System.out.println(s.getValue()); } } } private static void searchWithTermQueryAndRetureSpecifiedFields(String indexName, String typeName, String termName,String termValue, String sortField, String highlightField,String... fields) { SearchRequestBuilder sb = client.prepareSearch(indexName) .setTypes(typeName) // 设置search type // 常用search type用:query_then_fetch // query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) // 查询的termName和termvalue .setQuery(QueryBuilders.termQuery(termName, termValue)) // 设置排序field .addSort(sortField, SortOrder.DESC) // 设置高亮field .addHighlightedField(highlightField) // 设置分页 .setFrom(0).setSize(60); for (String field : fields) { sb.addField(field); } SearchResponse sResponse = sb.execute().actionGet(); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for (int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, SearchHitField> fm = hit.getFields(); for (String key : fm.keySet()) { SearchHitField f = fm.get(key); System.out.println(f.getName()); System.out.println(f.getValue()); } } } private static void searchWithIds(String indexName, String typeName, String sortField, String highlightField, String... ids) { IdsQueryBuilder qb = QueryBuilders.idsQuery().addIds(ids); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) //设置search type //常用search type用:query_then_fetch //query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) //查询的termName和termvalue .setQuery(qb) //设置排序field .addSort(sortField, SortOrder.DESC) //设置高亮field .addHighlightedField(highlightField) //设置分页 .setFrom(0).setSize(60) .execute() .actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards+","+timeCost+","+sShards); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for(int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for(String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } /** * 在index:indexName, type:typeName中做通配符查询 * @param indexName * @param typeName * @param termName * @param termValue * @param sortField * @param highlightField */ private static void wildcardSearch(String indexName, String typeName, String termName, String termValue, String sortField, String highlightField) { QueryBuilder qb = QueryBuilders.wildcardQuery(termName, termValue); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) //设置search type //常用search type用:query_then_fetch //query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) //查询的termName和termvalue .setQuery(qb) //设置排序field // .addSort(sortField, SortOrder.DESC) //设置高亮field // .addHighlightedField(highlightField) //设置分页 .setFrom(0).setSize(60) .execute() .actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards+","+timeCost+","+sShards); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for(int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for(String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } /** * 在index:indexName, type:typeName中做模糊查询 * @param indexName * @param typeName * @param termName * @param termValue * @param sortField * @param highlightField */ private static void fuzzySearch(String indexName, String typeName, String termName, String termValue, String sortField, String highlightField) { QueryBuilder qb = QueryBuilders.fuzzyQuery(termName, termValue); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) //设置search type //常用search type用:query_then_fetch //query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) //查询的termName和termvalue .setQuery(qb) //设置排序field .addSort(sortField, SortOrder.DESC) //设置高亮field .addHighlightedField(highlightField) //设置分页 .setFrom(0).setSize(60) .execute() .actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards+","+timeCost+","+sShards); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for(int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for(String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } /** * 在index:indexName, type:typeName中做区间查询 * @param indexName * @param typeName * @param termName * @param min * @param max * @param highlightField */ private static void numericRangeSearch(String indexName, String typeName, String termName, double min, double max, String highlightField) { // 构建range query QueryBuilder qb = QueryBuilders.rangeQuery(termName).from(min).to(max); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) // 设置search type // 常用search type用:query_then_fetch // query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) // 查询的termName和termvalue .setQuery(qb) // 设置排序field .addSort(termName, SortOrder.DESC) //设置高亮field .addHighlightedField(highlightField) // 设置分页 .setFrom(0).setSize(60).execute().actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards + "," + timeCost + "," + sShards); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for (int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for (String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } /** * 在索引indexName, type为typeName中查找两个term:term1(termName1, termValue1)和term2(termName2, termValue2) * @param indexName * @param typeName * @param termName1 * @param termValue1 * @param termName2 * @param termValue2 * @param sortField * @param highlightField */ private static void searchWithBooleanQuery(String indexName, String typeName, String termName1, String termValue1, String termName2, String termValue2, String sortField, String highlightField) { //构建boolean query BoolQueryBuilder bq = boolQuery().must(termQuery(termName1, termValue1)).must(termQuery(termName2, termValue2)); SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) //设置search type //常用search type用:query_then_fetch //query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) //查询的termName和termvalue .setQuery(bq) //设置排序field .addSort(sortField, SortOrder.DESC) //设置高亮field .addHighlightedField(highlightField) //设置分页 .setFrom(0).setSize(60) .execute() .actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); System.out.println(tShards+","+timeCost+","+sShards); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for(int i = 0; i < count; i++) { SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for(String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } /** * 在索引indexName, type为typeName中查找term(termName, termValue) * @param indexName * @param typeName * @param termName * @param termValue * @param sortField * @param highlightField */ private static void searchWithTermQuery(String indexName, String typeName, String termName, String termValue, String sortField, String highlightField) { SearchResponse sResponse = client.prepareSearch(indexName) .setTypes(typeName) //设置search type //常用search type用:query_then_fetch //query_then_fetch是先查到相关结构,然后聚合不同node上的结果后排序 .setSearchType(SearchType.QUERY_THEN_FETCH) //查询的termName和termvalue .setQuery(QueryBuilders.termQuery(termName, termValue)) //设置排序field // .addSort(sortField, SortOrder.DESC) //设置高亮field // .addHighlightedField(highlightField) //设置分页 .setFrom(0).setSize(60) .execute() .actionGet(); int tShards = sResponse.getTotalShards(); long timeCost = sResponse.getTookInMillis(); int sShards = sResponse.getSuccessfulShards(); SearchHits hits = sResponse.getHits(); long count = hits.getTotalHits(); SearchHit[] hitArray = hits.getHits(); for(int i = 0; i < count; i++) { System.out.println("=================================="); SearchHit hit = hitArray[i]; Map<String, Object> fields = hit.getSource(); for(String key : fields.keySet()) { System.out.println(key); System.out.println(fields.get(key)); } } } /** * 用java的map构建document */ private static void indexWithMap(String indexName, String typeName) { Map<String, Object> json = new HashMap<String, Object>(); //设置document的field json.put("user","kimchy2"); json.put("postDate",new Date()); json.put("price",6.4); json.put("message","Elasticsearch"); json.put("tid","10002"); json.put("endTime","2015-08-25 09:00:00"); //指定索引名称,type名称和documentId(documentId可选,不设置则系统自动生成)创建document IndexResponse response = client.prepareIndex(indexName, typeName, "2").setSource(json).execute().actionGet(); //response中返回索引名称,type名称,doc的Id和版本信息 String index = response.getIndex(); String type = response.getType(); String id = response.getId(); long version = response.getVersion(); boolean created = response.isCreated(); System.out.println(index+","+type+","+id+","+version+","+created); } /** * 用java字符串创建document */ private static void indexWithStr(String indexName, String typeName) { //手工构建json字符串 //该document包含user, postData和message三个field String json = "{" + "\"user\":\"kimchy\"," + "\"postDate\":\"2013-01-30\"," + "\"price\":\"6.3\"," + "\"tid\":\"10001\"," + "}"; //指定索引名称,type名称和documentId(documentId可选,不设置则系统自动生成)创建document IndexResponse response = client.prepareIndex(indexName, typeName, "1") .setSource(json) .execute() .actionGet(); //response中返回索引名称,type名称,doc的Id和版本信息 String index = response.getIndex(); String type = response.getType(); String id = response.getId(); long version = response.getVersion(); boolean created = response.isCreated(); System.out.println(index+","+type+","+id+","+version+","+created); } private static void deleteDocWithId(String indexName, String typeName, String docId) { DeleteResponse dResponse = client.prepareDelete(indexName, typeName, docId).execute().actionGet(); String index = dResponse.getIndex(); String type = dResponse.getType(); String id = dResponse.getId(); long version = dResponse.getVersion(); System.out.println(index+","+type+","+id+","+version); } /** * 创建索引 * 注意:在生产环节中通知es集群的owner去创建index * @param client * @param indexName * @param documentType * @throws IOException */ private static void createIndex(String indexName, String documentType) throws IOException { final IndicesExistsResponse iRes = client.admin().indices().prepareExists(indexName).execute().actionGet(); if (iRes.isExists()) { client.admin().indices().prepareDelete(indexName).execute().actionGet(); } client.admin().indices().prepareCreate(indexName).setSettings(Settings.settingsBuilder().put("number_of_shards", 1).put("number_of_replicas", "0")).execute().actionGet(); XContentBuilder mapping = jsonBuilder() .startObject() .startObject(documentType) // .startObject("_routing").field("path","tid").field("required", "true").endObject() .startObject("_source").field("enabled", "true").endObject() .startObject("_all").field("enabled", "false").endObject() .startObject("properties") .startObject("user") .field("store", true) .field("type", "string") .field("index", "not_analyzed") .endObject() .startObject("message") .field("store", true) .field("type","string") .field("index", "analyzed") .field("analyzer", "standard") .endObject() .startObject("price") .field("store", true) .field("type", "float") .endObject() .startObject("nv1") .field("store", true) .field("type", "integer") .field("index", "no") .field("null_value", 0) .endObject() .startObject("nv2") .field("store", true) .field("type", "integer") .field("index", "not_analyzed") .field("null_value", 10) .endObject() .startObject("tid") .field("store", true) .field("type", "string") .field("index", "not_analyzed") .endObject() .startObject("endTime") .field("type", "date") .field("store", true) .field("index", "not_analyzed") .field("format", "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd'T'HH:mm:ss.SSSZ") .endObject() .startObject("date") .field("type", "date") .endObject() .endObject() .endObject() .endObject(); client.admin().indices() .preparePutMapping(indexName) .setType(documentType) .setSource(mapping) .execute().actionGet(); } }
【相關推薦】
#1.
詳解Spring框架註解的用法程式碼實例Java事務管理學習之Spring和Hibernate的程式碼詳解分享利用Spring Boot開發Restful程式的實例教學詳解spring mvc支援的七種回傳方式關於Spring基於Aspect 的增強實作實例詳解以上是詳解spring中使用Elasticsearch的實例教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!