一、背景
前面已经对elasticsearch的核心概念进行比较详细的介绍,但是在实际生产中我们如何使用elasticsearch呢?
本篇文章我们先介绍一些elasticsearch常见的使用方法,然后通过一个实际的例子来加深对elasticsearch使用的理解。这个实际例子是网站上收集的用户点击菜单的行为日志数据存储在elasticsearch上,并可以通过工具可以通过一些图表来分析用户的行为。总体的目标:满足多个维度图表的查看,索引可以定期归档或者存储不用人工干预。
二、映射和模板
2.1 映射
映射为类似于数据库字段的定义,比如可以定义映射的字段名称、字段类型、倒排索引配置等。
通过rest api可以查看具体的索引映射关系
Request: GET /operate_log_test-000144
Response:
{
"operate_log_test-000144":{
"aliases":{
"alias_operate_log_test_index":{
"is_write_index":false
}
},
"mappings":{
"properties":{
"createdOrg":{
"type":"keyword"
},
"content":{
"type":"text"
},
"updatedTime":{
"type":"date"
}
}
},
"settings":{
"number_of_shards":"1",
"creation_date":"1629881813094",
"number_of_replicas":"0",
"uuid":"eMsw1FJWTBKbj8-_vPpVbg",
"version":{
"created":"7040099"
}
}
}
}
2.1.1 自动识别
在写入文档的时候,索引不存在会自动创建索引,elasticsearch会自动根据文档(json)推算出自动类型。
-
字符串,日期格式字符串会设置成date,数字会设置成float/long,其它的字符串会设置成text,并增加一个子字段keyword;
-
布尔值,会推算成boolean
-
浮点数,float
-
整数,long
-
对象,object
注意:在实际生产使用中,不要使用自动识别类型,容易出错。需要显示设置字段类型。而且索引映射类型一旦确定了就无法修改了。可能对查询产生影响,字段自定义设置还可以根据使用场景合理设置类型,比如去掉不必要的分词,从而优化elasticsearch的空间。
2.1.2 显示设置
dynamic显示设置有三个选项:
-
True,如果文档有新字段,自动识别并写入
-
False,新增的字段会被丢弃
-
Strict, 新增字段拒绝写入
如下的设置,将dynamic设置为strict,写入时就不能新增字段,否则会报错。
PUT operate_log_dev-000085_mapping
{
"dynamic":"strict"
}
2.2 模版
我们在使用的elasticsearch索引的时候,一个索引的容量不易太大,比如日志可以按照时间来创建索引。所有的所有的设置和映射应该一致,我们可以使用索引模板。它的作用就是帮你设置mapping和setttings,自动匹配到新创建的所有上。
PUT /_template/trace_segment_record_template
{
"index_patterns":[
"trace_segment_record_*"
],
"order":1,
"settings":{
"number_of_shards":1,
"number_of_replicas":0
},
"mappings":{
"traceId":{
"type":"keyword"
},
"latency":{
"type":"long"
}
}
}
三、查询
elasticsearch的search api分为两种,一种为url search,这种就是在url中使用查询参数。另一种为request body search,基于json的查询语句,俗称dsl语句。
3.1 Url search
和get请求类似,在url请求url中加查询条件,如示例:
GET /索引名称/_search?q=createdOrgName:总公司。
这里还可以加入更多的语法,如from,to分页,排序、正则表达式等多个规则。更多的功能和语法可以参看官方api文档。
3.2 DSL查询
3.2.1 match查询、Match Phrase Query
会对输入的查询进行分词,生成的每个词项进行底层查询,最终将结果汇总并且会算分。
GET /operate_log_test-000144/_search
{
"_source":[
"operatorAfter",
"menu*"
],
"from":0, //分页起始页数
"size":10, //分页的大小
"sort":[
{ //排序
"createdTime":
{
"order":"desc"
}