聚合可以让我们极其方便的实现对数据的统计、分析、运算。查询速度非常快,可以实现近实时搜索效果
聚合常见的有三类:
参加聚合的字段必须是:keyword、日期、数值、布尔类型
Bucket聚合语法
GET /索引库名/_search
{
"size":0, //设置size为0,结果中不包含文档,只包含聚合结果
"aggs":{//定义聚合
"brandAgg":{//给聚合起个名字
"terms":{//聚合的类型,按照品牌值聚合,所以会选择term
"field":"brand",//参与聚合的字段
"size":20 //希望获取的聚合结果数量
}
}
}
}
默认情况下,Bucket聚合会统计Bucket内的文档数量,即为count,并且按照count降序排序。可以指定order属性,自定义聚合的排序方式:
限定聚合范围
默认情况下,Bucket聚合是对索引库的所有文档做聚合,但真实场景下,用户会输入搜索条件,因此聚合必须是对搜索结果聚合。那么聚合必须添加限定条件。
我们可以限定要聚合的文档范围,只要添加query条件即可
GET /hotel/_search
{
"query": {
"range": {
"price": {
"lte": 200 // 只对200元以下的文档聚合
}
}
},
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"size": 20
}
}
}
}
Metric聚合语法
GET /hotel/_search
{
"size": 0,
"aggs": {
"brandAgg": {
"terms": {
"field": "brand",
"size": 20
},
"aggs": { // 是brands聚合的子聚合,也就是分组后对每组分别计算
"score_stats": { // 聚合名称
"stats": { // 聚合类型,这里stats可以计算min、max、avg等
"field": "score" // 聚合字段,这里是score
}
}
}
}
}
}
score_stats聚合是在brandAgg的聚合内部嵌套的子聚合。因为我们需要在每个桶分别计算。
首先要安装拼音分词器
POST /_analyze
{
"text": "如家酒店还不错",
"analyzer": "pinyin" //单个字变拼音
}
效果是,单个字的拼音和一句话的首字母缩写展示,没有分词不是理想的搜索结果。
每个词条形成一组拼音,需要对拼音分词器做个性化定制,形成自定义分词器。
elasticsearch中分词器(analyzer)的组成包含三部分:
PUT /test
{
"settings": {
"analysis": {
"analyzer": { // 自定义分词器
"my_analyzer": { // 分词器名称
"tokenizer": "ik_max_word",
"filter": "py"
}
},
"filter": { // 自定义tokenizer filter
"py": { // 过滤器名称
"type": "pinyin", // 过滤器类型,这里是pinyin
"keep_full_pinyin": false,
"keep_joined_full_pinyin": true,
"keep_original": true,
"limit_first_letter_length": 16,
"remove_duplicated_term": true,
"none_chinese_pinyin_tokenize": false
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "my_analyzer",
"search_analyzer": "ik_smart"
}
}
}
}
总结:
如何使用拼音分词器?
如何自定义分词器?
拼音分词器注意事项?
elasticsearch提供了Completion Suggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。为了提高补全查询的效率,对于文档中字段的类型有一些约束:
// 自动补全查询
GET /test/_search
{
"suggest": {
"title_suggest": {
"text": "s", // 关键字
"completion": {
"field": "title", // 补全查询的字段
"skip_duplicates": true, // 跳过重复的
"size": 10 // 获取前10条结果
}
}
}
}
常见的数据同步方案有三种:
同步调用

异步通知

监听binlog

方式一:同步调用
方式二:异步通知
方式三:监听binlog
单机的elasticsearch做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题。
ES集群相关概念:
解决问题:数据量太大,单点存储量有限的问题。此时,我们把数据分成3片:shard0、shard1、shard2
数据备份可以保证高可用,但是每个分片备份一份,所需要的节点数量就会翻一倍,成本很高。
为了在高可用和成本间寻求平衡,我们可以这样做:
这样可以大大减少所需要的服务节点数量。

默认情况下,集群中的任何一个节点都同时具备上述四种角色。
但是真实的集群一定要将集群职责分离:
职责分离可以让我们根据不同节点的需求分配不同的硬件去部署。而且避免业务之间的互相干扰。
脑裂问题
解决方案
小结
master eligible节点的作用是什么?
data节点的作用是什么?
coordinator节点的作用是什么?
当新增文档时,应该保存到不同分片,保证数据均衡。
原理
elasticsearch会通过hash算法来计算文档应该存储到哪个分片:
shard = hash(_routing)% number_of_shards
新增文档流程:

elasticsearch的查询分成两个阶段:
集群的master节点会监控集群中的节点状态,如果发现有节点宕机,会立即将宕机节点的分片数据迁移到其它节点,确保数据安全,这个叫做故障转移。