ES是什么?
ES是一个分布式的近实时搜索[Office1] 和分析引擎
用于全文搜索、结构化查询、分析计算或三者结合
开源,构建于Apache Lucence之上
提供RESTful API[Office2] 和Java API
面向文档,JSON格式
ES中重要概念?
集群
节点
分片:将索引分成多个块,每块叫做一个分片,分片带来规模上(数据水平切分[Office3] )和性能上(并行执行)的提升
复制分片:对主分片的复制,可以提供节点失败时的高可用能力,同时提升搜索时的并发性能
ES中概念与mysql对应关系?
Index:索引,对应关系型数据库中的数据库,通过名字在集群内唯一标识(必须全部小写)
Type:类别,对应关系型数据库中的表,通过名字在Index内唯一标识
Document:文档,通过id在Type内的唯一标识
Mapping:映射,对应关系型数据库的schema,确定Type及字段类型
数据类型
1.文本类型:text,当一个字段需要用于全文搜索(会被分词),应该用text类型
2.关键字类型:keyword,当一个字段需要按照精确值进行过滤、排序、聚合等操作时,就应该使用keyword类型
3.数据类型: byte:字节类型 short:短整型 integer:整型 long:长整型 float:浮点型
4.时间类型:date
5.布尔类型:boolean
6.二进制型:binary
7.范围类型:range
8.地理点类型:geo_point
等
操作之Index
操作之Document
-XPUT 代表如果有这条数则update,如果没有这条数则添加
操作之查询Query DSL
Query DSL包含两部分:
Filter:实现文档的yes/no逻辑,结果为符合条件的列表
Query:需要计算文档的相关性,结果为按相关性排序后的列表
由于排序步骤存在,一般而言Query比Filter性能稍差
Filter常用:
term完全匹配,适用于number、date、boolean或者未分析的精确字符串字段
exists判断某个字段是否存在
range范围匹配,gt、gte、lt、lte
bool结合不同query的逻辑或运算,操作符must、must not、should
Query常用
match_all匹配所有文档
match用来匹配某字段,会进行分词
match_phrase精确匹配
multi_match对多个字段使用相同的match
sort对搜索结果进行排序
查看有哪些索引:
curl -X GET "http://es-1:9200/_cat/indices?v"
创建索引和mapping:
curl -H "Content-Type: application/json" -XPUT 'http://es-1:10200/esindex?pretty=true' -d '{"mappings":{"estype":{"properties":{"activity_id":{"type":"integer"},"bi_type":{"type":"keyword"},"channel_id":{"type":"integer"}}}}}'
删除索引
curl -XDELETE 'http://es-1:9200/esindex'
查看mapping:
curl -X GET 'http://es-1:10200/index/_mapping/type'
示例1查询,当index只有一个type时,可省略type,size表示希望展示的数据条数:
curl 'localhost:9200/index/_search' -d '
{
"query": {
"term": {
"user_id": "8544100"
}
},
"size":100
}'
示例2查询,pretty表示查询结果以json格式展示,当遇到elasticsearch6.x {"error":"Content-Type header [application/x-www-form-urlencoded] is not supported"错误时,需要加上header -H "Content-Type: application/json"
curl 'http://localhost:9200/index/type/_search?pretty' -H 'Content-Type:application/json' -d '{
"query":{
"bool":{
"must":[
{
"match":{
"user_id":"933611"
}
}
]
}
}
}'
示例3查询多个条件
curl 'http://localhost: 9200/index/type/_search' -H 'Content-Type:application/json' -d '{
"query":{
"bool":{
"must":[
{
"match":{
"city_id":"1101"
}
},
{
"match":{
"polygon_id":"812,-3007,2195@3.0"
}
},
{
"match":{
"spark_common_count_day":"20181204"
}
}
]
}
}
}'
示例4:查询总条数
curl 'http://localhost:9200/index/type/_count?pretty'
示例5:插入数据
curl -XPUT 'http://localhost:9200/index/type/id/' -d '
{
"unid":"933611||201812",
"user_id":933611,
"finish_cnt":30,
"order_amt":70500,
"pay_amt":72900,
"drawback_amt":2400,
"deduct_amt":3600,
"recharge_amt":2500,
"re_award_amt":50000,
"etl_time":"2018-12-31T13:18:04+08:00",
"order_cnt":42,
"dt_ym":"201812"
}
示例6:删除数据
curl -XDELETE 'localhost:9200/index/type/id/'
示例7:查询后排序
curl 'http://ip:port/index/type/_search' -H 'Content-Type:application/json' -d '{
"query":{
"bool":{
"must":[
{
"match":{
"city_id":"2301"
}
},
{
"range":{
"day_not_receive_orders":{
"gte":3
}
}
}
]
}
},
"sort":[
{
"reception_probability":"asc"
}
],
"size":20
}'
其它
一、elasticsearch-sql 是 NLPChina 开源的项目,旨在使用SQL查询ES.
二、kopf 是一个与elasticsearch集群交互的插件,可以查看shard 分布,集群状态等信息
三、ElasticSearch Hive
- ElasticSearch-Hadoop 是 ElasticSearch 官方维护的一个子项目,用于连接ElasticSearch 和 Hadoop 两套系统,支持与Mapreduce、Hive、Pig、Spark等系统的结合
- ElasticSearch 将数据存储在本地,并不能直接利用HDFS中的数据,需要Hive将已经存在的表导入到ES中。数据的导入需要三步:
- 设定ES mapping
- Hive建表
- Insert数据
1、在ES中建立mapping,disable_all建议不要省略
PUT gal_dw
{
"mappings": {
"dwv_tkt_ride": {
"_all": {
"enabled": false
},
"properties": {
"line_id_m": {
"type": "long"
},
"depart_stop_id": {
"type": "long"
},
"start_loc": {
"type": "string"
}
}
}
}
}
2、在hive cli 中建立与要导入表对应的外部表
- add jar 命令将es与hive交互相关jar加入到classpath
- create 开始为建表语句,其中STORED BY为固定写法
- TBLPROPERTIES内则是一些参数设置项,es.nodes指定es服务器列表,es.resource指定index/type,es.mapping.names则建立hive表明与es filed 名的映射关系(一一映射可省略)
add jar file://elasticsearch-hadoop-2.2.0/dist/elasticsearch-hadoop-hive-2.2.0.jar;
CREATE EXTERNAL TABLE es_dwv_tkt_ride(
line_id bigint,
start_loc string,
...
actual_pay double,
year string,
month string,
day string )
STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler'
TBLPROPERTIES(
'es.nodes' = 'bigdata-dp-es001.bh:9200',
'es.resource' = 'gal_dw/dwv_tkt_ride',
'es.mapping.names' = 'line_id:line_id_m'
) ;
3、在Hive cli 中就可以使用insert语句向ES导入数据
- SET命令关闭不需要的Hive推测执行
- Insert 开始则将源表数据导入到上步建立的外部表中
SET hive.mapred.reduce.tasks.speculative.execution = false;
SET mapreduce.map.speculative = false;
SET mapreduce.reduce.speculative = false;
INSERT overwrite TABLE es_dwv_tkt_ride
select line_id, start_loc,
...,
actual_pay, year, monty, day from gal_dw.dwv_tkt_ride where concat(year,month,day)='20151231';
[Office1]近实时搜索:文档在被索引和可搜索间有延迟,大约1s
[Office2]通过一套统一的接口为各种不同前端设备提供服务
URL定位资源,用HTTP动词(GET,PUT,POST,DELETE)描述操作
[Office3]数据切分:将存在同一数据库中的数据分散存放到多个数据库中,以达到分散单台设备负载的效果
垂直切分:按照不同的表来切分到不同的数据库,适用于业务耦合度底的情况
水平切分:同一表中的不同数据拆分到不同数据库中,常见按日期