文章目录
概念
cluster
集群,一个ES集群由一个或多个节点(Node)组成,每个集群都有一个cluster name作为标识.
node
一个节点是你集群中的一个服务器,作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。 和集群类似, 一个节点也是由一个名字来标识的, 默认情况下, 这个名字是一个随机的Marvel角色的名字,这个名字会在节点启动时分配给它。这个名字对于管理工作来说很重要,因为在这个管理过程中,你会去确定网络中的哪些 服务器对应于Elasticsearch集群中的哪些节点。
index
一个索引就是一个拥有相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来 标识(必须全部是小写字母的),并且当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,你能够创建任意多个索引。
type
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组相同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台 并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。
shard
1.分片,ES是分布式搜索引擎,每个索引有一个或多个分片,索引的数据被分配到各个分片上,相当于一桶水用了N个杯子装。
2.ES是分布式搜索引擎,每个索引有一个或多个分片,索引的数据被分配到各个分片上,相当于一桶水用了N个杯子装。
3.分片是独立的,对于一个Search Request的行为,每个分片都会执行这个Request。
4.分片是独立的,对于一个Search Request的行为,每个分片都会执行这个Request。
replica
1.复制,可以理解为备份分片,相应地有primary shard(主分片)。
2.主分片和备分片不会出现在同一个节点上(防止单点故障),默认情况下一个索引创建5个分片一个备份(5主+5从=10分片)
3.如果你只有一个节点,那么5个replica都无法分配(unassigned),此时cluster status会变成Yellow
四种查询模式
query and fetch
向索引的所有分片 ( shard)都发出查询请求, 各分片返回的时候把元素文档 ( document)和计算后的排名信息一起返回。
这种搜索方式是最快的。 因为相比下面的几种搜索方式, 这种查询方法只需要去 shard查询一次。 但是各个 shard 返回的结果的数量之和可能是用户要求的 size 的 n 倍。
优点:这种搜索方式是最快的。因为相比后面的几种es的搜索方式,这种查询方法只需要去shard查询一次。
缺点:返回的数据量不准确, 可能返回(N*分片数量)的数据并且数据排名也不准确,同时各个shard返回的结果的数量之和可能是用户要求的size的n倍。
query then fetch( es 默认的搜索方式)
如果你搜索时, 没有指定搜索方式, 就是使用的这种搜索方式。 这种搜索方式, 大概分两个步骤:
第一步, 先向所有的 shard 发出请求, 各分片只返回文档 id(注意, 不包括文档 document)和排名相关的信息(也就是文档对应的分值), 然后按照各分片返回的文档的分数进行重新排序和排名, 取前 size 个文档。
第二步, 根据文档 id 去相关的 shard 取 document。 这种方式返回的 document 数量与用户要求的大小是相等的。
优点:
返回的数据量是准确的。
缺点:
性能一般,并且数据排名不准确。
DFS query and fetch
这种方式比第一种方式多了一个 DFS 步骤,有这一步,可以更精确控制搜索打分和排名。也就是在进行查询之前, 先对所有分片发送请求, 把所有分片中的词频和文档频率等打分依据全部汇总到一块, 再执行后面的操作、
优点:
数据排名准确
缺点:
性能一般
返回的数据量不准确, 可能返回(N*分片数量)的数据
####DFS query then fetch
比第 2 种方式多了一个 DFS 步骤。
也就是在进行查询之前, 先对所有分片发送请求, 把所有分片中的词频和文档频率等打分依据全部汇总到一块, 再执行后面的操作、
优点:
返回的数据量是准确的
数据排名准确
缺点:
性能最差【 这个最差只是表示在这四种查询方式中性能最慢, 也不至于不能忍受,如果对查询性能要求不是非常高, 而对查询准确度要求比较高的时候可以考虑这个】
请求
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
关键字 | 解释说明 |
---|---|
VERB | 适当的 HTTP 方法 或 谓词 : GET 、 POST 、 PUT 、 HEAD 或者 DELETE 。 |
PROTOCOL | http 或者 https (如果你在 Elasticsearch 前面有一个 https 代理) |
HOST | Elasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。 |
PORT | 运行 Elasticsearch HTTP 服务的端口号,默认是 9200 。 |
PATH | API 的终端路径(例如 _count 将返回集群中文档数量)。Path 可能包含多个组件,例如:_cluster/stats 和 _nodes/stats/jvm 。 |
QUERY_STRING | 任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读) |
BODY | 一个 JSON 格式的请求体 (如果请求需要的话) |
增
插入一条记录
// 说明
索引 : megacorp
类型名称 : employee
特定雇员id : 1
// 输入
PUT /megacorp/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
// 输出
{
"_index": "megacorp",
"_type": "employee",
"_id": "1",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
只创建,不更新
// 输入
POST /megacorp/employee/1?op_type=create
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 26,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
或者
// 输入
POST /megacorp/employee/1?_create
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 26,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
删
// 输入
DELETE /megacorp/employee/1
// 输出
{
"_index": "megacorp",
"_type": "employee",
"_id": "3",
"_version": 2,
"result": "deleted",
"_shards":
{
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1
}
改
修改一条记录
PUT /megacorp/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 26,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
####部分更新
// 输入 doc为关键字
POST /megacorp/employee/1/_update
{
"doc": {
"tags": ["test"],
"views": 0
}
}
查
检索文档
// 输入
GET /megacorp/employee/1
// 输出
{
"_index": "megacorp",
"_type": "employee",
"_id": "1",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"found": true,
"_source":
{
"first_name": "John",
"last_name": "Smith",
"age": 25,
"about": "I love to go rock climbing",
"interests": ["sports", "music"]
}
}
轻量搜索
// 输入
GET /megacorp/employee/_search
// 输出
{
"took":70,
"timed_out":false,
"_shards":{
"total":1,
"successful":1,
"skipped":0,
"failed":0
},
"hits":{
"total":{
"value":2,
"relation":"eq"
},
"max_score":1,
"hits":[
{
"_index":"megacorp",
"_type":"employee",
"_id":"1",
"_score":1,
"_source":{
"first_name":"John",
"last_name":"Smith",
"age":25,
"about":"I love to go rock climbing",
"interests":[
"sports",
"music"
]
}
},
{
"_index":"megacorp",
"_type":"employee",
"_id":"2",
"_score":1,
"_source":{
"first_name":"Jane",
"last_name":"Smith",
"age":32,
"about":"I like to collect rock albums",
"interests":[
"music"
]
}
}
]
}
}
条件搜索
// 输入
curl -X GET "localhost:9200/megacorp/employee/_search?q=first_name:John&pretty"
or
GET /megacorp/employee/_search?q=first_name:John
// 输出
{
"took" : 12,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.9808292,
"hits" : [
{
"_index" : "megacorp",
"_type" : "employee",
"_id" : "1",
"_score" : 0.9808292,
"_source" : {
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests" : [
"sports",
"music"
]
}
}
]
}
}
条件搜索-过滤器
// 输入
GET /megacorp/employee/_search
{
"query" : {
"bool": {
"must": {
"match" : {
"last_name" : "smith"
}
},
"filter": {
"range" : {
"age" : { "gt" : 30 }
}
}
}
}
}
条件搜索-返回需要的字段结果
GET /megacorp/employee/_search?_source=first_name,last_name
单值精确匹配
GET /role/_search
{
"query": {
"term": {
"age": 24
}
}
}
单值模糊匹配
GET /role/_search
{
"query": {
"match": {
"age": 24
}
}
}
多值匹配
GET /role/_search
{
"query": {
"multi_match": {
"query": "JK",
"fields": [
"name",
"p_info.m",
"p_info.d_info.s",
"p_info.d"
],
"operator": "and"
}
}
}
Bool查询
GET /role/_search
{
"query": {"bool": {"must": [
{"term": {
"name.keyword": {
"value": "Lily"
}
}}
]}}
}
聚合查询-max、min、avg、sum、stats
GET /role/_search
{
"aggs": {
"group_sum":{
"avg": {
"field": "age"
}
}
}
}
分组查询
GET /role/_search
{
"aggs": {
"group_by_age":{
"terms": {
"field": "age",
"size": 10
}
}
}
}
去重查询
GET /role/_search
{
"aggs": {
"agg_card": {
"cardinality": {
"field": "age"
}
}
}
}
###关键字
// 精确匹配
match_phrase
// 高亮
highlight
// 脚本
script
Groovy脚本编程
POST /megacorp/employee/1/_update
{
"script" : "ctx._source.views+=views",
"params" : {
"views" : "search"
}
}
问题解决
Set “Area” fielddata=True问题
PUT /py-operator-log/_mapping/doc/
{
"properties":{
"Area":{
"type": "text",
"fielddata": true
}
}
}