ES笔记1_ElasticSearch介绍和基本操作

ES是什么?

ES是一个分布式的近实时搜索[Office1] 和分析引擎

用于全文搜索、结构化查询、分析计算或三者结合

开源,构建于Apache Lucence之上

提供RESTful API[Office2] 和Java API

面向文档,JSON格式

 

ES中重要概念?

集群

节点

分片:将索引分成多个块,每块叫做一个分片,分片带来规模上(数据水平切分[Office3] )和性能上(并行执行)的提升

复制分片:对主分片的复制,可以提供节点失败时的高可用能力,同时提升搜索时的并发性能

 

ES中概念与mysql对应关系?

ES笔记1_ElasticSearch介绍和基本操作_第1张图片

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

ES笔记1_ElasticSearch介绍和基本操作_第2张图片

操作之Document

ES笔记1_ElasticSearch介绍和基本操作_第3张图片

-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,[email protected]"
                    }
                },
                {
                    "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中。数据的导入需要三步:
    1. 设定ES mapping 
    2. Hive建表
    3. 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]数据切分:将存在同一数据库中的数据分散存放到多个数据库中,以达到分散单台设备负载的效果

垂直切分:按照不同的表来切分到不同的数据库,适用于业务耦合度底的情况

水平切分:同一表中的不同数据拆分到不同数据库中,常见按日期

你可能感兴趣的:(大数据,ES,ElasticSearch,ES,Hive,ES查询,ES增删改查)