es数据存储简单介绍
1. 概念解释
Index:索引,它是单个数据库的同义词。
Type:索引类型,它是单个数据表的同义词。
Document:文档,它是单条数据记录的同义词。
mapping:映射,相当于数据库的表结构。
理论上一个Index可以包含多个Type,但是在实际应用中一般一个Index只包含一个Type,若包含多个Type,容易造成数据干扰等问题,有百害而无一利。
一般情况下我们是先往es中插入数据,es会自动识别各个字段类型,创建索引,然后我们再查询mapping,将mapping改成我们想要的索引结构,删除原有索引结构,手动创建索引结构。
2. es索引基本原理
es默认会为文档的所有字段建立倒排索引。
es对单个字段的值的内容进行分词,分词汇总称为Term Dictionary,Term Dictionary中各个分词都对应一个文档ID数组(Posting List),Term Dictionary是有序的,查询时可使用二分查找,查找到Term即可根据对应的文档ID数组读取文档内容了。
Posting List也是有序的,使用增量编码压缩,将大数变小数按字节存储。这样的存储方式不仅能节省存储空间,也方便多字段联合查询时多个Posting List之间进行并集操作,将各个字段查询到的Term对应的Posting List做按位与运算,即可得到最终的文档ID数组。
当数据量很大时,Term Dictionary也是很庞大的,无法全部存在内存中,所以es又加多了一层Term Index,只存储部分词的前缀,以FST的形式保存在内存中(FST以字节的方式存储了所有的Term),节省内存,检索很快。
所以es搜索数据时,先在内存中Term Index查询到对应的Term Dictionary的block位置,再去磁盘上查找Term,找到Term以后再根据对应的文档ID数组去读取文档数据。
1、RESTful接口使用方法
为了方便直观我们使用Head插件提供的接口进行演示,实际上内部调用的RESTful接口。
RESTful接口URL的格式:http://localhost:9200/index/type/[id]
其中index、type是必须提供的,id是可选的,不提供es会自动生成。index、type将信息进行分层,利于管理。index可以理解为数据库;type理解为数据表;id相当于数据库表中记录的主键,是唯一的。
2、索引文档的创建
将如下一条歌曲信息的数据提交到ES中创建索引:
url:http://127.0.0.1:9200/song001/list001/5
data:{"number":32768,"singer":"杨坤","size":"777","song":"今夜20岁","tag":"中国好声音","timelen":319}
索引名字是:song001;
索引的类型是:list001;
本记录的id是:5
返回的信息可以看到创建是成功的,并且版本号是1;ES会对记录修改进行版本跟踪,第一次创建记录为1,同一条记录每修改一次就追加1。
至此一条记录就提交到ES中建立了索引,注意HTTP的方法是PUT,不要选择错了
3、索引文档的查询
根据索引时的ID查询的文档的RESTful接口如下
根据ID查询
url:http://localhost:9200/song001/list001/5
data:空
HTTP方法采用GET的形式。
轻量搜索
此外还可以采用,轻量搜索:http://localhost:9200/studentdb/student/_search/
返回结果不仅告知匹配了哪些文档,还包含了整个文档本身:显示搜索结果给最终用户所需的全部信息。
查询条件(q)参数
使用 _search
端点,并将查询本身赋值给参数 q=
查询条件(q)参数用于指定返回的文档必须匹配的查询条件,例如:q=title:azure,指定搜索title字段中包含azure关键字的文档;
可以设置一个字段包含多个关键字,关键字之间使用空格或逗号分隔,例如:q=title:(azure,aws,cloud),或 q=title:(azure aws cloud),指定搜索title字段中包含azure,aws或cloud的文档;只要title字段包含任意一个关键字,文档就满足查询条件;
q参数可以指定搜素一个短语,短语使用双引号标识,例如:q=title:"azure vs aws",指定搜索title中包含短语“azure vs aws”的文档;
在查询条件中,也可以指定操作符:+或-,操作符 + 用于指定返回的文档必须匹配查询条件;操作符 - 用于指定返回的文档不匹配查询条件;操作符之间以空格分隔,操作符是位于查询条件=号右侧,字段前面,例如 q=+title:azure -title:aws,指定搜索字段title中只能包含azure,不能包含aws;
查询表达式
还可以,使用查询表达式:【注意用POST】
http://localhost:9200/song001/list001/_search/
{
"query": {
"match": {
"singer": "哈哈"
}}}
更复杂的查询JSON可以参考Tab:基本查询 中生成的。
4、索引文档的更新
根据索引时的ID更新的文档的内容,其RESTful接口如下
url:http://localhost:9200/song001/list001/5
HTTP方法采用PUT的形式。
将歌手名由“杨坤”改成“杨坤独唱”;
结果中的version字段已经成了2,因为我们这是是修改,索引版本递增;created字段是false,表示这次不是新建而是更新。
更新接口与创建接口完全一样,ES会查询记录是否存在,如果不存在就是创建,存在就是更新操作。
5、索引文档的删除
根据索引时的ID更新的文档的内容,其RESTful接口如下
url:http://127.0.0.1:9200/song001/list001/5
HTTP方法采用DELETE的形式。
删除过后,再通过查询接口去查询将得不到结果。
总结:
增删改查的RESTful接口URL形式:http://localhost:9200///[]
增删改查分别对应:HTTP请求的PUT、DELETE、PUT、GET方法。PUT调用是如果不存在就是创建,已存在是更新。
参考: https://www.cnblogs.com/wujuntian/p/13087031.html