一、ES中的文档操作
1.什么是ES中的文档?
document --存放数据
在ES里面 通过index索引库 type 类型(表) 行({id:name:}) 列 id /name
ES是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。
ES使用Javascript对象符号(JavaScript Object Notation),也就是JSON,作为文档序列化格式。JSON现在已经被大多语言所支持,而且已经成为NoSQL领域的标准格式。
简单文档示例:
{
"_index" : "test",
"_type" : "user",
"_id" : "1",
"_version" : 3,
"_seq_no" : 2,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "xxxx",
"age" : 20
}
}
2.文档的增删改
在ES中存储数据的行为就叫做索引(indexing),文档归属于一种类型(type),而这些类型存在于索引(index)中,我们可以简单的对比传统数据库和ES的对应关系:
关系数据库(MYSQL) -> 数据库DB-> 表TABLE-> 行ROW-> 列Column
Elasticsearch -> 索引库Indices -> 类型Types -> 文档Documents -> 字段Fields
ES集群可以包含多个索引(indices)(数据库),每一个索引库中可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。
#使用自己的ID创建
PUT /test/user/1
{
"name":"xxxx",
"age":20
}
#ES内置ID创建
POST /test/user/
{
"name":"yyyyyy",
"age":30
}
#获取指定ID的文档
GET /test/user/1
#返回文档的部分字段
GET /test/user/1?_source=name
#只返回文档内容
GET /test/user/1/_source
#更新整个文档
POST test/user/1
{
"name":"小明"
}
#局部更新文档
POST test/user/1/_update
{
"doc": {
"name":"小王"
}
}
#删除文档
DELETE test/user/1
3.文档的简单查询
PUT test/user/2
{
"name":"小明",
"age":20
}
PUT test/user/3
{
"name":"小红",
"age":18
}
PUT test/user/4
{
"name":"小刚",
"age":19
}
PUT test/user/5
{
"name":"小王",
"age":20
}
PUT test/user/6
{
"name":"小李",
"age":21
}
#文档的简单查询
#通过文档的id获取
GET test/user/1
#批量获取
GET test/user/_mget
{
"ids":["1","2","3"]
}
#空搜索
GET _search
#分页搜索
GET _search?size=1&from=2
#查询字符串
GET test/user/_search?q=age:18
GET test/user/_search?q=age[20 TO 30]
二、DSL查询与过滤
1.什么是DSL查询?
由ES提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。
DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。
DSL有两部分组成:DSL查询和DSL过滤。
2.DSL查询
GET test/user/_search
{
"query":{
"match_all": {}
},
"from":1,
"size":2,
"sort":[{"age":"asc"}]
}
3.DSL过滤
DSL过滤 查询文档的方式更像是对于我的条件“有”或者“没有”,–精确查询
而DSL查询语句则像是“有多像”。–类似于模糊查询
DSL过滤和DSL查询在性能上的区别 :
(1)过滤结果可以缓存并应用到后续请求。
(2)查询语句同时 匹配文档,计算相关性,所以更耗时,且不缓存。
(3)过滤语句 可有效地配合查询语句完成文档过滤。
原则上,使用DSL查询 做模糊查询 或其他需要进行相关性评分的场景,其它全用DSL过滤。
GET test/user/_search
{
"query":{
"bool": {
"must":[{
"match_all": {}
}],
"filter": {
"term": {
"age": 20
}
}
}
},
"from":1,
"size":2,
"sort":[{"age":"asc"}]
}