Elasticsearch 2.3.1


学习文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

下载地址:https://www.elastic.co/downloads/past-releases/elasticsearch-2-3-1


安装head插件,在网页上管理、监视集群的状态。bin目录下plugin install mobz/elasticsearch-head

 访问地址:http://localhost:9200/_plugin/head/





创建索引(Indices)

curl -XPOST localhost:9200/test -d '{
  "settings":{
      "number_of_shards":3,
      "number_of_replicas":2
  },
  "mappings":{    
       "user":{  
          "properties":{  
             "ID":{  
                "type":"string",  
                "index":"not_analyzed"   
             },              
             "NAME":{
                "type":"string",
                "fields":{
                    "NAME":{
                        "type":"string"
                    },
                    "raw":{
                        "type":"string",
                        "index":"not_analyzed"    
                    }
                }                    
             }                       
          }  
       }   
}
}'




删除api 以根据特定的ID删除文档

curl -XDELETE 'http://localhost:9200/test/user/1'

//增加单条索引 这里的100对应于_id字段
curl -XPUT 'http://localhost:9200/test/user/100' -d '{
    "id" : 1,
    "name" : "yuanhai",
    "age" : "30"
}'


用自定义的Routing模式, 不需要向所有分片发送请求,会大大减少系统资源的浪费。

1.直接在请求的URL中指定routing参数:
    curl -XPOST 'http://localhost:9200/test/student?routing=good' -d '  
    {  
        "ID": "1",  
        "NAME": "yuanhai"  
    }'  
    
2.第二种方法就是直接从文档中提取到对应的路由值:(/_mapping相当于?op_type=mapping)

curl -XPUT 'http://localhost:9200/store/order/_mapping' -d '  
{  
    "order": {  
        "_routing": {  
            "required": true,  
            "path": "customerID"  
        }  
    }  
}'



以上文件是说我们对于student这个索引类型,定义了它的mapping。重点是将NAME这个字段映射为两个,一个是需要做索引分析的NAME,另一个是不分析的raw,即不会拆分new york这种词组。这样我们在做搜索的时候,就可以对NAME.raw这个字段做term aggregation,获得所有城市出现的次数了。



java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW     jackson  2.4.0
java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/filter/TokenFilter     jackson  2.6.2



java代码:

package com.jikexueyuancrm.test;

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.concurrent.ExecutionException;

import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.Requests;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms.Bucket;
import org.junit.Before;
import org.junit.Test;

import com.jikexueyuancrm.entity.User;

public class ElasticSearch2_3_1 {
	
	
	 private Client client;

	 //初始化客户端
	 
	 
	 @Before
	public void init() {
	        try {
				client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9300));
			} catch (UnknownHostException e) {
				
				e.printStackTrace();
			}
	    }
	
	
	 @Test
	// 创建索引
	    public void createIndex() {
	        client.admin().indices().prepareCreate("test").execute()
	                .actionGet();
	    }
	    
	 
	
	 
	 
	 @Test
	  // 定义索引的映射类型
	    public void defineIndexTypeMapping() {
	        try {
	            XContentBuilder mapBuilder = XContentFactory.jsonBuilder();
	            mapBuilder
	           .startObject()
	            .startObject("user")//对应于type
	                .startObject("properties")
	                    .startObject("id").field("type", "long").field("store", "yes").endObject()
	                    .startObject("name").field("type", "string").field("store", "yes").endObject()
	                    .startObject("age").field("type", "string").field("index", "not_analyzed").field("store", "yes").endObject()
	                .endObject()
	            .endObject()
	           .endObject();
	           
	            client.admin().indices().preparePutMapping("test").setType("user").setSource(mapBuilder).execute().actionGet();
	        } catch (IOException e) {
	           e.printStackTrace();
	        }
	    }

	 
	 
	 
	 
	 @Test
	 //单个文档创建索引
	 public void createIndexSingleDocument() {
		try {
			IndexResponse response = client
					.prepareIndex("test", "user", "30")
					.setSource(// 这里可以直接用json字符串
							XContentFactory.jsonBuilder().startObject()
									.field("id", 1).
									field("name", "yuanhai")
									.field("age", "30").endObject()).setTTL(8000).get();
			System.out.println("index:" + response.getIndex()
					+ " insert doc id:" + response.getId() + " result:"
					+ response.isCreated());
		} catch (IOException e) {
			e.printStackTrace();
		}
	 }
	 
	 
	 @Test
	 //更新修改文档,直接修改
	 
	 public void updateIndex(){
		 try {
			 UpdateRequest updateRequest = new UpdateRequest();
			 updateRequest.index("test");
			 updateRequest.type("user");
			 updateRequest.id("30");
			 updateRequest.doc(XContentFactory.jsonBuilder()
					 .startObject()
					 .field("age", "100000")
					 .endObject());
			 UpdateResponse updateResponse = client.update(updateRequest).get();
} catch (Exception e) {
	e.printStackTrace();
}
	 }
	 
	 
	 @Test
	 //如果文档不存在则插入,存在则修改。
	 
	 public void updateIndexOrInsert(){
		 try {

			IndexRequest indexRequest = new IndexRequest("test", "user", "30")
			.source(XContentFactory.jsonBuilder()
			    .startObject()
			       .field("id", 1).
				field("name", "yuanhai")
				.field("age", "30")
			    .endObject());
			UpdateRequest updateRequest = new UpdateRequest("test", "user", "500")//id以这个作为标准
			    .doc(XContentFactory.jsonBuilder()
			        .startObject()
			            .field("age", "120")
			        .endObject())
			    .upsert(indexRequest);              
			UpdateResponse updateResponse = client.update(updateRequest).get();
			System.out.println(updateResponse.isCreated());
			} catch (Exception e) {
				e.printStackTrace();
			}
	 }
	 
	 
	 
	 @Test
	  // 根据id=100删除某个文档
	    public void deleteIndexById(){
		 DeleteResponse dResponse=client.prepareDelete("test","user","100").get();
	 
		   System.out.println(dResponse.getId());
	  
	 }
	 
	 @Test
	  //删除所有索引,prepareDelete("test")传入可变参数,删除多个索引
	    public void deleteAllIndex(){
		 DeleteIndexResponse dResponse= client.admin().indices().prepareDelete("test").get();
	 
		   System.out.println(dResponse.isAcknowledged());
	  
	 }
	 
	 
	 //根据ID获取数据
	 @Test
	 public void getDocById(){
		 GetResponse response= client.prepareGet("test", "user", "400").get();
		    System.out.println(response.getSourceAsString());  
		    System.out.println(   response.getVersion());
		    System.out.println(   response.getIndex());
		    System.out.println(   response.getType());
		    System.out.println(  response.getId());
	 }
	 
	 
	 
	 //api跟lucence类似
	 //在2.x版本中,官方删除了FilterBuilder的所有查询条件,QueryBuilder代替
	 @Test
	 public void queryIndex(){
		    SearchRequestBuilder builder = client.prepareSearch("test").setTypes("user").setSearchType(SearchType.DEFAULT).setFrom(0).setSize(100);  
		    BoolQueryBuilder qb = QueryBuilders.boolQuery().must(new QueryStringQueryBuilder("yuanhai").field("name"))  
		        .should(new QueryStringQueryBuilder("太多").field("name"));  
		    builder.setQuery(qb);
		    SearchResponse response = builder.execute().actionGet();  
		    System.out.println(response);  
		    System.out.println(response.getHits().getTotalHits());  
	 }
	 
	 
	 @Test
	// 聚合查询类似于facet(facet已废弃)
		public void Aggregation() {
		 SearchResponse response = client.prepareSearch("test").setTypes("user")
	                .addAggregation(AggregationBuilders.terms("terms")
	                        .field("age")).execute().actionGet();
	        Terms terms = response.getAggregations().get("terms");
	        for(Bucket b:terms.getBuckets()){
	        	System.out.println("filedname:"+b.getKey()+"     docCount:"+b.getDocCount());
	        }
		}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值