elastic_search 入门使用

elastic_search 入门使用

首页休闲益智合并兔子更新时间:2024-07-02
基本概念

一个doc代表索引里的一条数据,像数据库表里的一条记录,doc是用json格式来存储数据

es架构设计

架构各组件简单释义:

图片来源:掘金

请求逻辑图

来源:架构师修炼

创建、删除、变更操作创建索引

PUT /<index> PUT /report_index_1 { "settings": { "number_of_shards": 3, "number_of_replicas": 1 }, "mappings": { "properties": { "action_cost": { "type": "double" }, "activation": { "type": "long" }, "advertiser_name": { "type": "text", "fields":{ "keyword":{ "type":"keyword" } } }, "cover_url": { "type": "keyword" }, "created_at": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd HH:mm:ss.SSS ||yyyy-MM-dd || epoch_millis || strict_date_optional_time || yyyy-MM-dd'T'HH:mm:ss' '08:00" } } } } 创建doc

#指定id PUT /<index>/_doc/<_id> PUT /report_index_1/_doc/1 { "cover_url":"test2", "activation":100 } #不指定id POST /<index>/_doc POST /report_index_1/_doc/ { "cover_url":"test2", "activation":200 } #创建时如果已经存在doc, 报异常 PUT /report_index_1/_doc/10/_create { "cover_url": "test10", "activation": 1000 } 批量创建和操作

POST _bulk {"index":{"_index":"report_index_1","_id":"1"}} {"cover_url":"test1","activation":100, "advertiser_name":"张三, 今天星期一"} {"index":{"_index":"report_index_1","_id":"2"}} {"cover_url":"test2","activation":200,"advertiser_name":"李四,今天星期二"} {"index":{"_index":"report_index_1","_id":"3"}} {"cover_url":"test3","activation":300,"advertiser_name":"王五 今天星期三"} {"index":{"_index":"report_index_1","_id":"4"}} {"cover_url":"test4","activation":400, "advertiser_name":"马六 今天星期四"} {"create":{"_index":"report_index_1","_id":"5"}} {"cover_url":"test5","activation":500, "advertiser_name": "广告主"} {"delete":{"_index":"report_index_1","_id":"5"}} {"update":{"_id":"1","_index":"report_index_1"}} {"doc":{"cover_url":"test11"}} 更新index字段

es不支持对已存在字段做类型变更,如需要变更,需要reindex

PUT /<index>/_mapping PUT /report_index_1/_mapping { "properties": { "creative_create_time": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" } } } 更新doc

#按id更新 PUT /<index>/_doc/<_id> PUT /report_index_1/_doc/227 { "advertiser_name" : "嗨寿司-李" } #按条件更新 POST /report_index_1/_update_by_query { "query": { "term": { "advertiser_name": "嗨寿司-李" } } , "script": { "source": "ctx._source['advertiser_name'] = '嗨寿司'" } } 删除索引

DELETE /<index> DELETE /report_index_1 删除doc

DELETE /<index>/_doc/<_id> DELETE /report_index_1/_doc/137 清空doc

POST /report_index_1/_delete_by_query { "query": { "match_all": {} } } 常用的查询类型一般查询

GET /report_index_1/_search { "query": { "match_all": {} } }

GET /report_index_1/_doc/1

GET /report_index_1/_search { "query": { "wildcard": { "cover_url": { "value": "*4*" } } } }

GET /report_index_1/_search { "query": { "exists": { "field": "cover_url" } } }

GET /report_index_1/_search { "query":{ "range": { "activation": { "gt": 1, "lte": 200 } } } }

GET /report_index_1/_search { "query":{ "term": { "_id": { "value": "1" } } } }

GET /report_index_1/_search { "query": { "regexp": { "advertiser_name":"张*" } } }

bool query 可以用来合并多个过滤条件查询结果,它包含这如下几个操作符:

must : 查询必须出现在匹配的文档中

filter: 对于must,查询的分数将被忽略。缓存查询

must_not : 查询不得出现在匹配的文档中

should : 查询应该出现在匹配的文档中。(不强制匹配,如果匹配到,score更大,如果不存在must,至少一个should查询匹配)

所有 must 语句必须匹配,所有 must_not 语句都必须不匹配,但有多少 should 语句应该匹配呢?默认情况下,没有 should 语句是必须匹配的,只有一个例外:那就是当没有 must 语句的时候,至少有一个 should 语句必须匹配。就像我们能控制 [match 查询的精度](https://www.elastic.co/guide/cn/elasticsearch/guide/current/match-multi-word.html#match-precision) 一样,我们可以通过 minimum_should_match 参数控制需要匹配的 should 语句的数量,它既可以是一个绝对的数字,又可以是个百分比 .

GET /report_index_1/_search { "query": { "bool": { "must": [ { "terms": { "_id": [ "1", "2" ] } } ], "must_not": [ { "term": { "cover_url": { "value": "test2" } } } ], "should": [ { "term": { "cover_url": { "value": "test1" } } } ] } } } 文本查询

目前线上es文本分词用的是IK分词器

官方提供的分词器:

Fingerprint、Keyword、Language、Pattern、Simple、Standard、Stop、Whitespace

IK分词(中文):

IK analyzer: ik_smart, ik_max_word

GET /report_index_1/_search { "query": { "match": { "advertiser_name": { "query": "马六 今天", "analyzer": "standard" } } } }

GET /report_index_1/_search { "query": { "match_phrase": { "advertiser_name": { "query": "马六 今天", "analyzer": "standard" } } } }

POST /_analyze?pretty=true { "text":"张三, 今天星期一", "tokenizer":"ik_max_word" } 聚合查询(Aggregation)

相当于db的group by

分捅聚合

GET /report_index_1/_search { "query":{ "range":{ "activation":{ "gte":300 } } }, "size": 0, "aggs": { "my-agg-name": { "terms": { "field": "advertiser_name.keyword" } } } }

相当于db的聚合函数;max、avg

GET /report_index_1/_search { "query":{ "range":{ "activation":{ "gte":300 } } }, "size": 0, "aggs": { "my-agg-name-avg":{ "avg": { "field": "activation" } } } }

GET /report_index_1/_search?pretty { "size":0, "aggs": { "my-agg-name": { "terms": { "field": "advertiser_name.keyword" }, "aggs": { "my-sub-agg-name": { "avg": { "field": "activation" } } } } } }

管道聚合处理的对象是其它聚合的输出(桶或者桶的某些权值),而不是直接针对文档。

管道聚合的作用是为输出增加一些有用信息。

buckets_path:用于计算均值的权值路径

{ "aggs" : { "sales_per_month" : { "date_histogram" : { "field" : "date", "interval" : "month" }, "aggs": { "sales": { "sum": { "field": "price" } } } }, "avg_monthly_sales": { "avg_bucket": { //对所有月份的销售总 sales 求平均值 "buckets_path": "sales_per_month>sales" } } } } 集群基本信息查询

GET /

GET /_cluster/health?pretty

GET /_cat/indices

GET /report_index_1/_mapping 例子报表条件查询

POST /report_index_1/_search { "aggregations":{ "count":{ "cardinality":{ "field":"unit_id" } }, "group":{ "aggregations":{ "bucket_sort":{ "bucket_sort":{ "size":20 } }, "lately_top_hit":{ "top_hits":{ "size":1, "sort":[ { "unit_create_time":{ "order":"desc" } } ] } }, "max_create_time":{ "max":{ "field":"unit_create_time" } }, "sum_aclick":{ "sum":{ "field":"aclick" } }, "sum_bclick":{ "sum":{ "field":"bclick" } }, "sum_charge":{ "sum":{ "field":"charge" } }, "sum_photo_click":{ "sum":{ "field":"photo_click" } }, "sum_show":{ "sum":{ "field":"show" } } }, "terms":{ "field":"unit_id", "order":[ { "max_create_time":"desc" } ], "size":20 } }, "sum_aclick":{ "sum":{ "field":"aclick" } }, "sum_bclick":{ "sum":{ "field":"bclick" } }, "sum_charge":{ "sum":{ "field":"charge" } }, "sum_photo_click":{ "sum":{ "field":"photo_click" } }, "sum_show":{ "sum":{ "field":"show" } } }, "from":0, "query":{ "bool":{ "filter":[ { "range":{ "stat_date":{ "format":"yyyy-MM-dd", "from":"2021-06-08", "include_lower":true, "include_upper":true, "to":"2021-06-08" } } }, { "term":{ "campaign_id":62935142 } } ] } }, "size":0 } ,

大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved