创建一个索引(数据库)
PUT lagou # 索引名称
{
"settings": {
"index":{
"number_of_shards":5, # 分片数量(不可变更的)
"number_of_replicas":1 # 副本数量
}
}
}
获取指定的索引信息
GET lagou/_settings # 获取lagou索引库的设置信息
GET _all/_settings # 获取所有索引库的设置信息
GET .kibana,lagou/_settings # 获取kibana和lagou指定索引库的设置信息
GET _settings # 等效于GET _all/_settings
# 也可以直接GET索引获取信息
GET lagou
# 获取指定ID的所有索引信息
GET lagou/job/2
# 指定获取某个字段的索引信息(获取到ID为1的title和publish_date信息)
GET lagou/job/1?_source=title,publish_date
更新索引信息
PUT lagou/_settings
{
"number_of_replicas": 2 # 修改lagou的副本数量为2
}
保存文档到索引库当中
# 保存文档
PUT lagou/job/1
{
"title":"python java 大数据挖掘工程师",
"salary_min":25000,
"city":"北京",
"company":{
"name":"百度",
"company_addr":"北京软件园"
},
"publish_date":"2017-4-16",
"comments":15
}
PUT lagou/job/2
{
"title":"python django 爬虫开发工程师",
"salary_min":15000,
"city":"北京",
"company":{
"name":"百度",
"company_addr":"北京软件园"
},
"publish_date":"2017-4-16",
"comments":15
}
# 不指名ID值时必须使用POST命令
POST lagou/job/
{
"title":"python django 开发工程师",
"salary_min":30000,
"city":"上海",
"company":{
"name":"美团科技",
"company_addr":"北京市软件园A区"
},
"publish_date":"2017-4-16",
"comments":20
}
▼ _指数 |
▼
扫描二维码关注公众号,回复:
5628796 查看本文章
_类型 |
▼ _ID |
▲ _得分了 |
▼ 标题 |
▼ salary_min |
▼ 市 |
▼ 公司名 |
▼ company.company_addr |
▼ 出版日期 |
▼ 评论 |
---|---|---|---|---|---|---|---|---|---|---|
拉钩 |
工作 |
2 |
1 |
python django爬虫开发工程师 |
15000 |
北京 |
百度 |
北京软件园 |
2017年4月16日 |
15 |
拉钩 |
工作 |
1 |
1 |
python java大数据挖掘工程师 |
25000 |
北京 |
百度 |
北京软件园 |
2017年4月16日 |
15 |
拉钩 |
工作 |
AWhUyE6T4nXYmxBzQQAy |
1 |
python django开发工程师 |
30000 |
上海 |
美团科技 |
北京市软件园甲区 |
2017年4月16日 |
20 |
修改文档数据和字段值
# 修改删除了ID为1的company_addr字段(覆盖式修改)
PUT lagou/job/1
{
"title":"python java 大数据挖掘工程师",
"salary_min":25000,
"city":"北京",
"company":{
"name":"百度"
},
"publish_date":"2017-4-16",
"comments":15
}
# 指定修改ID为1的字段comments的值为30(指定式修改)
# 方法POST 关键字_update
POST lagou/job/1/_update
{
"doc":{
"comments":30
}
}
删除指定索引数据和删除索引库
# 删除
DELETE lagou/job/1 # 删除ID为1的索引数据
DELETE lagou # 删除索引为lagou的所有
一次性批量获取查询多条索引数据
# 已经建立了一个名称为:testdb的索引库和job1、job2的表及一个title的字段
# _index的指向数据库和表也可为其他,实现同时查询多个条件(可应用于类似Mysql的关系表查询)
# 可不同的索引库查询
GET _mget
{
"docs":[
{
"_index":"testdb",
"_type":"job1",
"_id":1
},
{
"_index":"testdb",
"_type":"job2",
"_id":2
}
]
}
# 指向同一个索引库查询
GET testdb/_mget
{
"docs":[
{
"_type":"job1",
"_id":1
},
{
"_type":"job2",
"_id":1
}
]
}
# 指向同一索引库和同一表的数据查询
GET testdb/job1/_mget
{
"docs":[
{
"_id":1
},
{
"_id":2
}
]
}
# 或者更简便的方法(列表形式)查询同一索引库和同一表
GET testdb/job1/_mget
{
"ids":[1,2]
}
# 获取到的数据如下:
{
"docs": [
{
"_index": "testdb",
"_type": "job1",
"_id": "1",
"_version": 3,
"found": true,
"_source": {
"title": "job1_1"
}
},
{
"_index": "testdb",
"_type": "job2",
"_id": "2",
"_version": 1,
"found": true,
"_source": {
"title": "job2_2"
}
}
]
}
操作散装批量
请|立即iTunes的电子杂志类型:索引(索引),删除(删除),更新(更新),创建(创建)
也可以从一个索引导入到另外
# bulk批量操作 如果索引库中没有test索引库时,bulk会自动创建一个名称为test的索引库及job的表
POST _bulk
{"index":{"_index":"test","_type":"job","_id":"3"}}
{"title":"PHP底层构架工程师","salary_min":20000,"city":"北京","company":{"name":"百度","company_addr":"北京市软件科技园D区5栋"},"publish_date":"2017-08-16","comments":20}
{"index":{"_index":"test","_type":"job","_id":"4"}}
{"title":"C++界面开发工程师","salary_min":25000,"city":"广州","company":{"name":"百度","company_addr":"北京市软件科技园D区5栋"},"publish_date":"2017-10-14","comments":10}
{"index":{"_index":"test","_type":"job","_id":"5"}}
{"title":"AI网站美工设计工程师","salary_min":15000,"city":"杭州","company":{"name":"阿里巴巴","company_addr":"杭州高新科技园阿里巴巴园区"},"publish_date":"2017-11-25","comments":10}
# 索引数据增量操作(ID 1、2、3...)
{"index":{"_index":"sssdb","_type":"tttt","_id":"1"}}
{"字段名":"字段值"}
{"index":{"_index":"sssdb","_type":"tttt","_id":"2"}}
{"字段名":"字段值2"}
{"index":{"_index":"sssdb","_type":"tttt","_id":"3"}}
{"字段名":"字段值3"}
....
# 索引数据批量删除(ID 1、2、3...)
{"delete":{"_index":"sssdb","_type":"tttt","_id":"1"}}
{"delete":{"_index":"sssdb","_type":"tttt","_id":"2"}}
{"delete":{"_index":"sssdb","_type":"tttt","_id":"3"}}
.....
# 索引数据批量创建(ID 1、2、3...)
{"create":{"_index":"sssdb","_type":"tttt","_id":"1"}}
{"字段名":"字段值1"}
{"create":{"_index":"sssdb","_type":"tttt","_id":"2"}}
{"字段名":"字段值2"}
{"create":{"_index":"sssdb","_type":"tttt","_id":"3"}}
{"字段名":"字段值3"}
....
# 索引数据批量更新(ID1、2、3...)
{"update":{"_id":"1","_type":"tttt","_index":"sssdb"}}
{"doc":{"字段名":"字段值1"}}
{"update":{"_id":"2","_type":"tttt","_index":"sssdb"}}
{"doc":{"字段名":"字段值2"}}
{"update":{"_id":"3","_type":"tttt","_index":"sssdb"}}
{"doc":{"字段名":"字段值3"}}
....
映射(映射)
定义数据字段的类型及相关属性,是否如可以参与搜索等
内置的类型
字符串类型:文本(分词分析),关键字(原样返回)(字符串类型在ES5开始已经废弃,也就是只匹配文本和关键词参与搜索)
数字类型:长(长整数),整数(整数),短(短整数),字节(字节),双(浮点数),浮子(浮点数)
日期类型:日期(包括时,分,秒)
布尔类型:布尔(布尔类型)
二进制类型:二进制(二进制)
复杂类型:对象(嵌套字典等),嵌套()
地理类型:地理点(经纬度标记),地理形状(多点标记)
专业类型:IP,赛区(搜索建议)
自定义索引的映射
# 自定义创建索引的映射
# 索引库名称:alibaba、表:job、字段:title、类型:text(根据需要填写)
# 嵌套的字典:company、嵌套的字段:name、类型:text
# 自定义创建索引的映射
PUT alibaba
{
"mappings":{
"job":{
"properties":{
"title":{
"type":"text"
},
"company"{
"properties":{
"name":{
"type":"text"
}
}
}
}
}
}
}
# 完整的创建一次索引库
# 自定义创建索引的映射
PUT alibaba
{
"mappings":{
"job":{
"properties":{
"title":{
"type":"text"
},
"salary_min":{
"type":"integer"
},
"city":{
"type":"keyword"
},
"company":{
"properties":{
"name":{
"type":"text"
},
"company_addr":{
"type":"text"
},
"employee_count":{
"type":"integer"
}
}
},
"publish_date":{
"type":"date",
"format":"yyyy-mm-dd"
},
"comments":{
"type":"integer"
}
}
}
}
}
# 数据存档
PUT alibaba/job/1
{
"title":"阿里巴巴销售代表成长快+双休福利好",
"salary_min":20000,
"company":{
"name":"阿里巴巴",
"company_addr":"企石镇东平村145号",
"employee_count":35
},
"publish_date":"2019-1-12",
"comments":20
}
# 查看定义的数据类型映射
GET alibaba/_mapping/job
索引数据查询分类:
基本查询:使用ES内置查询查询条件
组合查询:把多个查询组合在一起进行复合查询
过滤:查询同时,通过过滤条件在不影响打分的
bool格式如下:
bool:{
“filter”:[],(指定字段)
“must”:[],(数组所有都要满足)
“should”:[],(只要满足一个或多个都可以)
“ must_not“:{},(与必须相反,数组里一个都不满足时)
}
# 添加映射
PUT keycha
{
"mappings":{
"job":{
"properties": {
"title":{
"store": true,
"type":"text",
"analyzer": "ik_max_word"
},
"company_name":{
"store":true,
"type":"keyword"
},
"desc":{
"type":"text"
},
"comments":{
"type":"integer"
},
"add_time":{
"type":"date",
"format":"yyy-mm-dd"
}
}
}
}
}
# 插入数据
POST keycha/job
{
"title":"python django 开发工程师",
"company_name":"美团科技有限公司",
"desc":"对django的概念熟悉,熟悉python基本知识",
"comments":20,
"add_time":"2017-4-1"
}
POST keycha/job
{
"title":"python scrapy redis分布式爬虫基本",
"company_name":"百度科技有限公司",
"desc":"对scrapy的概念熟悉,熟悉redis基本知识",
"comments":5,
"add_time":"2017-4-15"
}
POST keycha/job
{
"title":"elasticsearch打造搜索引擎",
"company_name":"阿里巴巴科技有限公司",
"desc":"熟悉数据结构算法,熟悉python的基本开发",
"comments":15,
"add_time":"2017-6-20"
}
POST keycha/job
{
"title":"python打造推荐搜索引擎系统",
"company_name":"阿里巴巴科技有限公司",
"desc":"熟悉推荐引擎的原理及算法,掌握C语言",
"comments":60,
"add_time":"2016-10-20"
}
# match查询
# match查询会将字母都转换为小写和对词组进行分词进行查询
GET keycha/job/_search
{
"query":{
"match":{
"title":"爬取"
}
}
}
# term查询
# 查询值不做任何处理,直接查询(全量查询,不分词和转换小写)
GET keycha/_search
{
"query":{
"term":{
"title":"python"
}
}
}
# terms查询
# 转换和分词后列表中只要有一个词匹配就会返回结果
GET keycha/_search
{
"query":{
"terms":{
"title":["工程师","Django","系统"]
}
}
}
# 控制查询的返回数量
# from为起始数,size为获取数量(如果从1开始就会舍弃第0条数据)
GET keycha/_search
{
"query":{
"match":{
"title":"python"
}
},
"from":1,
"size":3
}
# match_all查询
# 获取keycha的job内的所有数据
GET keycha/_search
{
"query":{
"match_all": {}
}
}
# match_phrase短语查询
# 必须满足词条的所有词才会返回结果
# slop为词条之间的最小单位距离,如果距离小于就不返回
GET keycha/_search
{
"query": {
"match_phrase": {
"title":{
"query":"python系统",
"slop":9
}
}
}
}
# multi_match查询
# 比如可以指定多个字段
# 比如查询title和desc这两个字段里面包含python的关键词文档
# title^3表示title的权重是desc的3倍
GET keycha/_search
{
"query":{
"multi_match":{
"query":"python",
"fields":["title^3","desc"]
}
}
}
# 指定返回字段
# 列表中指定了desc但是没有返回结果,因为在创建映射时store默认是Flaes的,只有设置store为True时才会返回到数据
GET keycha/_search
{
"stored_fields": ["title","company_name","desc"],
"query": {
"match":{
"title":"python"
}
}
}
# 通过sort把结果排序
# match_all把所有文档查询出来,然后sort排序comments字段的值(desc是降序排序方法,还有asc是升序排序方法)
GET keycha/_search
{
"query": {
"match_all": {}
},
"sort":[{
"comments":{
"order":"desc"
}
}]
}
# range范围查询方法
# gte:大于等于、gt:大于、lte:小于等于、lt:小于
# boost 为权重
GET keycha/_search
{
"query": {
"range":{
"comments":{
"gte":10,
"lte":60,
"boost":2.0
}
}
}
}
# range日期范围查询方法
# get大于等于2017-04-01
# lte小于等于当前日期
GET keycha/_search
{
"query": {
"range":{
"add_time":{
"gte":"2017-04-01",
"lte":"now"
}
}
}
}
# wildcard模糊查询
# 支持*号通配符进行查询的方法(不支持中文)
GET keycha/_search
{
"query": {
"wildcard":{
"title":{
"value": "py*n",
"boost": 2
}
}
}
}
复合组合查询的多种方法
# 建立测试数据
POST testdb/job/_bulk
{"index":{"_id":1}}
{"salary":10,"title":"Python"}
{"index":{"_id":2}}
{"salary":20,"title":"Scrapy"}
{"index":{"_id":3}}
{"salary":30,"title":"Django"}
{"index":{"_id":4}}
{"salary":30,"title":"Elasticsearch"}
# bool格式如下:
#bool:{
# "filter":[], (字段过滤)
# "must":[], (数组所有都要满足)
# "should":[], (只要满足一个或多个都可以)
# "must_not":{}, (与must相反,数组里一个都不满足时)
#}
# 简单的过滤查询
# 最简单的filter查询
# 薪资为20k的工作
# 先设定bool>must>match_all获取所有数据>filter指定字段>term指定查询
GET testdb/job/_search
{
"query":{
"bool": {
"must": {
"match_all":{}
},
"filter": {
"term": {
"salary":20
}
}
}
}
}
# 指定查询多个值用terms进行列表多值查询
GET testdb/job/_search
{
"query":{
"bool": {
"must": {
"match_all":{}
},
"filter": {
"terms": {
"salary":[10,20]
}
}
}
}
}
# 查看分析器解析的结果
# ik_max_word会将单个字也分为一个词
GET /_analyze
{
"analyzer":"ik_max_word",
"text":"python网络工程师系统开发的"
}
# 查看分析器解析的结果
# ik_smart以最小数据集进行分词(连词)
GET /_analyze
{
"analyzer":"ik_smart",
"text":"python网络工程师系统开发的"
}
# 查询salary等于20或title等于python 且 salary不等于30
GET testdb/job/_search
{
"query": {
"bool": {
"should": [
{"term":{"salary":20}},
{"term":{"title":"python"}}
],
"must_not": {
"term":{"salary":30}
}
}
}
}
# 查询title等于"python"或(title等于elasticsearch 且 salary等于30)
# 嵌套查询是从内往外计算条件的
GET testdb/job/_search
{
"query": {
"bool": {
"should": [
{"term": {"title":"python"}},
{"bool":{
"must":[
{"term":{"title":"elasticsearch"}},
{"term":{"salary":30}}
]
}
}
]
}
}
}
# 指点两个字段值查询
GET xiangguang/_search
{
"query":{
"bool":{
"must":[
{"match_phrase":{"soci":{"query":"海绵"}}},
{"term":{"s_type":"sell"}}
]
}
}
}
处理无效的数据和取反的方法
# 过滤空和非空数据
# 建立测试数据到testdb的job2当中
POST testdb/job2/_bulk
{"index":{"_id":"1"}}
{"tags":["search"]}
{"index":{"_id":"2"}}
{"tags":["search","python"]}
{"index":{"_id":"3"}}
{"tags":["some data"]}
{"index":{"_id":"4"}}
{"tags":null}
{"index":{"_id":"5"}}
{"tags":["search",null]}
# 处理为null的方法
# 查询的tags不包含null的数据
GET testdb/job2/_search
{
"query": {
"bool":{
"filter":{
"exists":{
"field":"tags"
}
}
}
}
}
# 查询tags为null的数据
# 利用must_not取反的方法来取null的数据
GET testdb/job2/_search
{
"query":{
"bool":{
"must_not": {
"exists":{
"field":"tags"
}
}
}
}
}