记录生活
分类 Category : Diving Into ElasticSearch

Diving Into ElasticSearch(9)Parent-Child特性使用

<Category: Diving Into ElasticSearch> 发表评论

介绍下ElasticSearch里Parent-Child特性的使用。

//首先创建一系列新闻的索引,这里我们将hot类型作为parent-chid关系里面的parent。

curl -XPUT 'http://localhost:9200/news/hot/1'  -d '{    "uname" : "medcl",    "content" : "河南警方:“南阳老板遭逼供致残与狗同笼”纯属谎言"}'
curl -XPUT 'http://localhost:9200/news/hot/2'  -d '{    "uname" : "medcl",    "content" : "马英九打两岸牌反制绿营"}'
curl -XPUT 'http://localhost:9200/news/hot/3'  -d '{    "uname" : "medcl",    "content" : "专题:中共十七届六中全会公报"}'

阅读这篇文章的其余部分 »

本文来自: Diving Into ElasticSearch(9)Parent-Child特性使用

Diving Into ElasticSearch(8)Mapping&Schema

<Category: Diving Into ElasticSearch> 4 条评论

前面应该介绍过ES是Schema Free,但是Schema Free不是说没有Schema,和Solr一样,ElasticSearch也可以设置document的schema,ES里的名字叫Mapping,其实无非就是设置document包含哪些Field,然后对每一个Field个性化的设置索引类型,是否存储,以及设置索引分析器和查询使用的分析器,Es和Solr相比有一个我认为最好的特性:就是支持Object类型,你可以像操作对象一样对对象的某个属性进行索引和查询,简单演示如下:
阅读这篇文章的其余部分 »

本文来自: Diving Into ElasticSearch(8)Mapping&Schema

ElasticSearch插件发布:PartialUpdate

<Category: Diving Into ElasticSearch, 搜索> 发表评论

地址:https://github.com/medcl/ElasticSearch.PartialUpdate

是否碰到过因为需要修改索引中某个字段,而需要将整个索引文档进行重建,是不是很麻烦啊,昨天弄了个插件,就是方便索引文档局部更新的,使用说明如下:

1.先下载插件,解压到ES的plugin目录:

/plguin/es-partial-update/

2.试一把

先索引一个文档吧

curl -XDELETE http://localhost:9200/index/type1/1/
curl -XPOST http://localhost:9200/index/type1/1/ -d'{"name":"medcl","blog":"http://log.medcl.net"}'
 
{"ok":true,"_index":"index","_type":"type1","_id":"1","_version":1}

执行修改操作,添加一个字段,修改一个字段

curl -XPOST http://localhost:9200/index/type1/1/_update -d'{"name":"medcl?","time":"2011-1-1"}'
 
{"ok":true,"_index":"index","_type":"type1","_id":"1","_version":2}

看看修改之后的结果吧

curl -XGET http://localhost:9200/index/type1/1/
 
{"_index":"index","_type":"type1","_id":"1","_version":2, "_source" : {"time":"2011-1-1","name":"medcl?","blog":"http://log.medcl.net"}}

本文来自: ElasticSearch插件发布:PartialUpdate

[翻译]Diving Into ElasticSearch(7)模块配置介绍:cluster

<Category: Diving Into ElasticSearch> 发表评论

纯翻译:http://www..org/guide/reference/modules/cluster.html
貌似国内最近关注elasticsearch的人多了起来。
阅读这篇文章的其余部分 »

本文来自: [翻译]Diving Into ElasticSearch(7)模块配置介绍:cluster

Diving Into ElasticSearch (6) 配置文件elasticsearch.yml

<Category: Diving Into ElasticSearch> 发表评论

接前面那篇吧[5],ElasticSearch分布式架构要说清楚真不是那么容易,我那就从细节一点点的切入吧。

先看看配置文件吧:.yml

#gateway类型,表示持久化数据存放位置,默认local,推荐的方式,此外还有NFS、HDFS、S3
gateway.type : local
#集群名称,区分集群的唯一名称
cluster.name : 'TEST'
 
#索引文件存放目录
#path.data : '/var/elasticsearch/data'
#日志文件存放目录
#path.logs : '/var/elasticsearch/logs'
 
#网络配置
#network.tcp.keep_alive : true
#network.tcp.send_buffer_size : 8192
#network.tcp.receive_buffer_size : 8192
#gateway.recover_after_nodes : 1
#gateway.recover_after_time : 10s
#gateway.expected_nodes : 2
 
#自动发现相关配置
#discovery.zen.fd.connect_on_network_disconnect : true
#discovery.zen.initial_ping_timeout : 10s
#discovery.zen.fd.ping_interval : 2s
#discovery.zen.fd.ping_retries  : 10
 
#索引snapshot时间只对当gateway设置为NFS时有效
#index.gateway.snapshot_interval : 1s
#刷新时间间隔
#index.engine.robin.refresh_interval : -1
 
#默认索引碎片数
index.number_of_shards : 3
#默认索引副本数
index.number_of_replicas : 1
 
#默认索引合并因子
#index.merge.policy.merge_factor : 100
#index.merge.policy.min_merge_docs : 1000
#index.merge.policy.use_compound_file : true
#indices.memory.index_buffer_size : 5%
 
#Gateway相关配置
# Gateway Settings
#gateway:
#  recover_after_nodes: 1
#  recover_after_time: 5m
#  expected_nodes: 2
#提示:当集群期望节点达不到的时候,集群就会处于block,无法正常索引和查询,说明集群中某个节点未能正常启动,这正是我们期望的效果,block住,避免照成数据的不一致
 
#强制所有内存锁定,不要没事搞个swap什么的来影响性能
# Force all memory to be locked, forcing JVM to never swap
#  (make sure to set MIN and MAX mem to the same value)
#bootstrap:
#  mlockall: true
 
 
#当禁用multcast广播的时候,可以手动设置集群的节点ip
# Unicast Discovery (disable multicast)
#discovery:
#  zen:
#    multicast.enabled: false
#    unicast.hosts: ["host1", "host2"]

配置文件elasticsearch.yml的可配项比较多,并且修改之后需要重启服务才能生效。

本文来自: Diving Into ElasticSearch (6) 配置文件elasticsearch.yml

Diving Into ElasticSearch (5) 分布式架构

<Category: Diving Into ElasticSearch> 3 条评论

今天介绍下ElasticSearch的分布式架构,如果你熟悉cassandra、hadoop、mongodb,你会发现ElasticSearch里面有很多他们的影子,没错,ElasticSearch吸收了目前主流的分布式系统的很多特性,下面简单介绍一把。

之前翻译过一篇[译]搜索引擎与时间机器,里面介绍了下作者在设计ElasticSearch的一些想法,现在看起来还是记忆犹新,因为他的这种思路实在是非常新颖,比如ES里面的将数据分为工作数据和持久化数据两种:

工作数据就是正常的提供查询和索引的数据,这部分数据假定是瞬时的,并且是不可靠的,随时可能丢失的数据,而持久化数据则是可靠的,一致的数据,工作数据可以都放在内存中,这样可以保证非常好的性能,而持久化数据则专心保证数据的一致性就ok了,我们自动的分布式系统有CAP原则,通过对数据分离方式,我们很好的解决了C和A的问题,你可能会问,你内存中的数据如果不对了怎么办?不就会影响数据的一致性吗?一方面数据可以从持久化数据进行加载,另外ES节点间的数据会定时刷新和同步,最终确保数据的一致,就算万一机器都歇了,没关系,从持久化目录里面重新加载数据即可。

单前面说的那个还不算什么,如果不能很好的解决动态扩容的问题,那就不算是ElasticSearch了,在ElasticSearch里面,索引目录有如下两个概念:shard(碎片)、replica(副本)

碎片(shard)的意思很好理解,db可以有sharding,索引也可以做嘛,单个索引目录太大,GB级别的索引文件,你再继续往里塞数据,文件合并,优化,有过这种经验的人应该会明白这种痛苦,怎么办?拆呗(china?拆那?),一般的做法是按数据拆,自己按租户,按时间拆等等,很是麻烦,并且拆完了之后的事情也不少,跨目录查询怎么办?更新怎么办?接口要怎么变?这些在ElasticSearch里面都帮你想到了,对你而言,全是透明的,你操作的就是一个索引,你在创建索引的时候,根据索引的规模指定碎片的大小,其他的你就不用管了,至于它里面怎么实现数据的平均分配,其实很简单,就用了一个取模的算法,随机分配到各个碎片中,至于一致性哈希之类的,目前来说完全没有必要。

碎片可以解决单个索引太大的问题,但是凡任何事有利必有弊,索引碎片在实现上其实就分成了很多个索引目录,索引目录越多,对建索引的速度会有提示,尤其是多线程环境,因为我们建索引的时候单个索引目录肯定加锁,一旦涉及锁,势必要减慢速度,不过我多几个目录,不就可以并发执行了吗?是的,ES就是这么做的,但是前面说了,有利就有弊,索引搞得到处都是,ES查询起来就很费劲了,一般情况下,我们在没有使用Routing的情况下(后面再介绍routing),ES会同时多个线程去读取各个碎片的索引数据,然后再合并查询结果,另外在ES的分布式环境下,碎片如果分布在多台服务器上就要加上网络的开销,势必会影响查询速度了,在海量数据的前提下,这些其实都还好,并且ES支持多种查询方式(reflink:search type):

Query And Fetch:

Query Then Fetch:

Dfs, Query And Fetch:

Dfs, Query Then Fetch:

Count:

Scan:

根据不同的查询需求,选择合适的查询类型,会收到意想不到的效果。

--

先整体看看单ES节点的模块结构吧:

 

再看看一次索引操作

再看看一次查询请求

本文来自: Diving Into ElasticSearch (5) 分布式架构

Diving Into ElasticSearch (4) 安装配置

<Category: Diving Into ElasticSearch> 发表评论

系列文章拖了几天思路全无,哎,先来个基础的吧。。。【安装配置】

其实ElasticSearch安装没啥好说的,因为ElasticSearch完全是零配置和“拆箱即用”,这对第一次上手ElasticSearch人来说绝对是福音,对于熟悉了ElasticSearch的人来说也可以省却很多多余的操作,总之一个字:帅。

首先,当然是下载,地址如下:http://www..org/download/
打开网页你可以看到长长的发布的版本号(我应该是从Version 0.5开始我的ES之旅的),ES的版本更新很频繁,作者kimchy根据社区的反馈会不断添加新的feature,bugfix也是神速,在irc里面提出之后,基本上马上就会有修复,实在是给力啊。BTW,现在最新版本又到了0.17.4,前几天又发布了几个版本,修复了一些bug。
阅读这篇文章的其余部分 »

本文来自: Diving Into ElasticSearch (4) 安装配置

Diving Into ElasticSearch (3) 编写自定义分词插件

<Category: Diving Into ElasticSearch> 2 条评论

今天介绍下怎么样编写一个自己的分词插件,开始之前,先介绍下ES的项目结构:

2011-07-13_231544

分别介绍下吧:

.idea:IDEA的项目配置文件

bin:可执行脚本文件

config:配置文件

gradle:精简版的gradle

lib:里面主要放了sigar用来做资源监控

modules:ES主要模块在这里了

plugins:插件都放这里啦

plugins里面按类型分了好多目录,今天我们来看怎么自定义一个分词插件,所以放analysis目录里面。

我们先移植一个开源的IKAnalyzer到ES里面吧。

第一步,先在plugins下建立目录ik

完整路径如下:\plugins\analysis\ik

下面建立src目录和build目录、并建立文件build.gradle(内容从icu里面的build.gradle拷贝出来,然后做相应的调整,如下图所示)

2011-07-14_000407

第二步,新建目录src/main/java/org

第三步,在java下新建配置文件es-.properities,里面一行指定当前插件的入口类(实现ES插件接口的类),如下图所示

2011-07-14_001303

 

第四步,在.idea目录里面,找到modules.xml,将我们自定义的module添加到工程中,注意路径,完了之后,会发现plugin下面的ik目录会变粗,说明该目录已经成为了项目中的一个module了。

2011-07-14_002422

第五步,在.idea/modules目录里面新建插件的配置文件如plugin-analysis-ik.iml,内容有下图所示

2011-07-14_001513

第六步,右键点击项目,选择Open Module Setting

应该会看到ik的模块配置,选中,然后分别设置目录的属性(有排除、源代码、测试三种),设置好之后如下图所示

2011-07-14_000744

第七步,在.idea/modules/里面的elasticsearch-root.iml加上一句,将我们的自定义module添加进去,如下图所示

2011-07-14_002023

最后一步,在elasticsearch根目录的setting.gradle文件里,添加一行来打包ik,如下图所示

2011-07-14_002946

配置的工作基本上到此结束,接着就是实现自己的AnalyzerProvider和AbstractPlugin了,具体代码可以看这里https://github.com/medcl/elasticsearch/commit/21abad12a0096173e8836dd042ca403751ab7ad1,就不一一列举了。

开始试验一下吧,默认bootstrap模式会加载所有插件,所有可以直接使用ik-analysis的插件。

curl –XGET http://localhost:9200/index/_analyze?text=%e8%84%91%e6%ae%8b%e7%89%87%e8%ae%a9%e4%bd%a0%e8%84%91%e6%ae%8b%ef%bc%8c%e7%a5%9e%e5%a5%87%e7%9a%84%e5%b0%8f%e8%8d%af%e4%b8%b8%e5%95%8a&analyzer=ik

通过服务端的日志,可以看到正确加载词库了。

2011-07-14_004324

刚刚分词的结果页出来了,ik正确加载了我自定义的词组“脑残片”,分词的结果也是正确的

2011-07-14_004615

本文来自: Diving Into ElasticSearch (3) 编写自定义分词插件

Diving Into ElasticSearch (2) 开发环境搭建

<Category: Diving Into ElasticSearch> 2 条评论

今天介绍下ElasticSearch开发环境的搭建,ElasticSearch本身就已经够强大了,基本上满足各种要求,但是在中文分词方面,自带的几个分词器还是捉襟见肘,但是,不要急,ElasticSearch系统提供了很灵活的插件机制,你可以很方便的编写自定义的插件(ES自带很多功能也同样是以插件的方式来提供的,如Transport插件、River插件等),好,首先咱们第一步就是搭建好开发环境。

阅读这篇文章的其余部分 »

本文来自: Diving Into ElasticSearch (2) 开发环境搭建

Diving Into ElasticSearch (1) 序

<Category: Diving Into ElasticSearch, 搜索> 4 条评论

You know,For Search~

打算写一系列的关于ElasticSearch的文章,一部分内容来自翻译,一部分来自自己的使用心得和调试过程。
一方面可以系统的整理下相关东西,另外也方便自己快速查找。

希望通过这些文章可以让更多的人来了解ElasticSearch。

Allright,先简单介绍下ElasticSearch吧,ElasticSearch的作者是Shay Banon (kimchy是同一个人哦),另一开源搜索项目Compass的作者,用过compass的人应该都知道,compass能够方便的为ORM框架添加搜索功能(即OSEM),简单配置即可,但是正因为使用简单,反而缺少了灵活性(和Hibernate.Search一样,同样折腾过),另外kimchy以前还是GigaSpaces的分布式专家,在Compass3.0的开发和思考中,作者加入了更多的分布式方面的元素,到最后,作者的开发重心基本上全部转到ElasticSearch上来,于是早期的ElasticSearch除了继承了很多Compass的特性之外还有大量的新的特性,比如就有如下一些显著特性(也是刚开始最吸引我的地方):Json数据格式、RESTful访问接口,Shard+Replica、Auto-Discovery、Zero-Config等,想知道ElasticSearch诞生的前因后果,可以看看作者的这篇博文:http://www.kimchy.org/the_future_of_compass/,总之ElasticSearch就这样诞生了。

相关链接:

ElasticSearch:http://www.elasticsearch.org/

源码Host在Github上:http://github.com/elasticsearch

#elasticsearch @ Freenode

@elasticsearch @Twitter

Google Group http://groups.google.com/a/elasticsearch.com

 

核心特性:

Schema Free & Document Oriented:灵活,

Schema Mapping:精确控制

Multi Tenancy:租户隔离(支持多index、多type,同一index下可以有多个类型,支持同时对多个index和多个type的查询)

Settings:Per-Index配置,动态配置,武装到牙齿

Distributed:分布式、动态伸缩、去中心化

Gateway:多种持久化策略

... ...

下面是为本系列文章草拟的一个大纲:

1.安装配置

2.索引及查询

3.QueryDSL

4.Mapping

5.Index Setting

5.Index Template

6.Cluster Health

7.Thrift

9.分词器配置

8.自定义分词插件

9.服务器部署及配置优化

... ...

ElasticSearch现在版本0.17,功能丰富强大,后面我再带大家一一领略,另外本大纲也会动态调整更新。

关于ES的介绍,还可以看看我之前作的一个简单PPT:quick intro to elasticsearch
和kimchy在berlinbuzzwords 2011的ppt
The Road to a Distributed, (Near) Real Time, Search Engine

本文来自: Diving Into ElasticSearch (1) 序