Elasticsearch配置详解、文档元数据
目录
返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html
1.Elasticsearch配置文件详解
a. 在上面博客中,我们已经安装并且成功配置了Elasticsearch以及部分插件,接下来我们就需要看看Elasticseach的配置文件的信息以及文档的一些说明。
b.首先找到Elasticsearch的安装位置,跳转到elasticsearch的config文件夹下,在此文件夹下含有两个配置文件:elasticsearch.yml和logging.yml,第一个是Elasticsearch的基本配置文件,第二个是日志配置文件,Elasticsearch是使用log4j来记录日志的,所以logging.yml里的设置按普通的log4j配置文件夹来设置即可。下面我们主要来说一下elasticsearch.yml文件中的配置信息。
c.文档说明采用写备注的方法来说明elasticsearch.yml文件,Elasticsearch的版本是:2.3.1。
c.1 cluster.name: kencery 配置Elasticsearch的集群名称,默认是elasticsearch,Elasticsearch会自动发现在同一网段下的es集群,如果在同一个网段下有多个集群,可以利用这个属性来区分不同的集群。
c.2 node.name : "kencery-node1" 集群的节点名称,Elasticsearch启动的时候会自动创建节点名称,但是你也可以进行配置。
c.3 node.rack: r1 每个节点都可以定义一些与之关联的通用属性,用于后期集群进行碎片分配时的过滤。
c.4 path.data: /path/to/data 设置索引数据的存储路径,默认是Elasticsearch根目录下的data文件夹,可以设置多个存储路径,用逗号隔开,是的数据在文件级别跨域位置,这样在创建时就有更多的自由路径,如:path.data: /path/to/data1,/path/to/data2
c.5 path.logs: /path/to/logs 设置日志文件的存储路径,默认是Elasticsearch根目录下的logs文件夹。
c.6 bootstrap.mlockall: true 设置为true来锁住内存,因为当JVM开始swapping的时候Elasticsearch的效率会降低,所以要保证他不被swap,可以吧ES_MIN_MEN和ES_MAX_MEN两个环境变量设置为同一个值,并且保证机器有足够的内存分配给Elasticsearch,同时也要允许Elasticsearch的进程可以锁住内存,linux下可以通过`ulimit -l unlimited`命令。
c.7 network.host: 192.168.37.133 设置绑定的IP地址,可以是ipv4或者ipv5,默认使用0.0.0.0地址,并为http传输开启9200、9300端口,为节点到节点的通信开启9300-9400端口,也可以自行设置IP地址。
c.8 http.port: 9200 设置对外服务的Http端口,默认是9200
c.9 discovery.zen.ping.unicast.hosts: ["192.168.37.133", "192.168.37.137"] 设置集群中master节点的初始化列表,可以通过这些节点来自动发现新加入集群的节点(主要用于不同网段机器连接)。
c.10 discovery.zen.minimum_master_nodes: 3 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点,默认为1,当集群多余三个节点时,可以设置大一点的值(2-4)
c.11 gateway.recover_after_nodes: 3 设置集群中国N个节点启动时进行数据恢复,默认是1
c.12 node.max_local_storage_nodes: 1 默认情况下,多个节点可以在同一个安装路径启动,如果你想让你的Elasticsearch只启动一个节点,在这合理设置。
c.13 action.destructive_requires_name: true 设置是否可以通过正则或者_all删除或者关闭索引。
d. 上面所有的节点信息都是在配置文件中存在的,有些节点信息配置文件没有显示(不推荐修改),可以查看这里学习:http://www.zihou.me/html/2014/01/17/9061.html
e. 上面只是简单描述了一些Elasticsearch配置文件中的信息,详细配置请看你安装的Elasticsearch里面的配置文件的信息.
f. 关于Elasticsearch的基础概念,请参考:http://blog.csdn.net/cnweike/article/details/33736429
2. 数据对象处理
a. 在编程中,无论我们的程序如何去写,相信最终的目标是数据为我们服务,但是在众多的条件下,数据并不只是简单的由随机比特和字节组成的没有意义的数据,所以我们会在数据库的节点之间使用关联来表示现实世界中的某些事物,比如:在现实的世界中,并不是所有的实体类型看起来是一样的,比如公司员工(Employee):一个人可能只有一个座机号码,另一个人可能只有一个手机号码,而有些人可能两者都有,一个人可能有Email,其他人也可能没有。那么如何解决这种问题呢?相信大家第一时间都会想到面向对象,是的,我们可以使用对象来处理现实世界中的这些有着复杂结构的实体。到目前为止,基本所有的开发语言都支持面向对象。
b. 但是当我们想存储下来这些实体时便存在了问题,大部分引用中,我们使用行和列的形式把数据存储在关系型数据库中,但是这种固定的存储方式导致对象的灵活性不存在了,那么如何能以对象的形式存储对象呢?相对于围绕表格去为我们的程序建模,我们可以更加专注于使用数据,把对象的灵活性给释放(mongodb就是这方面典型的代表)。
c. 对象(Object)是一种语言相关,记录在内存中的数据结构,为了在网络间发送或者储存它,故而出现了标准的格式来表示它,JSON(JavaScript Object Notation)是一种可读的以文本来表示对象的方式,它已经成为NoSql世界中数据交换的一种事实标准,当对象被序列化为JSON,它就成为JSON文档了。
d. Elasticsearch是一个分布式的文档(Document)存储引擎,他可以实时存储并且检索复杂的数据结构(序列化的JSON文档),换言之一旦文档被存储在Elasticsearch中,它就可以在集群的任意一个节点上被检索,当然我们不仅需要存储数据,还需要快速的批量查询,虽然很多NoSql的解决方案允许以文档的形式存储对象,但它们依旧需要考虑如何查询这些数据以及那些字段需要添加索引来使检索时更加快速,而在Elasticsearch中,每一个字段的数据都是默认添加了索引,也就是说,每个字段专门有一个反向索引用于快速检索,而且与其他的数据库不同的是他可以在同一个查询中利用所有的这些反向索引,来快速的返回结果。
e. Elasticsearch使用JSON(JavaScript Object Notation)作为文档序列化格式,JSON已经被大多数语言所支持,而且已经成为了NoSql领域的标准格式,它简洁、简单而且容易阅读。
f. 上面简述了Elasticsearch的数据处理对象的来源以及选择和有点,那么下面我们来说一下面向文档的开发。
3. 面向文档的开发
a. 什么是面向文档的开发呢?通常,我们可以认为对象(object)和文档(document)是等价想通的,不过在Elasticsearch中,他们还是有所差别的,对象(Object)是一个JSON结构体(类似于哈希,hashmap,字典或者关联数组),对象(Object)中还可能包含其他对象(Object),在Elasticsearch中,文档(document)这个属于有着特殊的含义它特质最顶层结构或者根对象(root object)序列化的Json数据(以唯一Id标识并且存储在Elasticsearch中)。
b. ELasticsearch是面向文档的,这就意味着他可以存储整个对象或文档,然而它不仅仅死存储,还会索引(index)每个文档的内容使之可以被搜索,在Elasticsearch中,你可以对文档对象模型进行索引、搜索、排序、过滤。这就是Elasticsearch能够执行复杂的全文搜索的原因之一。
c.程序中大多数的实体或者对象能够被序列化为包含键值对的JSON对象,键(Key)是字段(field)或属性(property)的名字,值(value)可以是字符串、数字、布尔类型、对象、数组或者其它特殊类型。
d. 这里我使用C#创建了一个员工类,在里面声明了一些字段属性,在后面的文章中将统一使用这个实体类来操作,尽管原始的Employee对象很复杂,但它的结构和对象的含义已经被完成的体现在JSON中了,所以在Elasticsearch中将对象转化为JSON并做索引要比在表结构中做相同的事情简单的多。如下所示:实体以及转换后的JSON。
d.1 实体类如下(C#所写,大家可以转换成Java等其它语言):
1 using System; 2 using System.Collections.Generic; 3 4 namespace Common 5 { 6 /// <summary> 7 /// 员工实体 8 /// </summary> 9 public class Emplyee 10 { 11 /// <summary> 12 /// 员工Id 13 /// </summary> 14 public string Id { get; set; } 15 16 /// <summary> 17 /// 员工名称 18 /// </summary> 19 public string Name { get; set; } 20 21 /// <summary> 22 /// 员工年龄 23 /// </summary> 24 public int Age { get; set; } 25 26 /// <summary> 27 /// 是否实习 28 /// </summary> 29 public bool IsPractice { get; set; } 30 31 /// <summary> 32 /// 兴趣爱好 33 /// </summary> 34 public string[] Interests { get; set; } 35 36 /// <summary> 37 /// 加入公司时间 38 /// </summary> 39 public DateTime JoinDate { get; set; } 40 41 /// <summary> 42 /// 员工家庭信息 43 /// </summary> 44 public Home Home { get; set; } 45 46 /// <summary> 47 /// 员工账号信息 48 /// </summary> 49 public List<Accounts> Accounts { get; set; } 50 } 51 52 53 /// <summary> 54 /// 员工家庭信息 55 /// </summary> 56 public class Home 57 { 58 /// <summary> 59 /// 纬度 60 /// </summary> 61 public double Lat { get; set; } 62 63 /// <summary> 64 /// 经度 65 /// </summary> 66 public double Long { get; set; } 67 } 68 69 /// <summary> 70 /// 员工账号信息 71 /// </summary> 72 public class Accounts 73 { 74 /// <summary> 75 /// 类型 76 /// </summary> 77 public string Type { get; set; } 78 79 /// <summary> 80 /// 值 81 /// </summary> 82 public string Value { get; set; } 83 } 84
d.2 赋值生成一个JSON对象,如下图所示:
e.几乎所有的语言都有相应的模块用于将任意数据结构转换为JSON,但每种语言处理的细节不同,Elasticsearch官方客户端会自动为我们序列化和反序列化JSON,下面开始你的Elasticsearch学习之旅吧。
4. 文档元数据
a. 在Elasticsearch下,一个文档中不只有数据,它还包含了元数据(metadata),在Elasticsearch下,每创建一条数据,都会对元数据进行写入等操作,元数据在Elasticsearch下起到了非常大的作用,关于三个必须的元数据节点如下(赋图):
节点 | 说明 |
_index | 文档存储的地方(类似于数据库,只可以这样理解) |
_type | 文档代表的对象的类(类似于数据库中的表,只可以这样理解) |
_id | 文档的唯一标识(类似于数据库中表的主键,只可以这样理解) |
b. _index 索引(index)类似于关系型数据库里的"数据库",它是存储和索引关联数据的地方。
b.1 事实上,我们的数据被存储和索引在分片(shards)中,索引只是一个把一个或者多个分片分组在一起的逻辑空间,然而内部的一些细节不需要我们程序关心,文档存储在索引(index)中,剩下的需要的工作交由Elasticsearch关心即可。
b.2 我们将在后面的文章中将会阐述如何创建并且管理索引,而现在使用Elasticsearch创建索引只需要选择一个索引名,这个名称必须全部小写,不能以下划线开头,不能包含逗号。如上面定义的类所示,后面我们将使用公司(company)作为索引名。
c. _type
c.1 如上面所说说,在现实世界中,我们使用对象标识一些"事物",每个对象都属于一个类(class,如:Employee),这个类定义了属性或者对象关联的数据。
c.2 在关系型数据库中,我们经常讲相同累的对象储存在一个表里面,因为他们有着相同的结构,当然在Elasticsearch中,我们可以使用相同类型(type)的文档表示相同的"事物",因为他们的数据结构是相同的,每个类型都有自己的映射(mapping)或者结构定义,就像传统数据库表中的列一样,所有类型下的文档被储存在同一个索引下,但是类型的映射(mapping)会告诉Elasticsearch不同的文档如何被缩影,后面会说到。
c.3 _type的命名规范,它的名字可以是大写或者小写,不能包含下划线或逗号,后面我们将使用employee作为类型名。
d. _id 一个字符串,它与_index和_type组合时,就可以在Elasticsearch中唯一标识一个文档,当创建一个文档的时候,你可以自定义_id,也可以让Elasticsearch自动帮你生成。
每天一点点都是进步
如果文章哪里存在问题,欢迎大家指出来,我会在第一时间修改。
初心商城:初心商城
作者:韩迎龙(Kencery) MVC/.NET群:159227188如果您认为这篇文章还不错或者有所收获,您可以通过右边的“打赏”功能 打赏一杯咖啡,本页版权归作者和博客园所有,欢迎转载,但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利