Elasticsearch基础入门

概念

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 方法谓词 : GETPOSTPUTHEAD 或者 DELETE
PROTOCOLhttp 或者 https(如果你在 Elasticsearch 前面有一个 https 代理)
HOSTElasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。
PORT运行 Elasticsearch HTTP 服务的端口号,默认是 9200
PATHAPI 的终端路径(例如 _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
    }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值