基本背景
官方对es的定位是分布式搜索和分析引擎,它专为海量搜索而生.比如想往自己的网站加入一个搜索框,或者做日志的采集和检索时都可以使用es.
MySQL自从引入ngram解析器之后也支持全文搜索,但是它在性能和功能完备性上与es都相去甚远.MySQL是单机强事务的,而es是天然分布式的;MySQL仅支持简单的分词策略,而es可以对搜索结构做复杂的自定义处理.
一些概念
- Shards: 分片,当索引上的数据量太大的时候,我们通常会将一个索引上的数据进行水平拆分,拆分出来的每个数据库叫作一个分片。
- index: 索引,类似于MySQL的表,可以约束其内数据的类型和特性
- settings: 定义了index的分片数,副本数等信息
- mapping: 定义了index中每个字段的类型,分词器等信息,与setting一起组成index的建表语句
- type: 7.0之后已经废弃的一个结构
- document: 文档,类似于MySQL的行,即一条条的数据
- field: 字段,类似于MySQL的列
- analyzer: 分词器,决定如何对文档或输入进行拆分.常用的中文分词器是ik.
基础操作
创建索引
一般使用put方法创建索引
PUT /product_info
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
}
}
可以在创建时带上mapping
PUT /product_info
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
},
"mappings": {
"products": {
"properties": {
"productName": {
"type": "text",
"analyzer": "ik_smart"
},
"annual_rate":{
"type":"keyword"
},
"describe": {
"type": "text",
"analyzer": "ik_smart"
}
}
}
}
}
新建数据
POST /product_info/_bulk
{"index":{}}
{"productName":"大健康天天理财","annual_rate":"3.2200%","describe":"180天定期理财,最低20000起投,收益稳定,可以自助选择消息推送"}
{"index":{}}
{"productName":"西部通宝","annual_rate":"3.1100%","describe":"90天定投产品,最低10000起投,每天收益到账消息推送"}
{"index":{}}
{"productName":"安详畜牧产业","annual_rate":"3.3500%","describe":"270天定投产品,最低40000起投,每天收益立即到账消息推送"}
{"index":{}}
{"productName":"5G设备采购月月盈","annual_rate":"3.1200%","describe":"90天定投产品,最低12000起投,每天收益到账消息推送"}
{"index":{}}
{"productName":"新能源动力理财","annual rate":"3.0100%","describe":"30天定投产品推荐,最低8000起投,每天收益会消息推送"}
{"index":{}}
{"productName":"微贷赚","annual_rate":"2.7500%","describe":"热门短期产品,3天短期,无须任何手续费用,最低500起投,通过短信提示获取收益消息"}
查询数据
基本查询
GET /product_info/_search
{
"query": {
"match": {
"describe": "每天收益到账消息推送"
}
}
}
//在describe字段上查找包含该关键词的文档
范围查询
GET /product_info/_search
{
"query": {
"range": {
"annual_rate": {
"gte": "3.0000%",
"lte": "3.1300%"
}
}
}
}
//查找年化率在3%到3.13%之间的产品
其他复杂的查询语句:
https://n3xtchen.github.io/n3xtchen/elasticsearch/2017/07/05/elasticsearch-23-useful-query-example
https://www.imooc.com/article/71116
删除数据
DELETE /product_info/doc/3
数据类型
- 字符串类型: keyword(不分词),text(分词)
- 整数类型: long,integer,short,byte
- 浮点型: float,half_float,scaled_float
- 时间类型: date
- 布尔类型: boolean
- 二进制类型: binary
- 区间类型: integer_range,long_range,float_range,double_range,date_range
- 数组: array
- 对象: object
- 嵌套类型: nested
- 地理位置: geo-point,point,geo-shape
- ip类型: ip
- 范围类型: completion
- 令牌计数类型: token_count
- 附件类型: attachment
- 抽取类型: percolator