详解spring中使用Elasticsearch的代码实现
在使用Elasticsearch之前,先给大家聊一点干货。
1. ES和solr都是作为全文搜索引擎出现的。都是基于Lucene的搜索服务器。
2. ES不是可靠的存储系统,不是数据库,它有丢数据的风险。
3. ES不是实时系统,数据写入成功只是translog成功(类似于MySQL的binlog),写入成功后立刻查询查不到是正常的。因为数据此刻可能还在内存里而不是进入存储引擎里。同理,删除一条数据后也不是马上消失。写入何时可查询?ES内部有一个后台线程,定时将内存中的一批数据写入到存储引擎,此后数据可见。默认后台线程一秒运行一次。该线程运行的越频繁,写入性能越低。运行的频率越低,写入的性能越高(不会无限高)。
4. 目前已知的单ES集群可以存储PB级别的数据,不过这个就非常费劲了。TB级别数据没压力。
5. 如果使用ES官方提供的jar包访问,需要JDK1.7及以上。
6. 使用对应的版本访问ESserver。如果ESserver端的版本是1.7,那么请使用ES1.7的client。如果ESserver是2.1,请使用2.1的client。
7. ES索引存在Linux服务器的文件系统之上(背后是文件系统,不是类似于HDFS的分布式文件系统)
8. ESJavaclient是线程安全的,全局构建一个即可满足读写需求,不要每次都创建ESclient。每次访问ES都构建新的esclient即会抛出次异常。
9. 非常不建议使用ES的动态识别和创建的机制,因为很多情况下这并非你所需要。推荐的做法是在写数据之前仔细的创建mapping。
10. 强烈不建议在ES中使用深分页。可能会导致集群不可用。
11. ES是静态分片,一旦分片数在创建索引时确定那么后继不能修改。
12. ES里提供了type,很多人以为type是物理表,一个type的数据是独立存储的;但是在ES内部并不是这样,type在ES内部仅仅是一个字段。所以在很多数据能分为独立index的情况下,不要放到一个index里用type去分。只有嵌套类和父子类的情况下使用type才是合理的。
13. ES并不提供原生的中文分词的能力。有第三方的中文分词的插件,比如ik等。Ik是个toy分词器,有严肃的分词需求的话,请在使用ES之前使用独立的分词器分好词后向ES写入。
14. ES中的index,首先会进行分片,每一个分片数据一般都会有自己的副本数据,ES分配分片的策略会保证同一个分片数据和自己的副本不会分配到同一个节点上。当集群中的某一节点宕机后,ES的master在ping该节点时通过一定的策略会发现该节点不存活;会开启ES的恢复过程
15. ES没有update的能力。所有的update都是标记删除老文档,然后重新insert一条新文档。
好了,回归正题。
首先:
增加我们的spring配置
其次:
编写我们的EsClientBuilder类初始化我们的ES参数
package***; importjava.net.InetAddress; importjava.net.UnknownHostException; importjava.util.HashMap; importjava.util.Map; importorg.elasticsearch.client.Client; importorg.elasticsearch.client.transport.TransportClient; importorg.elasticsearch.common.settings.Settings; importorg.elasticsearch.common.transport.InetSocketTransportAddress; publicclassEsClientBuilder{ privateStringclusterName; privateStringnodeIpInfo; privateTransportClientclient; publicClientinit(){ //设置集群的名字 Settingssettings=Settings.settingsBuilder() .put("client.transport.sniff",false) .put("cluster.name",clusterName) .build(); //创建集群client并添加集群节点地址 client=TransportClient.builder().settings(settings).build(); MapnodeMap=parseNodeIpInfo(); for(Map.Entry entry:nodeMap.entrySet()){ try{ client.addTransportAddress(newInetSocketTransportAddress(InetAddress.getByName(entry.getKey()),entry.getValue())); }catch(UnknownHostExceptione){ e.printStackTrace(); } } returnclient; } /** *解析节点IP信息,多个节点用逗号隔开,IP和端口用冒号隔开 * *@return */ privateMap parseNodeIpInfo(){ String[]nodeIpInfoArr=nodeIpInfo.split(","); Map map=newHashMap (nodeIpInfoArr.length); for(StringipInfo:nodeIpInfoArr){ String[]ipInfoArr=ipInfo.split(":"); map.put(ipInfoArr[0],Integer.parseInt(ipInfoArr[1])); } returnmap; } publicStringgetClusterName(){ returnclusterName; } publicvoidsetClusterName(StringclusterName){ this.clusterName=clusterName; } publicStringgetNodeIpInfo(){ returnnodeIpInfo; } publicvoidsetNodeIpInfo(StringnodeIpInfo){ this.nodeIpInfo=nodeIpInfo; } }
最后:
下面我们就可以写自己的service类了,此类就可以通过es的原生api来操作我们的es(这里我们展示的2.X版本的)
indexName相当于数据库名,typeName相当于表名
请参考EsServiceImpl.Java文件
package***; @Service("esService") publicclassEsServiceImpl{ @Autowired privateClientclient; /** *用docId获取document *@paramindexName *@paramtypeName *@paramdocId */ privatestaticvoidgetWithId(StringindexName,StringtypeName,StringdocId){ //getwithid GetResponsegResponse=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()); Mapresults=gResponse.getSource(); if(results!=null){ for(Stringkey:results.keySet()){ Objectfield=results.get(key); System.out.println(key); System.out.println(field); } } } privatestaticvoidindexWithBulk(Stringindex,Stringtype){ //指定索引名称,type名称和documentId(documentId可选,不设置则系统自动生成)创建document IndexRequestir1=newIndexRequest(); Stringsource1="{"+"\"user\":\"kimchy\","+"\"price\":\"6.3\","+"\"tid\":\"20001\","+"\"message\":\"Elasticsearch\""+"}"; ir1.index(index).type(type).id("100").source(source1); IndexRequestir2=newIndexRequest(); Stringsource2="{"+"\"user\":\"kimchy2\","+"\"price\":\"7.3\","+"\"tid\":\"20002\","+"\"message\":\"Elasticsearch\""+"}"; ir2.index(index).type(type).id("102").source(source2); IndexRequestir3=newIndexRequest(); Stringsource3="{"+"\"user\":\"kimchy3\","+"\"price\":\"8.3\","+"\"tid\":\"20003\","+"\"message\":\"Elasticsearch\""+"}"; ir3.index(index).type(type).id("103").source(source3); BulkResponseresponse=client.prepareBulk().add(ir1).add(ir2).add(ir3).execute().actionGet(); BulkItemResponse[]responses=response.getItems(); if(responses!=null&&responses.length>0){ for(BulkItemResponser:responses){ Stringi=r.getIndex(); Stringt=r.getType(); System.out.println(i+","+t); } } } privatestaticvoidsumCountSearch(StringindexName,StringtypeName, StringsumField,StringcountField,StringsearchField,StringsearchValue){ SumBuildersb=AggregationBuilders.sum("sumPrice").field(sumField); TermQueryBuildertb=QueryBuilders.termQuery(searchField,searchValue); SearchResponsesResponse=client.prepareSearch(indexName).setTypes(typeName).setQuery(tb).addAggregation(sb).execute().actionGet(); Map aggMap=sResponse.getAggregations().asMap(); if(aggMap!=null&&aggMap.size()>0){ for(Stringkey:aggMap.keySet()){ if("sumPrice".equals(key)){ Sums=(Sum)aggMap.get(key); System.out.println(key+","+s.getValue()); } elseif("countTid".equals(key)){ StatsBuilderc=(StatsBuilder)aggMap.get(key); System.out.println(key+","+c.toString()); } } } } privatestaticvoidupdateDoc(StringindexName,StringtypeName,Stringid)throwsIOException,InterruptedException,ExecutionException{ UpdateRequestupdateRequest=newUpdateRequest(); updateRequest.index(indexName); updateRequest.type(typeName); updateRequest.id(id); updateRequest.doc(jsonBuilder().startObject().field("gender","male").endObject()); UpdateResponseresp=client.update(updateRequest).get(); resp.getClass(); } privatestaticvoidscrollSearch(StringindexName,StringtypeName,String...ids){ IdsQueryBuilderqb=QueryBuilders.idsQuery().addIds(ids); SearchResponsesResponse=client.prepareSearch(indexName) .setTypes(typeName) .setSearchType(SearchType.SCAN) .setQuery(qb) .setScroll(newTimeValue(100)) .setSize(50) .execute() .actionGet(); inttShards=sResponse.getTotalShards(); longtimeCost=sResponse.getTookInMillis(); intsShards=sResponse.getSuccessfulShards(); System.out.println(tShards+","+timeCost+","+sShards); while(true){ SearchHitshits=sResponse.getHits(); SearchHit[]hitArray=hits.getHits(); for(inti=0;i fields=hit.getSource(); for(Stringkey:fields.keySet()){ System.out.println(key); System.out.println(fields.get(key)); } } sResponse=client.prepareSearchScroll(sResponse.getScrollId()).setScroll(newTimeValue(100)).execute().actionGet(); if(sResponse.getHits().getHits().length==0){ break; } } } privatestaticvoiddeleteDocuments(Stringstring,Stringstring2){ SearchResponsesResponse=client.prepareSearch(string) .setTypes(string2) .setSearchType(SearchType.QUERY_THEN_FETCH) .setQuery(QueryBuilders.matchAllQuery()) .setFrom(0).setSize(60) .execute() .actionGet(); SearchHitshits=sResponse.getHits(); longcount=hits.getTotalHits(); SearchHit[]hitArray=hits.getHits(); List ids=newArrayList (hitArray.length); for(inti=0;i fields=hit.getSource(); for(Stringkey:fields.keySet()){ System.out.println(key); System.out.println(fields.get(key)); } } } privatestaticvoiddateRangeSearch2(StringindexName,StringtypeName, StringtermName,Stringfrom,Stringto){ //构建rangequery QueryBuilderqb=QueryBuilders.rangeQuery(termName).from(from).to(to); SearchResponsesResponse=client.prepareSearch(indexName) .setTypes(typeName) //设置searchtype //常用searchtype用: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(); inttShards=sResponse.getTotalShards(); longtimeCost=sResponse.getTookInMillis(); intsShards=sResponse.getSuccessfulShards(); System.out.println(tShards+","+timeCost+","+sShards); SearchHitshits=sResponse.getHits(); longcount=hits.getTotalHits(); SearchHit[]hitArray=hits.getHits(); for(inti=0;i fields=hit.getSource(); for(Stringkey:fields.keySet()){ System.out.println(key); System.out.println(fields.get(key)); } } } privatestaticvoidcountWithQuery(StringindexName,StringtypeName,StringtermName,StringtermValue,StringsortField,StringhighlightField){ //searchresultgetsource CountResponsecResponse=client.prepareCount(indexName) .setTypes(typeName) .setQuery(QueryBuilders.termQuery(termName,termValue)) .execute() .actionGet(); inttShards=cResponse.getTotalShards(); intsShards=cResponse.getSuccessfulShards(); System.out.println(tShards+","+sShards); longcount=cResponse.getCount(); } privatestaticvoidrangeSearchWithOtherSearch(StringindexName,StringtypeName, StringtermName,Stringmin,Stringmax,StringtermQueryField){ //构建rangequery QueryBuilderqb=QueryBuilders.rangeQuery(termName).from(min).to(max); TermQueryBuildertb=QueryBuilders.termQuery(termName,termQueryField); BoolQueryBuilderbq=boolQuery().must(qb).must(tb); SearchResponsesResponse=client.prepareSearch(indexName) .setTypes(typeName) //设置searchtype //常用searchtype用: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(); inttShards=sResponse.getTotalShards(); longtimeCost=sResponse.getTookInMillis(); intsShards=sResponse.getSuccessfulShards(); System.out.println(tShards+","+timeCost+","+sShards); SearchHitshits=sResponse.getHits(); longcount=hits.getTotalHits(); SearchHit[]hitArray=hits.getHits(); for(inti=0;i fields=hit.getSource(); for(Stringkey:fields.keySet()){ System.out.println(key); System.out.println(fields.get(key)); } } } privatestaticvoidtermRangeSearch(StringindexName,StringtypeName, StringtermName,Stringmin,Stringmax,StringhighlightField){ QueryBuilderqb=QueryBuilders.rangeQuery(termName).from(min).to(max); SearchResponsesResponse=client.prepareSearch(indexName) .setTypes(typeName) //设置searchtype //常用searchtype用: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(); inttShards=sResponse.getTotalShards(); longtimeCost=sResponse.getTookInMillis(); intsShards=sResponse.getSuccessfulShards(); System.out.println(tShards+","+timeCost+","+sShards); SearchHitshits=sResponse.getHits(); longcount=hits.getTotalHits(); SearchHit[]hitArray=hits.getHits(); for(inti=0;i fields=hit.getSource(); for(Stringkey:fields.keySet()){ System.out.println(key); System.out.println(fields.get(key)); } } } privatestaticvoidsumOneField(StringindexName,StringtypeName,StringfieldName){ SumBuildersb=AggregationBuilders.sum("sum").field(fieldName); //searchresultgetsource SearchResponsesResponse=client.prepareSearch(indexName).setTypes(typeName).addAggregation(sb).execute().actionGet(); Map aggMap=sResponse.getAggregations().asMap(); if(aggMap!=null&&aggMap.size()>0){ for(Stringkey:aggMap.keySet()){ Sums=(Sum)aggMap.get(key); System.out.println(s.getValue()); } } } privatestaticvoidsearchWithTermQueryAndRetureSpecifiedFields(StringindexName,StringtypeName,StringtermName,StringtermValue,StringsortField,StringhighlightField,String...fields){ SearchRequestBuildersb=client.prepareSearch(indexName) .setTypes(typeName) //设置searchtype //常用searchtype用: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(Stringfield:fields){ sb.addField(field); } SearchResponsesResponse=sb.execute().actionGet(); SearchHitshits=sResponse.getHits(); longcount=hits.getTotalHits(); SearchHit[]hitArray=hits.getHits(); for(inti=0;i fm=hit.getFields(); for(Stringkey:fm.keySet()){ SearchHitFieldf=fm.get(key); System.out.println(f.getName()); System.out.println(f.getValue()); } } } privatestaticvoidsearchWithIds(StringindexName,StringtypeName,StringsortField,StringhighlightField,String...ids){ IdsQueryBuilderqb=QueryBuilders.idsQuery().addIds(ids); SearchResponsesResponse=client.prepareSearch(indexName) .setTypes(typeName) //设置searchtype //常用searchtype用: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(); inttShards=sResponse.getTotalShards(); longtimeCost=sResponse.getTookInMillis(); intsShards=sResponse.getSuccessfulShards(); System.out.println(tShards+","+timeCost+","+sShards); SearchHitshits=sResponse.getHits(); longcount=hits.getTotalHits(); SearchHit[]hitArray=hits.getHits(); for(inti=0;i fields=hit.getSource(); for(Stringkey:fields.keySet()){ System.out.println(key); System.out.println(fields.get(key)); } } } /** *在index:indexName,type:typeName中做通配符查询 *@paramindexName *@paramtypeName *@paramtermName *@paramtermValue *@paramsortField *@paramhighlightField */ privatestaticvoidwildcardSearch(StringindexName,StringtypeName,StringtermName,StringtermValue,StringsortField,StringhighlightField){ QueryBuilderqb=QueryBuilders.wildcardQuery(termName,termValue); SearchResponsesResponse=client.prepareSearch(indexName) .setTypes(typeName) //设置searchtype //常用searchtype用: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(); inttShards=sResponse.getTotalShards(); longtimeCost=sResponse.getTookInMillis(); intsShards=sResponse.getSuccessfulShards(); System.out.println(tShards+","+timeCost+","+sShards); SearchHitshits=sResponse.getHits(); longcount=hits.getTotalHits(); SearchHit[]hitArray=hits.getHits(); for(inti=0;i fields=hit.getSource(); for(Stringkey:fields.keySet()){ System.out.println(key); System.out.println(fields.get(key)); } } } /** *在index:indexName,type:typeName中做模糊查询 *@paramindexName *@paramtypeName *@paramtermName *@paramtermValue *@paramsortField *@paramhighlightField */ privatestaticvoidfuzzySearch(StringindexName,StringtypeName,StringtermName,StringtermValue,StringsortField,StringhighlightField){ QueryBuilderqb=QueryBuilders.fuzzyQuery(termName,termValue); SearchResponsesResponse=client.prepareSearch(indexName) .setTypes(typeName) //设置searchtype //常用searchtype用: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(); inttShards=sResponse.getTotalShards(); longtimeCost=sResponse.getTookInMillis(); intsShards=sResponse.getSuccessfulShards(); System.out.println(tShards+","+timeCost+","+sShards); SearchHitshits=sResponse.getHits(); longcount=hits.getTotalHits(); SearchHit[]hitArray=hits.getHits(); for(inti=0;i fields=hit.getSource(); for(Stringkey:fields.keySet()){ System.out.println(key); System.out.println(fields.get(key)); } } } /** *在index:indexName,type:typeName中做区间查询 *@paramindexName *@paramtypeName *@paramtermName *@parammin *@parammax *@paramhighlightField */ privatestaticvoidnumericRangeSearch(StringindexName,StringtypeName, StringtermName,doublemin,doublemax,StringhighlightField){ //构建rangequery QueryBuilderqb=QueryBuilders.rangeQuery(termName).from(min).to(max); SearchResponsesResponse=client.prepareSearch(indexName) .setTypes(typeName) //设置searchtype //常用searchtype用: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(); inttShards=sResponse.getTotalShards(); longtimeCost=sResponse.getTookInMillis(); intsShards=sResponse.getSuccessfulShards(); System.out.println(tShards+","+timeCost+","+sShards); SearchHitshits=sResponse.getHits(); longcount=hits.getTotalHits(); SearchHit[]hitArray=hits.getHits(); for(inti=0;i fields=hit.getSource(); for(Stringkey:fields.keySet()){ System.out.println(key); System.out.println(fields.get(key)); } } } /** *在索引indexName,type为typeName中查找两个term:term1(termName1,termValue1)和term2(termName2,termValue2) *@paramindexName *@paramtypeName *@paramtermName1 *@paramtermValue1 *@paramtermName2 *@paramtermValue2 *@paramsortField *@paramhighlightField */ privatestaticvoidsearchWithBooleanQuery(StringindexName,StringtypeName,StringtermName1,StringtermValue1, StringtermName2,StringtermValue2,StringsortField,StringhighlightField){ //构建booleanquery BoolQueryBuilderbq=boolQuery().must(termQuery(termName1,termValue1)).must(termQuery(termName2,termValue2)); SearchResponsesResponse=client.prepareSearch(indexName) .setTypes(typeName) //设置searchtype //常用searchtype用: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(); inttShards=sResponse.getTotalShards(); longtimeCost=sResponse.getTookInMillis(); intsShards=sResponse.getSuccessfulShards(); System.out.println(tShards+","+timeCost+","+sShards); SearchHitshits=sResponse.getHits(); longcount=hits.getTotalHits(); SearchHit[]hitArray=hits.getHits(); for(inti=0;i fields=hit.getSource(); for(Stringkey:fields.keySet()){ System.out.println(key); System.out.println(fields.get(key)); } } } /** *在索引indexName,type为typeName中查找term(termName,termValue) *@paramindexName *@paramtypeName *@paramtermName *@paramtermValue *@paramsortField *@paramhighlightField */ privatestaticvoidsearchWithTermQuery(StringindexName,StringtypeName,StringtermName,StringtermValue,StringsortField,StringhighlightField){ SearchResponsesResponse=client.prepareSearch(indexName) .setTypes(typeName) //设置searchtype //常用searchtype用: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(); inttShards=sResponse.getTotalShards(); longtimeCost=sResponse.getTookInMillis(); intsShards=sResponse.getSuccessfulShards(); SearchHitshits=sResponse.getHits(); longcount=hits.getTotalHits(); SearchHit[]hitArray=hits.getHits(); for(inti=0;i fields=hit.getSource(); for(Stringkey:fields.keySet()){ System.out.println(key); System.out.println(fields.get(key)); } } } /** *用java的map构建document */ privatestaticvoidindexWithMap(StringindexName,StringtypeName){ Map json=newHashMap (); //设置document的field json.put("user","kimchy2"); json.put("postDate",newDate()); json.put("price",6.4); json.put("message","Elasticsearch"); json.put("tid","10002"); json.put("endTime","2015-08-2509:00:00"); //指定索引名称,type名称和documentId(documentId可选,不设置则系统自动生成)创建document IndexResponseresponse=client.prepareIndex(indexName,typeName,"2").setSource(json).execute().actionGet(); //response中返回索引名称,type名称,doc的Id和版本信息 Stringindex=response.getIndex(); Stringtype=response.getType(); Stringid=response.getId(); longversion=response.getVersion(); booleancreated=response.isCreated(); System.out.println(index+","+type+","+id+","+version+","+created); } /** *用java字符串创建document */ privatestaticvoidindexWithStr(StringindexName,StringtypeName){ //手工构建json字符串 //该document包含user,postData和message三个field Stringjson="{"+"\"user\":\"kimchy\","+"\"postDate\":\"2013-01-30\","+"\"price\":\"6.3\","+"\"tid\":\"10001\","+"}"; //指定索引名称,type名称和documentId(documentId可选,不设置则系统自动生成)创建document IndexResponseresponse=client.prepareIndex(indexName,typeName,"1") .setSource(json) .execute() .actionGet(); //response中返回索引名称,type名称,doc的Id和版本信息 Stringindex=response.getIndex(); Stringtype=response.getType(); Stringid=response.getId(); longversion=response.getVersion(); booleancreated=response.isCreated(); System.out.println(index+","+type+","+id+","+version+","+created); } privatestaticvoiddeleteDocWithId(StringindexName,StringtypeName,StringdocId){ DeleteResponsedResponse=client.prepareDelete(indexName,typeName,docId).execute().actionGet(); Stringindex=dResponse.getIndex(); Stringtype=dResponse.getType(); Stringid=dResponse.getId(); longversion=dResponse.getVersion(); System.out.println(index+","+type+","+id+","+version); } /** *创建索引 *注意:在生产环节中通知es集群的owner去创建index *@paramclient *@paramindexName *@paramdocumentType *@throwsIOException */ privatestaticvoidcreateIndex(StringindexName,StringdocumentType)throwsIOException{ finalIndicesExistsResponseiRes=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(); XContentBuildermapping=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-ddHH: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(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。