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());
	        }
		}
}
时间: 2024-10-30 17:29:58

Elasticsearch 2.3.1的相关文章

使用Mongo Connector和Elasticsearch实现模糊匹配

[编者按]本篇博文作者Luke Lovett是MongoDB公司的Java工程师,他展示了Mongo Connector经过2年发展后的蜕变--完成连接器两端的同步更新.期间,Luke还展示如何通过Elasticsearch实现模糊匹配. 以下为译文: 介绍 假设你正在运行MongoDB.太好了,现在已经可以为基于数据库的所有查询进行精确匹配了.现在,设想你正要在你的应用中建立一个文本搜索功能,它必须去除拼写错误这个噪音,最终可能会得到一个相近的结果.为此,这个令人生畏的任务,你需要在Lucen

Fog Creek Software如何使用Elasticsearch使Kiln的搜索速度提升

作为一名开发者,我最有成就感的一项工作就是优化:使我的产品Kiln中的某些部分运行得更快.因为即便你的产品有着最好的特性,或者最吸引人的界面,如果它的速度慢到令人无法忍受,那它依然是毫无价值的.去年,我的团队得到一个机会,去优化Kiln中运行最慢的一部分,并且最终提高了它的速度,远比之前快得多. 本文描述的就是一个名为Elasticsearch的优秀工具如何帮助我们将Kiln的速度提高1000倍的过程. Kiln是一个源代码管理工具,它提供Mercurial及Git存储库的寄宿服务,并且包括代码

Elasticsearch中使用reiver-jdbc导入数据

  Elastisearch中提供了river模块来从其他数据源中获取数据,该项功能以插件的形式存在,目前已有的river插件包括: river pluginsedit 1. Supported by Elasticsearch CouchDB River Plugin RabbitMQ River Plugin Twitter River Plugin Wikipedia River Plugin 2. Supported by the community ActiveMQ River Plu

如何解决centos下root运行Elasticsearch异常

  如何解决centos下root运行Elasticsearch异常            在CentOS 6.5 上运行Elasticsearch 2.3,异常如下: ? 1 2 3 4 5 6 Exception in thread "main" java.lang.RuntimeException: don't run elasticsearch as root. at org.elasticsearch.bootstrap.Bootstrap.initializeNatives

青云QingCloud推出Elasticsearch全文搜索引擎服务

为了进一步满足用户对纯文本搜索,以及实时数据索引.搜索和分析的需求,企业级基础云服务商青云QingCloud(qingcloud.com)日前宣布正式推出Elasticsearch分布式全文搜索引擎服务.通过Elasticsearch服务,用户能够方便地创建和管理Elasticsearch集群,支持在线横向与纵向伸缩,且用户业务的连续性不会因此而中断.此外,QingCloud还提供了丰富的监控告警等服务来帮助用户更好地管理集群. 青云QingCloud Elasticsearch服务 Elast

如何同步TableStore数据到Elasticsearch

图书馆 图书馆Q是一家大型图书馆,图书馆藏书众多,纸质图书600多万册,电子图书7000多万册,总数有八千多万册,这些图书之前都是人工检索维护的,现在需要做一个系统来存储管理这些图书信息. 需求如下: 图书总量目前八千多万册,考虑到未来二十年的增长,需要系统能支持一亿的存储量. 图书信息很重要,不能接受丢失发生. 图书的名字和作者名字需要支持模糊搜索. 每本书的属性最多有一百多个,且不固定,不同类型的图书的属性列差异较大.且未来可能会新增属性列. 根据上面这些需求特点,要完成这个管理系统,需要两

Elasticsearch中的DocValues

Elasticsearch最近一段时间非常火,以致于背后的公司都改名为Elastic了,因为Elasticsearch已经不仅限于搜索,反而更多的用在大数据分析场景,所以在公司品牌上开始"去Search化".这得益于其强大的支持聚合分析的Query DSL,虽然这个DSL的语法有点复杂,但底层的技术确实牛B,分布式的快速分析引擎,Elasticsearch已经占有一席之地. 大家知道,搜索引擎的基本数据结构是反向索引,也就是为每个关键词建立了到文档的映射,然后所有的关键词是一个有序列表

ElasticSearch 集群监控

最近在做 ElasticSearch 的信息(集群和节点)监控,特此稍微整理下学到的东西.这篇文章主要介绍集群的监控. 要监控哪些 ElasticSearch metrics Elasticsearch 提供了大量的 Metric,可以帮助您检测到问题的迹象,在遇到节点不可用.out-of-memory.long garbage collection times 的时候采取相应措施.但是指标太多了,有时我们并不需要这么多,这就需要我们进行筛选. 集群健康 一个 Elasticsearch 集群至

Head插件——学习Elasticsearch的锋刃利器!

在学习Elasticsearch的过程中,必不可少需要通过一些工具查看es的运行状态以及数据.如果都是通过rest请求,未免太过麻烦,而且也不够人性化.此时,head可以完美的帮助你快速学习和使用es. Head插件可以实现基本信息的查看,rest请求的模拟,数据的检索等等. 安装 在网络畅通的情况下(需要能访问github),可以直接通过plugin进行安装.即在es的bin目录下运行: F:\software\elasticsearch-2.2.1\bin>plugin.bat instal

HBase数据同步到ElasticSearch的方案

ElasticSearch的River机制 ElasticSearch自身提供了一个River机制,用于同步数据. 这里可以找到官方目前推荐的River: http://www.elasticsearch.org/guide/en/elasticsearch/rivers/current/ 但是官方没有提供HBase的River. 其实ES的River非常简单,就是一个用户打包好的jar包,ES负责找到一个node,并启动这个River.如果node失效了,会自动找另外一个node来启动这个Ri