相关概念

  • 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的关联关系

倒排索引不是根据id找到文档,而是根据单词找到id

查询过程

查询包含“搜索引擎”的文档

  1. 通过倒排索引获得“搜索引擎”对应的文档id列表,有1,3
  2. 通过正排索引查询1和3的完整内容
  3. 返回最终结果

    组成

  • 单词词典(Term Dictionary),记录所有文档的单词,一般都比较大。还会记录单词到倒排列表的关联信息
  • 倒排列表(Posting List),记录了单词对应的文档集合,由倒排索引项组成

单词词典
实现一般用b+树
倒排列表

  • 文档id
  • 单词频率,出现的次数,用于后续相关性得分
  • 位置,在文档分词中的位置,用于语句搜索
  • 偏移,记录单词在文档的开始和结束位置,实现高亮显示

    集群状态查看

  • 查看集群健康状态

    1. GET /_cat/health?v
  • 查看节点状态

    1. GET /_cat/nodes?v
  • 查看所有索引信息

    1. GET /_cat/indices?v

    类型操作

  • 查看文档的类型

    1. GET /bank/account/_mapping

    数据搜索

  • 搜索全部 match_all

    1. GET /bank/_search
    2. {
    3. "query": { "match_all": {} }
    4. }
  • 分页搜索 from表示偏移量 size表示每页显示的数量

    1. GET /bank/_search
    2. {
    3. "query": { "match_all": {} },
    4. "from": 0,
    5. "size": 10
    6. }
  • 搜索排序,使用sort表示

    1. GET /bank/_search
    2. {
    3. "query": { "match_all": {} },
    4. "sort": { "balance": { "order": "desc" } } # 按balance降序
    5. }
  • 搜索并返回指定字段内容,使用_source表示

    1. GET /bank/_search
    2. {
    3. "query": { "match_all": {} },
    4. "_source": ["account_number", "balance"]
    5. }
  • 条件搜索 使用match表示匹配条件, 对数值是精确匹配,对文本类型是模糊匹配

    1. GET /bank/_search
    2. {
    3. "query": {
    4. "match": {
    5. "account_number": 20
    6. }
    7. }
    8. }
  • 短语匹配

    1. GET /bank/_search
    2. {
    3. "query": {
    4. "match_phrase": {
    5. "address": "mill lane"
    6. }
    7. }
    8. }
  • 组合搜索,使用bool,must表示同时满足

    1. GET /bank/_search
    2. {
    3. "query": {
    4. "bool": {
    5. "must": [
    6. { "match": { "address": "mill" } },
    7. { "match": { "address": "lane" } }
    8. ]
    9. }
    10. }
    11. }
  • 组合搜索,should表示任意一个

    1. GET /bank/_search
    2. {
    3. "query": {
    4. "bool": {
    5. "should": [
    6. { "match": { "address": "mill" } },
    7. { "match": { "address": "lane" } }
    8. ]
    9. }
    10. }
    11. }
  • 组合搜索,must_not表示同时不满足

    1. GET /bank/_search
    2. {
    3. "query": {
    4. "bool": {
    5. "must_not": [
    6. { "match": { "address": "mill" } },
    7. { "match": { "address": "lane" } }
    8. ]
    9. }
    10. }
    11. }
  • 组合搜索,组合must和must_not

    1. GET /bank/_search
    2. {
    3. "query": {
    4. "bool": {
    5. "must": [
    6. { "match": { "age": "48" } }
    7. ],
    8. "must_not": [
    9. { "match": { "state": "ID" } }
    10. ]
    11. }
    12. }
    13. }
  • 搜索过滤 使用filter表示

    1. GET /bank/_search
    2. {
    3. "query": {
    4. "bool": {
    5. "must": { "match_all": {} },
    6. "filter": {
    7. "range": {
    8. "balance": {
    9. "gte": 20000,
    10. "lte": 30000
    11. }
    12. }
    13. }
    14. }
    15. }
    16. }
  • 搜索聚合,用aggs来表示,类似Mysql中的group buy,例如对state字段进行聚合,统计出相同state的文档数量;

    1. GET /bank/_search
    2. {
    3. "size": 0,
    4. "aggs": {
    5. "group_by_state": {
    6. "terms": {
    7. "field": "state.keyword"
    8. }
    9. }
    10. }
    11. }
  • 嵌套聚合

    1. GET /bank/_search
    2. {
    3. "size": 0,
    4. "aggs": {
    5. "group_by_state": {
    6. "terms": {
    7. "field": "state.keyword"
    8. },
    9. "aggs": {
    10. "average_balance": {
    11. "avg": {
    12. "field": "balance"
    13. }
    14. }
    15. }
    16. }
    17. }
    18. }
  • 对聚合搜索的结果进行排序,例如按balance的平均值降序排列

    1. GET /bank/_search
    2. {
    3. "size": 0,
    4. "aggs": {
    5. "group_by_state": {
    6. "terms": {
    7. "field": "state.keyword".
    8. "order": {
    9. "average_balance": "desc"
    10. }
    11. },
    12. "aggs": {
    13. "average_balance": {
    14. "avg": {
    15. "field": "balance"
    16. }
    17. }
    18. }
    19. }
    20. }
    21. }
  • 按字段值的范围进行分段聚合

    1. GET /bank/_search
    2. {
    3. "size": 0,
    4. "aggs": {
    5. "group_by_age": {
    6. "range": {
    7. "field": "age",
    8. "ranges": [
    9. {
    10. "from": 20,
    11. "to": 30
    12. },
    13. {
    14. "from": 30,
    15. "to": 40
    16. },
    17. {
    18. "from": 40,
    19. "to": 50
    20. }
    21. ]
    22. },
    23. "aggs": {
    24. "group_by_gender": {
    25. "terms": {
    26. "filed": "gender.keyword"
    27. },
    28. "aggs": {
    29. "average_balance": {
    30. "avg": {
    31. "field": "balance"
    32. }
    33. }
    34. }
    35. }
    36. }
    37. }
    38. }
    39. }