ElasticSearch入门:Index

之前进行了Es集群的搭建,这次总结下Es的IndexApi,这里主要会和Solr进行部分对比来描述,如果对Solr不熟悉的可以自行略过。

RESTFUl API####

Es采用REST FULL的Api,这让Es具有很好的可读性,调用一目了然,当然RESTFuL的API不建议用到生产环境,原因是这种API接口基本都是短链接,这样消耗比较大,最好使用的时候,用长连接的接口进行包装,这样每次查询都是基于长连接的请求,能很好的减小服务端的开销。

ES的索引和Solr索引的一点疑惑####

一个索引请求:

curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{ "user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "message" : "trying out Elasticsearch"}'

这是一个ES建索引的Http接口的请求。首先,我们能很好的理解这种RESTFUL的接口,PUT代表将数据put到ES上,后面的twitter是指索引的名字,和Solr中的Collection类似。tweet是一种数据结构的描述,一个索引可能有多个type,在一个索引中所有的type的并集为这个索引的Schema。这一点是Solr中所不具有的,因为Solr是采用严格的Schema格式去限制索引的,而Es中则比较松散。
上面请求返回:

{"_index":"twitter","_type":"tweet","_id":"1","_version":1,"created":true}

_index为索引名
_type为索引中type名称
_id为索引主键id,id是在最后指定的。如果不指定ID,ES会抛出错误,如果希望自动生成,那么需要将PUT替换为POST。如果在二级索引这种场景下,id可以和落地存储(Mongo、Mysql)中数据Id一致。
_version:为版本号,版本号标识数据的版本,因为Lucene的数据merge是在Segment合并的时候进行的,所以需要version保证不会检索到过期的数据。另一方面Version可以用来避免数据并发问题,对于版本号大于之前的数据可以增加,对于小于之前数据的version会抛出异常。
created为索引标识,标识是否成功。
此时我们看一下tweet的Mapping:

curl -XGET 'http://localhost:9200/twitter/_mapping/tweet?pretty=true'
{
  "twitter" : {
    "mappings" : {
      "tweet" : {
        "properties" : {
          "message" : {
            "type" : "string"
          },
          "post_date" : {
            "type" : "date",
            "format" : "dateOptionalTime"
          },
          "user" : {
            "type" : "string"
          }
        }
      }
    }
  }
}

此时的Mapping中我们能看到,有type,post_date和user,当然这不是绝对的,因为mapping在后面改变后会发生改变,我们重新索引下另一条doc:

curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{ "user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "message" : "trying out Elasticsearch","sex":"m"}'

我们再看下tweet的mapping:

curl -XGET 'http://localhost:9200/twitter/_mapping/tweet?pretty=true'
{
  "twitter" : {
    "mappings" : {
      "tweet" : {
        "properties" : {
          "message" : {
            "type" : "string"
          },
          "post_date" : {
            "type" : "date",
            "format" : "dateOptionalTime"
          },
          "user" : {
            "type" : "string"
          }
        }
      }
    }
  }
}

可以看见神奇的增加了一个sex列,惊讶~~~

这一点与Solr是完全不同的,Solr是基于配置的,Solr创建好Schema之后便不能再扩充,但是ES能够灵活的改变Schema,我个人认为这是优势也是劣势,优势在于可以灵活的变更,劣势是没有约束性,可以无限的进行改变,不容易维护。

其实看到这里,熟悉Solr的人总会有个疑问,Solr和ES都是基于Lucene的。但是ES是如何抽象出type这个概念的呢?

我们在同一个索引下再创建一个Type:

curl -XPUT 'http://localhost:9200/twitter/tweet1/1' -d '{ "user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "mobile":"13573333333"}'

这里我们创建了tweet1,同时改变了tweet1的索引结构,接下来我们看看存储结构:
Es的存储路径默认在es文件下的data目录,我们查看:data/elasticsearch/nodes/0/indices
发现一个twitter文件夹,那么这就证明不同的type是在一个索引下的,接下来我们任意选一个Shard查看:

Paste_Image.png

我们发现这和Lucene的索引结构没什么区别,那么Type应该是在索引内部抽抽象出来的。

我们接下来用Head看一下,索引结构到底是什么样的。


Paste_Image.png
Paste_Image.png

除了Head之外,也可以用luke,但是Luke更新很慢,需要自己编译。
看到这个视图,就一目了然了,整个索引在内部抽象出了一个type索引字段,整个index的Schema是左右的type的所有字段的并集。Solr的索引实际上相当于Es的index+一个type。

但是我感觉这种机制不能应用在生产环境上,用type划分索引会导致索引结构庞大会影响检索效率,最好能一个index只含有一个type最好。
这种自动创建索引Schema的机制,可以通过下面方式关闭:
Automatic index creation can be disabled by setting action.auto_create_index to falsein the config file of all nodes. Automatic mapping creation can be disabled by setting index.mapper.dynamic tofalse in the config files of all nodes (or on the specific index settings).

JAVA Index API####

ES对于Java提供了两种Client的接入:

  1. Node Client
  2. Transport Client

其中NodeClient思想是启动一个Node加入到现有的ES集群中,但是此Node不存储数据,不接收HTTP的请求,这样的好处是能够及时的发现集群中节点的状态变化,同时避免请求的转发(因为Client就是一个Node)。但是坏处是要求节点必须能加入到集群,所以必须在同一个局域网内。另一点是,Client Node的停起会对集群有干扰。、

而Transport Client的方式则是作为一个独立的Client对ES的集群进行请求,类似于SolrJ。但是这种模式不能很好的确定集群中的节点当前是否可用(不是节点宕机,有可能是在recover)。同时还可能引发二次跳转(目标是请求Node2,但是请求发到Node1上,需要从Node1跳转到Node2上)。

因为NodeClient在生产中不是很常用,所以学习下Transport Client:


import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 对ElasticSearch建立索引
 */
public class IndexDocumentClient {

    private Client client;

    private String indexName;

    private String indexType;

    public IndexDocumentClient(String host, int port){
        //client.transport.sniff配置目的是自动嗅探活跃的节点
        Settings setting = ImmutableSettings.settingsBuilder().put("client.transport.sniff",true).build();
        client = new TransportClient(setting).addTransportAddress(new InetSocketTransportAddress(host,port));

    }

    public void index(String indexName,String indexType){
        Map<String, Object> jsonMap = new HashMap<String, Object>();
        jsonMap.put("user","kimchy1");
        jsonMap.put("post_date",new Date());
        jsonMap.put("message","trying out Elasticsearch");
        jsonMap.put("mobile","13888888888");
        IndexResponse response = client.prepareIndex(indexName,indexType,"3").setSource(jsonMap).execute().actionGet();
        System.out.print(response.getId());
    }

    public static void main(String args[]){
        IndexDocumentClient client = new IndexDocumentClient("10.0.2.161",9300);
        client.index("twitter","tweet");
    }
}

这里的Source是一个重载方法,既可以使用Map还可以使用String(Json)。利用jsonBuilder也是一个比较好的方法。这样就可以用Client进行索引了,但是Client里面的机制还不清楚,但是这种Client和Server的实现总是很吸引人的,接下来再慢慢学习!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • Elasticsearch 架构以及源码概览 Elasticsearch是最近两年异军突起的一个兼有搜索引擎和No...
    meng_philip123阅读 4,316评论 1 36
  • 此文是关于elasticsearch in action书部分重点读书笔记。 Chapter 2 Diving i...
    shamumu阅读 2,494评论 0 1
  • 钢结构设计图纸
    firbest阅读 183评论 0 0
  • 这个季节 北朔迎来了初雪 我正载着一腔欣喜去迎接它 可它却化成了雨 我想它一定是哭过了 或许它是被雾霾熏的流泪 或...
    林荔阅读 159评论 0 0