es基本操作

索引

PUT http://localhost:9200/job  // 创建索引
POST http://localhost:9200/job/_open  // 启动索引
POST http://localhost:9200/job/_close  // 关闭索引
GET http://localhost:9200/job  // 获取指定索引元数据
GET http://localhost:9200/_all  // 获取所有索引元数据
GET http://localhost:9200/_cat/indices?v  // 获取所有索引摘要数据
DELETE http://localhost:9200/job  // 删除索引

mapping

PUT http://localhost:9200/job/_mapping  // 创建mapping, Body:raw json

{
    "properties":{
        "title": {
            "type": "text"
        },
        "desc": {
            "type": "text"
        },
        "salary": {
            "type": "integer"
        },
        "city": {
            "type": "keyword"
        }
    }
}
GET http://localhost:9200/job/_mapping  // 获取指定索引的映射
GET http://localhost:9200/_mapping  // 获取所有索引的映射

文档

POST http://localhost:9200/job/_create/1  // 创建文档
{
    "title": "java高级工程师",
    "desc": "熟悉es,熟悉kafka",
    "salary": 22000,
    "city": "福州市"
}
POST http://localhost:9200/job/_doc/1  // 重建文档
{
    "title": "java高级工程师",
    "desc": "熟悉es,熟悉kafka,熟悉mysql",
    "salary": 22000,
    "city": "福州市"
}
GET http://localhost:9200/job/_doc/1  // 获取单个文档
POST http://localhost:9200/job/_doc/_mget  // 获取多个文档
{
    "ids": [1, 2]
}
DELETE http://localhost:9200/job/_doc/1  // 删除单个文档
GET http://localhost:9200/job/_search  // 获取所有文档

批量增删改bulk

POST http://localhost:9200/_bulk
{"index": {"_index": "job", "_type": "_doc", "_id": "15722"}}
{"jid":15722,"title":"java开发(北京)","salary":{"gte":8000,"lte":15000},"city":"北京","company":"南京华飞数据技术有限公司","description":" 岗位职责:1. 文档编写:根据项目经理的要求,参与开发设计文档的编写"}
{"create": {"_index": "job", "_type": "_doc", "_id": "15727"}}
{"jid":15727,"title":"java开发(北京)","salary":{"gte":8000,"lte":15000},"city":"北京","company":"南京华飞数据技术有限公司","description":" 岗位职责:1. 文档编写:根据项目经理的要求,参与开发设计文档的编写"}
{"delete": {"_index": "job", "_type": "_doc", "_id": "15726"}}

第一行说明
index:代表操作类型index-重建索引 , create-创建, delete-删除
_index:代表指向索引名
_type:固定为_doc
_id:要操作的数据id
第二行则是要操作的数据,在postman中最后要加一个空行

URI Query

GET http://localhost:9200/job/_search?q=SpringBoot&df=description&sort=jid:desc&from=0&size=10&timeout=1s  // 标准形式
GET http://localhost:9200/job/_search?q=description:SpringBoot  // 单字段查询
GET http://localhost:9200/job/_search?q=description:"spring cloud"  // phrase(短语)查询
GET http://localhost:9200/job/_search?q=description:(spring AND mysql)  // boolean查询
GET http://localhost:9200/job/_search?q=description:(spring OR mysql)  // boolean查询
GET http://localhost:9200/job/_search?q=description:(spring NOT mysql)  // boolean查询
GET http://localhost:9200/job/_search?q=salary:>=20000  // 范围查询
GET http://localhost:9200/job/_search?q=title:java*  // 通配符查询
GET http://localhost:9200/job/_search?q=description:SpringBot~1  // 单字段模糊匹配
GET http://localhost:9200/job/_search?q=description:"cloud spring"~2  // phrase(短语)模糊匹配

DSL Query

GET|POST http://localhost:9200/job/_search

  • 基本结构
{
    "from": 0,
    "size": 10,
    "sort": [{"jid": "desc"}],
    "_source": ["jid", "title", "city"],
    "query": {
        "macth_all": {}
    }
}
  • 精准匹配term
{
   "query": {
        "term": {
            "jid": 15726
        }
    }
}

{
   "query": {
        "terms": {
            "jid": [15726, 15725]
        }
    }
}
  • 单子段全文检索
{
   "query": {
        "match": {
            "description": "java架构师"
        }
    }
}

{
   "query": {
        "match": {
            "description": {
                 "query": "java 架构师",
                 "operator": "or"
            }
        }
    }
}
  • 多字段全文查询
{
   "query": {
        "multi_match": {
              "query": "金融",
              "fields": ["title", "description"]
        }
    }
}
  • 短语查询
{
   "query": {
        "match_phrase": {
            "description": {
                 "query": "was tomcat",
                 "slop": 1
            }
        }
    }
}
  • 范围查询
{
   "query": {
        "range": {
            "salary": {
                 "gte": "5000",
                 "lte": "10000"
            }
        }
    }
}
  • bool多字段复合查询

任务需求
某猎头公司为客户匹配工作岗位,客户要求工作地在北京,工资不得低于6000的java工程师岗位,项目要求使用spring cloud技术,如涉及shell编程的则重点考虑。

{
    "query": {
        "bool": {
            "must": {
                "match": {
                    "title": {
                        "query": "java 工程师",
                        "operator": "or"
                    }
                }
            },
            "filter": {
                "match": {
                    "city": "北京"
                }
            },
            "must_not": {
                "range": {
                    "salary": {
                        "lt": "15000"
                    }
                }
            },
            "should": [{
                "match_phrase": {
                    "description": {
                        "query": "spring cloud",
                        "boost": 2
                    }
                }},{
                "match": {
                    "description": "shell"
                }
            }],
            "minimum_should_match": 1
        }
    }
}

ik分词器安装

  1. 下载安装包,要与es版本相同
  2. 在es目录下plugin里创建ik文件夹,将安装包解压到该文件夹
  3. 重启es
elasticsearch‐plugin list

调试分词

GET http://localhost:9200/_analyze
{
  "analyzer" : "ik_max_word",  // ik_smart
  "text" : ["马保国语录:这两个年轻人不讲武德,来骗,来偷袭,我六十九岁的老同志,这好吗?这不好,我劝这位年轻人耗子尾汁,好好反思,以后不要再犯这样的聪明"]
}

Completion Suggester 自动完成

需要作为自动完成搜索的字段需要增加一个附属字段,如下

- 新建索引
- 创建mapping
POST http://localhost:9200/job1/_mapping
{
    "properties": {
        "jid" : {
            "type" : "long"
        },
        "title": {
            "type": "text"
        },
        "title_completion": {  // here
            "type": "completion"
        },
        "salary_text" : {
            "type": "text",
            "index": false
        },
        "city": {
            "type": "keyword"
        }
    }
}
  • bulk导入数据,title_completion与title内容相同
  • 前端每次输入框变化都需要查询这个api
GET http://127.0.0.1:9200/job1/_search
{
    "suggest": {
        "title‐suggest": {
            "prefix": "java工程师",
            "completion": {
                "field": "title_completion",
                "skip_duplicates": true,
                "analyzer": "ik_max_word",
                "size": 10
            }
        }
    }
}

聚合统计

  • 创建mapping时可以将预知会进行分组的字段(必须是keyword)设置eager_global_ordinals:true,则es在索引新文档时会进行分组预处理,将分组数据缓存,这样在分组聚合查询时大幅提高性能。
POST http://localhost:9200/employee/_mapping
{
    "properties": {
        "empno": {
            "type": "keyword"
        },
        "name": {
            "type": "keyword"
        },
        "job": {
            "type": "keyword"
        },
        "salary": {
            "type": "integer"
        },
        "age": {
            "type": "integer"
        },
        "gender": {
            "type": "keyword"
        },
        "dname": {
            "type": "keyword",
            "eager_global_ordinals": true
        }
    }
}
  • 单字段统计
    类似 select min(salary),avg(salary),max(salary) from employee group by salary
GET http://localhost:9200/employee/_search
{
    "size": 0,
    "aggs": {
        "min_salary": {
            "min": {
                "field": "salary"
            }
        },
        "max_salary": {
            "max": {
                "field": "salary"
            }
        },
        "avg_salary": {
            "avg": {
                "field": "salary"
            }
        }
    }
}
{
    "size": 0,
    "aggs": {
        "stats_salary": {
            "stats": {
                "field": "salary"
            }
        }
    }
}
  • bucket统计
    统计每个部门的人数
    类似 select count(*),dbname from employee group by dnname
GET http://localhost:9200/employee/_search
{
    "size": 0,
    "aggs": {
        "department": {
            "terms": {
                "field": "dname"
            }
        }
    }
}

获取每个部门工资最高的两个人的记录
类似 select * from employee group by dnname order by salary limit 2

GET http://localhost:9200/employee/_search
{
    "size": 0,
    "aggs": {
        "department": {
            "terms": {
                "field": "dname"
            },
            "aggs": {
                "top_salary": {
                    "top_hits": {
                        "size": 2,
                        "sort": [
                            {
                                "salary": {
                                    "order": "desc"
                                }
                            }
                        ]
                    }
                }
            }
        }
    }
}
  • range 范围分组
    统计各年龄段最高工资
GET http://localhost:9200/employee/_search
{
    "size": 0,
    "aggs": {
        "age_range": {
            "range": {
                "field": "age",
                "ranges": [
                    {
                        "key": "20岁以下",
                        "to": 20
                    },
                    {
                        "key": "20‐30岁",
                        "from": 20,
                        "to": 30
                    },
                    {
                        "key": "30‐40人岁",
                        "from": 30,
                        "to": 40
                    },
                    {
                        "key": "40‐50岁",
                        "from": 40,
                        "to": 50
                    },
                    {
                        "key": "50岁以上",
                        "from": 50
                    }
                ]
            },
            "aggs": {
                "top_salary": {
                    "top_hits": {
                        "size": 1,
                        "sort": [
                            {
                                "salary": {
                                    "order": "desc"
                                }
                            }
                        ]
                    }
                }
            }
        }
    }
}
  • Histogram阶梯分桶
    按5岁一个阶梯统计各阶段工资汇总数据
{
    "size": 0,
    "aggs": {
        "age_histogram": {
            "histogram": {
                "field": "age",
                "interval": 5,
                "extended_bounds": {
                    "min": 18,
                    "max": 65
                }
            },
            "aggs": {
                "stats_salary": {
                    "stats": {
                        "field": "salary"
                    }
                }
            }
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容