相关概念
- Near Realtime(近实时):Elasticsearch是一个近乎实时的搜索平台,这意味着从索引文档到可搜索文档之间只有一个轻微的延迟(通常是一秒钟)。
- Cluster(集群):集群是一个或多个节点的集合,它们一起保存整个数据,并提供跨所有节点的联合索引和搜索功能。每个集群自己的唯一集群名称,节点通过名称加入集群。
- Node(节点):节点是指属于集群的单个Elasticsearch实例,存储数据并参与集群的索引和搜索功能。可以将节点配置为按集群名称加入特定集群,默认情况下,每个节点都设置为加入一个名为
elasticsearch的群集。 - Index(索引):索引是一些具有相似特征的文档集合,类似于MySql中数据库的概念。
- Type(类型):类型是索引的逻辑类别分区,通常,为具有一组公共字段的文档类型,类似MySql中表的概念。
注意:在Elasticsearch 6.0.0及更高的版本中,一个索引只能包含一个类型。 - Document(文档):文档是可被索引的基本信息单位,以JSON形式表示,类似于MySql中行记录的概念。
- Shards(分片):当索引存储大量数据时,可能会超出单个节点的硬件限制,为了解决这个问题,Elasticsearch提供了将索引细分为分片的概念。分片机制赋予了索引水平扩容的能力、并允许跨分片分发和并行化操作,从而提高性能和吞吐量。
Replicas(副本):在可能出现故障的网络环境中,需要有一个故障切换机制,Elasticsearch提供了将索引的分片复制为一个或多个副本的功能,副本在某些节点失效的情况下提供高可用性。
倒排索引
需要引入三个变量,1:文档ID 2:单词 3:文档
正排索引:文档id到单词的关联关系
- 倒排索引:单词到文档id的关联关系
查询过程
查询包含“搜索引擎”的文档
- 单词词典(Term Dictionary),记录所有文档的单词,一般都比较大。还会记录单词到倒排列表的关联信息
- 倒排列表(Posting List),记录了单词对应的文档集合,由倒排索引项组成
单词词典
实现一般用b+树
倒排列表
- 文档id
- 单词频率,出现的次数,用于后续相关性得分
- 位置,在文档分词中的位置,用于语句搜索
-
集群状态查看
查看集群健康状态
GET /_cat/health?v
查看节点状态
GET /_cat/nodes?v
查看所有索引信息
GET /_cat/indices?v
类型操作
查看文档的类型
GET /bank/account/_mapping
数据搜索
搜索全部 match_all
GET /bank/_search{"query": { "match_all": {} }}
分页搜索 from表示偏移量 size表示每页显示的数量
GET /bank/_search{"query": { "match_all": {} },"from": 0,"size": 10}
搜索排序,使用sort表示
GET /bank/_search{"query": { "match_all": {} },"sort": { "balance": { "order": "desc" } } # 按balance降序}
搜索并返回指定字段内容,使用_source表示
GET /bank/_search{"query": { "match_all": {} },"_source": ["account_number", "balance"]}
条件搜索 使用match表示匹配条件, 对数值是精确匹配,对文本类型是模糊匹配
GET /bank/_search{"query": {"match": {"account_number": 20}}}
短语匹配
GET /bank/_search{"query": {"match_phrase": {"address": "mill lane"}}}
组合搜索,使用bool,must表示同时满足
GET /bank/_search{"query": {"bool": {"must": [{ "match": { "address": "mill" } },{ "match": { "address": "lane" } }]}}}
组合搜索,should表示任意一个
GET /bank/_search{"query": {"bool": {"should": [{ "match": { "address": "mill" } },{ "match": { "address": "lane" } }]}}}
组合搜索,must_not表示同时不满足
GET /bank/_search{"query": {"bool": {"must_not": [{ "match": { "address": "mill" } },{ "match": { "address": "lane" } }]}}}
组合搜索,组合must和must_not
GET /bank/_search{"query": {"bool": {"must": [{ "match": { "age": "48" } }],"must_not": [{ "match": { "state": "ID" } }]}}}
搜索过滤 使用filter表示
GET /bank/_search{"query": {"bool": {"must": { "match_all": {} },"filter": {"range": {"balance": {"gte": 20000,"lte": 30000}}}}}}
搜索聚合,用aggs来表示,类似Mysql中的group buy,例如对
state字段进行聚合,统计出相同state的文档数量;GET /bank/_search{"size": 0,"aggs": {"group_by_state": {"terms": {"field": "state.keyword"}}}}
嵌套聚合
GET /bank/_search{"size": 0,"aggs": {"group_by_state": {"terms": {"field": "state.keyword"},"aggs": {"average_balance": {"avg": {"field": "balance"}}}}}}
对聚合搜索的结果进行排序,例如按balance的平均值降序排列
GET /bank/_search{"size": 0,"aggs": {"group_by_state": {"terms": {"field": "state.keyword"."order": {"average_balance": "desc"}},"aggs": {"average_balance": {"avg": {"field": "balance"}}}}}}
按字段值的范围进行分段聚合
GET /bank/_search{"size": 0,"aggs": {"group_by_age": {"range": {"field": "age","ranges": [{"from": 20,"to": 30},{"from": 30,"to": 40},{"from": 40,"to": 50}]},"aggs": {"group_by_gender": {"terms": {"filed": "gender.keyword"},"aggs": {"average_balance": {"avg": {"field": "balance"}}}}}}}}
