es入门2
程序员文章站
2022-07-05 14:00:27
...
语法
PUT /megacorp/employee/1
{
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
PUT /megacorp/employee/2
{
"first_name" : "Jane",
"last_name" : "Smith",
"age" : 32,
"about" : "I like to collect rock albums",
"interests": [ "music" ]
}
PUT /megacorp/employee/3
{
"first_name" : "Douglas",
"last_name" : "Fir",
"age" : 35,
"about": "I like to build cabinets",
"interests": [ "forestry" ]
}
// HTTP 命令由 PUT 改为 GET 可以用来检索文档,同样的,可以使用 DELETE 命令来删除文档,以及使用 HEAD 指令来检查文档是否存在。如果想更新已存在的文档,只需再次 PUT 。
GET /megacorp/employee/1
GET /megacorp/employee/_search
{
"query" : {
"match" : {
"last_name" : "Smith"
}
}
}
// Elasticsearch 默认按照相关性得分排序,即每个文档跟查询的匹配程度。
GET /megacorp/employee/_search
{
"query" : {
"bool": {
"must": {
"match" : {
"last_name" : "smith"
}
},
"filter": {
"range" : {
"age" : { "gt" : 30 }
}
}
}
}
}
GET /megacorp/employee/_search
{
"query" : {
"bool": {
"must": {
"match":{
"about" : "rock climbing"
}
},
"filter": {
"range": {
"age": {
"gte": 20,
"lte": 32
}
}
}
}
}
}
GET /megacorp/employee/_search
{
"query" : {
"bool": {
"must": {
"match_phrase":{
"about" : "rock climbing"
}
},
"filter": {
"range": {
"age": {
"gte": 20,
"lte": 32
}
}
}
}
}
}
bool查询来实现你的需求。这种查询将多查询组合在一起,成为用户自己想要的布尔查询。
它接收以下参数:
must : 文档必须匹配这些条件才能被包含进来。
must_not : 文档必须不匹配这些条件才能被包含进来。
should : 如果满足这些语句中的任意语句,将增加_score,否则,无任何影响。它们主要用于修正每个文档的相关性得分。
filter : 必须匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。
// aggs、 suggestions、geolocation、percolation、fuzzy 、 partial matching
// 集群健康
GET /_cluster/health
//naming info
1. 索引——保存相关数据的地方,索引实际上是指向一个或者多个物理分片的逻辑命名空间。
2. 一个分片是一个底层的工作单元,它仅保存了全部数据中的一部分。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。
3. Elasticsearch 是利用分片将数据分发到集群内各处的。当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。
4. 一个分片可以是 主 分片或者 副本 分片。 索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。
5. 节点是Elasticsearch的一个实例,集群就是有节点组成
// partial-updates
GET /megacorp/employee/_search
POST /megacorp/employee/3/_update
{
"doc":{
"age":36,
"views":1
}
}
GET /megacorp/employee/3
POST /megacorp/employee/3/_update?retry_on_conflict=5
{
"script" : "ctx._source.views+=1",
"upsert": {
"views": 0
}
}
GET /megacorp/employee/3
// mget
GET /megacorp/employee/_mget
{
"ids":[1,2]
}
GET /megacorp/employee/_mget
{
"ids":[1,2000]
}
//批量操作编辑 bulk
POST /_bulk
{ "delete": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "create": { "_index": "website", "_type": "blog", "_id": "123" }}
{ "title": "My first blog post" }
{ "index": { "_index": "website", "_type": "blog" }}
{ "title": "My second blog post" }
{ "update": { "_index": "website", "_type": "blog", "_id": "123", "_retry_on_conflict" : 3} }
{ "doc" : {"title" : "My updated blog post"} }
// get config(_mapping)
GET /megacorp/_mapping/employee
Elasticsearch使用一种称为倒排索引的结构,它适用于快速的全文搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。
分析包含下面的过程:
首先,将一块文本分成适合于倒排索引的独立的词条,
之后,将这些词条统一化为标准格式以提高它们的“可搜索性”,或者recall
分析器执行上面的工作。分析器实际上是将三个功能封装到了一个包里:字符过滤器、分词器、Token过滤器
字符过滤器
首先,字符串按顺序通过每个字符过滤器。他们的任务是在分词前整理字符串。一个字符过滤器可以用来去掉HTML,或者将&转化成`and`。
分词器
其次,字符串被分词器分为单个的词条。一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条。
Token过滤器
最后,词条按顺序通过每个token过滤器。这个过程可能会改变词条(例如,小写化Quick),删除词条(例如,像a`,`and`,`the等无用词),或者增加词条(例如,像jump和leap这种同义词)。
测试分析器
GET /_analyze
{
"analyzer": "standard",
"text": "Text to analyze"
}
验证查询
GET /megacorp/_validate/query?explain
{
"query": {
"match" : {
"about" : "really powerful"
}
}
}
返回结果默认按相关度 max_score 排序, 查询会计算结果
但是如果查询中有排序, 不会计算 max_score, 如果指定按相关度排序_score, 则会重新计算_score
GET /megacorp/_search
{
"query": {
"match" : {
"about" : "rock"
}
}
}
GET /megacorp/_search
{
"query": {
"match" : {
"about" : "rock"
}
},
"sort": { "age": { "order": "asc" }}
}
GET /megacorp/_search
{
"query": {
"match" : {
"about" : "rock"
}
},
"sort": {
"age": { "order": "asc" },
"_score": { "order": "asc" }
}
}
执行分布式检索
在 search 接口返回一个 page 结果之前,多分片中的结果必须组合成单个排序列表。为此,搜索被执行成一个两阶段过程,我们称之为 query then fetch 。
索引-创建索引
PUT /my_index
{
"settings": { ... any settings ... },
"mappings": {
"type_one": { ... any mappings ... },
"type_two": { ... any mappings ... },
...
}
}
索引-删除索引
DELETE /my_index
DELETE /index_one,index_two
DELETE /index_*
DELETE /_all
DELETE / *
索引-索引设置
number_of_shards : 每个索引的主分片数,默认值是 5 。这个配置在索引创建后不能修改。
number_of_replicas : 每个主分片的副本数,默认值是 1 。对于活动的索引库,这个配置可以随时修改。
可以创建只有 一个主分片,没有副本的小索引
PUT /my_temp_index
{
"settings": {
"number_of_shards" : 1,
"number_of_replicas" : 0
}
}
可以用 update-index-settings API 动态修改副本数:
PUT /my_temp_index/_settings
{
"number_of_replicas": 1
}
索引-配置分析器
PUT /spanish_docs
{
"settings": {
"analysis": {
"analyzer": {
"es_std": {
"type": "standard",
"stopwords": "_spanish_"
}
}
}
}
}
索引-动态映射
dynamic 配置来控制动态映射 ,可接受的选项如下:
true : 动态添加新的字段--缺省
false : 忽略新的字段
strict : 如果遇到新字段抛出异常
配置参数 dynamic 可以用在根 object 或任何 object 类型的字段上
PUT /my_index
{
"mappings": {
"my_type": {
"dynamic": "strict",
"properties": {
"title": { "type": "string"},
"stash": {
"type": "object",
"dynamic": true
}
}
}
}
}
my_type :如果遇到新字段,对象 my_type 就会抛出异常。
stash :遇到新字段就会动态创建新字段。
日期检测
PUT /my_index
{
"mappings": {
"my_type": {
"date_detection": false
}
}
}
使用这个映射,字符串将始终作为 string 类型。如果你需要一个 date 字段,你必须手动添加。
索引-重新索引
批量重新索引
同时并行运行多个重建索引任务,但是你显然不希望结果有重叠。正确的做法是按日期或者时间 这样的字段作为过滤条件把大的重建索引分成小的任务
GET /old_index/_search?scroll=1m
{
"query": {
"range": {
"date": {
"gte": "2014-01-01",
"lt": "2014-02-01"
}
}
},
"sort": ["_doc"],
"size": 1000
}
索引-索引别名和零停机
有两种方式管理别名: _alias 用于单个操作, _aliases 用于执行多个原子级操作。
创建索引 my_index_v1 , 设置别名 my_index 指向 my_index_v1
PUT /my_index_v1
PUT /my_index_v1/_alias/my_index
检测这个别名指向哪一个索引
GET /*/_alias/my_index
哪些别名指向这个索引
GET /my_index_v1/_alias/*
同时并行运行多个重建索引任务,但是你显然不希望结果有重叠。正确的做法是按日期或者时间 这样的字段作为过滤条件把大的重建索引分成小的任务
GET /old_index/_search?scroll=1m
{
"query": {
"range": {
"date": {
"gte": "2014-01-01",
"lt": "2014-02-01"
}
}
},
"sort": ["_doc"],
"size": 1000
}