目录
Elastic Search 是一个基于Lucene构建的开源、分布式、RESTful接口全文搜索引擎,也是一个分布式文档数据库。
相关产品
- Beats
一个代理,可以把数据发给ES。
- Shield
权限控制,基于角色管理。收费项目
- Watcher
警报和通知工具
- Marvel
管理和监控工具。收费项目
全文索引
对每个词建立一个索引,指明该词在文章中出现的次数和位置。
Lucene
Lucene是一个全文索引引擎工具包,提供了完整的查询引擎和索引引擎,以及部分的文本分析引擎。
lucene倒排索引
不是由记录确定属性值,而是由属性值确定记录位置,因此称为倒排索引。带有倒排索引的文件称为倒排索引文件(reverted file)。
倒排索引中的对象为文档或者文档中的单词。用来存储单词或者文档在一个文档或一组文档中的位置。
搜索引擎的关键是建立倒排索引文件。倒排索引一般表现为一个关键词,它的频度,位置。
1、取得关键词:
2、建立倒排索引
3、实现
-
词典文件(Term Dictionary)
-
频率文件(frequencies)
-
位置文件(positions)
-
field。信息所在位置,保存在词典文件中。
4、压缩算法
5、应用场景
术语及概念
1、索引词(term)
索引词是一个能够被索引的精确值。foo,Foo,FOO,是不同的索引词。
2、文本(text)
文本是一段普通的非结构化文字。搜索引擎应该能够根据索引词找到原文。
3、分析(analysis)
分析是把文本转化为索引词的过程。分析的结果依赖分词器。
4、集群(cluster)
5、节点(node)
6、路由(routing)
当存储一个文档,它会存储在唯一的一个主分片中,具体哪个分片通过散列值确定。
7、分片(shard)
分片是单个lucene实例。索引是指向主分片和副本分片的逻辑空间。
8、主分片(primary shard)
每个文档只存在在主分片中,然后复制到不同副本,默认一个索引有5个主分片。
9、副本分片(replica shard)
每一个分片可以有0个多个副本。副本是针对每个分片的。分片个数 x 副本数量 = 总副本分片个数。
10、复制(replica)
每个索引可以拆分成多个分片。索引可以复制0个或多个分片。一旦复制,就有了主分片与副本分片。分片的数量和副本的数量可以在创建索引时创建。创建索引后可以修改副本的数量,但是不可以修改分片的数量。默认每个索引分配5个分片和一个副本,则集群至少需要2个节点,包括5分主分片和5个副本分片。
11、索引(index)
索引是具有相同结构的文档集合。例如客户索引,目录索引,订单索引等。
12、类型(type)
在索引中可以定义一个或多个类型,类型是索引的逻辑分区。一般情况,一种类型被定义为具有一组公共字段的文档。
13、文档(document)
存储的一个JSON格式字符串。每个存在在索引中的一个文档,都有一个ID和类型。每个文档都是一个JSON对象,存储了0个或多个字段(或者键值对),原始的JSON文档被存在一个叫做_source的字段中,索引返回值默认就是这个字段。
14、映射(mapping)
映射像关系数据库中的表结构,每个索引都有一个映射,定义了索引中的每个字段类型以及一个索引范围的设置。一个映射可以事先定义或者自动识别。
15、字段(field)
文档中包含0个或多个字段,字段可以是一个简单的值,也可以是数组或者嵌套对象。
16、来源字段(source field)
源文档被存在_source字段,索引时返回。
17、主键(ID)
文档的id/type/index必须是唯一的。
映射详解
字段数据类型
- 字符串类型:string(3.x后改成了text类型)
- 整数 : byte,short,integer,long
- 浮点数:float,double
- 布尔型: boolean
- 日期: date
字段属性(约束条件)
-
type:指定该字段的数据类型,值为上述列出的“字段数据类型”,不指定的话,由elasticsearch自动判断。
-
index:指定该字段是否索引,接收值为true和false,字符串类型默认为true,其他的数据类型默认为false。值为true的话会做分词。值为false的话不分词,原样写入索引中。
-
ignore_above:接受整数值,如果字符串长度长于这个值,则不写入索引,不指定的话默认为0。
-
analyzer:如果该字段需要索引的话,指定索引时使用的分词器,不指定的话默认使用标准分词器分词。
-
search_analyzer:指定搜索时使用的分词器,不知道的话使用标准分词器分词。
-
store:值为yes和no,默认为no。指定是否将该字段的原始文档写入索引。在elasticsearch中,因为_source中(_source下面解析)已经存储了一份原始文档,在索引中再存储原始文档就多余了,所以Elasticsearch默认是把store属性设置为no。
-
include_in_all:指定该字段是否需要包含在_all中(_all下面解析),接收值为true和false,默认为flase。
-
null_value:如果该字段的值为null,则用该值代替。
-
format:格式化日期类型,比如:yyyy-MM-dd HH:mm:ss||yyyy-MM-dd。默认strict_date_optional_time||epoch_millis
元数据类型
每一个文档都有与之关联的元数据,元数据字段是为了保证系统正常运行内置字段,比如_index表示索引字段,_type表示类型,_id表示文档主键,这些字段都是以下划线开始的,除了这些元数据之外,还有两个很重要的元数据,它们是_all和_source,这两个元数据字段可以在我们创建类型映射的时候,指定约束条件,我们接着来看看:
- _source:
存储的文档的原始值。默认_source字段是开启的,也可以关闭。如果想要关闭_source字段,在mapping中的设置如下:
{
"typename":{
"_source":{
"enabled":false
},
"properties": {
...
}
}
}
如果只想存储某几个字段的原始值到elasticsearch,可以通过incudes参数来设置,同样,可以通过excludes参数排除某些字段。在mapping中的设置如下:
{
"typename":{
"_source":{
"includes":["field1","field2"],"excludes":["field3","field4"]
},
"properties": {
...
}
}
}
- _all:
包含全部内容的字段,默认是关闭的,开启_all字段的方法和_source类似,mapping中的配置如下:
{
"typename": {
"_all": {
"enabled": true
},
"properties": {
...
}
}
}
也可以通过在字段中指定某个字段是否包含在_all中:
{
"yourtype": {
"typename": {
"field1": {
"type": "string",
"include_in_all": false
},
"field2": {
"type": "string",
"include_in_all": true
}
}
}
}
对外接口
ES对外接口以HTTP协议,以JSON格式REST约定对外提供。
HTTP配置放在elasticsearch.yml中,都是静态属性,必须重启生效。HTTP对外接口模块是可以禁用的,设置http.enabled = false 。
API约定
多索引参数
- _all
全部索引
- *
通配符,统配多个字符
- ignore_unavailable
当索引不存在或关闭时,是否忽略索引。true、false
- allow_no_indices
使用通配符查询索引,索引不存在时,是否返回失败。true、false。
- expand_wildcards
控制通配符索引表达式匹配哪一类索引。包括open(开启),close(关闭),none(不可用),all(开启和关闭)
日期筛选
几乎所有API都支持日期筛选。
语法:
<static_name {date_math_expr{date_format|time_zone}}>
- static_name :索引名称
- date_math_expr:动态日期计算表达式
- date_format:日期格式
- time_zone:时区,默认UTC
例如:
<secilog-{now/d{YYYY.MM.dd+12:00}}>
通用参数
1、pretty
?pretty=true,返回JSON格式,或者
?format=yaml,YAML格式
2、human
?human=true,返回更适合人类阅读的格式
3、日期表达式
- ||
- 分割符号
- +
- 加一个单位
- -
- 减一个单位
- /
- 取整
支持的时间单位:y(年),M(月),w(周),d(日),H(时),m(分),s(秒)
4、响应过滤(filter_path)
通过filter_path过滤返回内容
?filter_path=took,hits*
支持通配符(*),逗号分割。
基于URL的访问控制
可以通过配置文件限制某个用户对索引的请求
REST
POST,GET,PUT,DELETE
HEAD插件
Head插件作为url请求工具,需要在服务器安装
http://host:port/_plugin/head
创建库
http:/*/secisland?pretty
返回:
{ "acknowledged":true} //表示成功
插入数据
修改文档
删除文档
删除库
JAVA API