ElasticSearch 学习、实践笔记

这篇具有很好参考价值的文章主要介绍了ElasticSearch 学习、实践笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、基础概念

1. 索引(Index):索引是 Elasticsearch 中最基本的数据存储单位,类似于关系型数据库中的数据库。一个索引可以包含多个文档,每个文档都有一个唯一的 ID,用于标识该文档。索引可以被分为多个分片,每个分片可以存储一部分文档数据。

 2. 文档(Document):文档是 Elasticsearch 中的基本数据单元,类似于关系型数据库中的行。每个文档都有一个唯一的 ID,用于标识该文档。文档可以包含多个字段,每个字段都有一个数据类型,例如字符串、数字、日期等。

3. 分片(Shard):分片是 Elasticsearch 中的数据分布方式,用于将索引分成多个部分,每个部分可以存储一部分文档数据。分片可以被分配到不同的节点上,以实现数据的分布式存储和查询。

4. 节点(Node):节点是 Elasticsearch 中的一个实例,它可以存储一部分数据和处理查询请求。一个节点可以属于一个或多个集群,每个集群可以包含多个节点。节点之间可以通过网络通信来协调数据的存储和查询。

架构是分布式的,它将数据分成多个分片存储在不同的节点上,通过网络通信来协调数据的存储和查询。这种架构可以实现高可用性、高性能和可扩展性。

二、创建索引

1.在客户端调用API创建索引(.NET CORE[c#])

/// <summary>
/// 如果索引不存在就创建
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public async Task CreateIndexIfNotExist<ESEntity>(string index)where ESEntity: ESBase,new ()
{
    if (index.IsNullOrEmpty())
    {
        return;
    }

    //指定分片数量
    IIndexState indexState = new IndexState
    {
        Settings = new IndexSettings
        {
            NumberOfReplicas = 0,  
            NumberOfShards = 5 
        } 
    };

    //自动映射 + 指定属性映射
    //https://blog.csdn.net/WuLex/article/details/71375032
    Func<CreateIndexDescriptor, ICreateIndexRequest> func = 
        x => x.InitializeUsing(indexState)
            .Map<ESEntity>(
                m => m.AutoMap()
                    .Properties(ps => ps
                      .Nested<ESContent>(n => n
                        .Name(c => c.Contents)
                        .AutoMap()
                            .Properties(ps => ps
                                .Nested<ESFileContent>(n => n
                                    .Name(c => c.FileContents)
                                    .AutoMap()
                        )))));

    var response = await Client.Indices.CreateAsync(index, func);

    if (response != null && response.ApiCall != null && response.ApiCall.DebugInformation.IsNotNullOrEmpty())
    {
        if (!response.ApiCall.Success)
        {
            Logger.LogInformation($"创建索引:{response.DebugInformation}"); 
        }
    }

}

2.直接执行 json脚本创建

PUT /my_index
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "description": {
        "type": "text"
      },
      "price": {
        "type": "float"
      },
      "date": {
        "type": "date"
      },
      "tags": {
        "type": "keyword"
      }
    }
  }
}

二、查询

Elasticsearch 支持多种查询类型,包括全文搜索查询、精确匹配查询、范围查询、布尔查询、聚合查询等;以下是使用 Elasticsearch 进行全文搜索查询、精确匹配查询、范围查询、布尔查询和聚合查询的示例:

1.全文搜索查询

GET /my_index/_search
{
  "query": {
    "match": {
      "description": "search term"
    }
  }
}

2.精确匹配查询

GET /my_index/_search
{
  "query": {
    "term": {
      "status": "active"
    }
  }
}

3.范围查询

GET /my_index/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 10,
        "lte": 100
      }
    }
  }
}

4.布尔查询

GET /my_index/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "description": "search term" } },
        { "term": { "status": "active" } }
      ],
      "must_not": [
        { "term": { "category": "books" } }
      ],
      "should": [
        { "term": { "brand": "Apple" } },
        { "term": { "brand": "Samsung" } }
      ]
    }
  }
}

5.聚合查询(统计总和、平均值、最大值和最小值...)


GET /index_topic/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "Deleted":  0
          }
        },
        {
          "term": {
            "CountryId":  "CN"
          }
        }
      ]
    }
  }, 
  "size": 0,
  "aggs": {
    "total_count": {
      "sum": {
        "field": "TopicId"
      }
    },
    "max_topic_id": {
      "max": {
        "field": "TopicId"
      }
    },
    "min_topic_id": {
      "min": {
        "field": "TopicId"
      }
    }
  }
} 

6.通配符和正则表达式进行模糊匹配(会让性能下降,慎用,特别是左模糊开启的时候)

-- 右模糊匹配
GET /my_index/_search
{
  "query": {
    "wildcard": {
      "description": "elasticsearch*"
    }
  }
}

-- 正则

GET /my_index/_search
{
  "query": {
    "regexp": {
      "description": ".*elasticsearch.*"
    }
  }
}

7. 分页查询

{
  "query": {
    "match": {
      "description": "Elasticsearch tutorial"
    }
  },
  "from": 0,
  "size": 10
}

8. 条件删除数据

POST /index_topic/_delete_by_query
{
  "query": {
    "match": {
      "TopicId": "1739499560356679680"
    }
  }
}

三、设计索引时应该怎么考虑索引的分片和副本数、字段的类型和属性等因素

  1. 索引的分片和副本数:分片和副本数是 Elasticsearch 中非常重要的概念,它们可以影响索引的性能、可用性和容错能力。一般来说,分片数应该根据数据量和查询负载来确定,副本数应该根据可用性和容错能力来确定。如果数据量较大或查询负载较高,可以增加分片数来提高查询性能;如果需要提高可用性和容错能力,可以增加副本数来实现数据冗余和负载均衡。

  2. 字段的类型和属性:在定义索引中的字段时,需要考虑字段的类型和属性,以便更好地满足业务需求。例如,如果需要进行全文搜索,可以将文本类型字段设置为全文搜索类型,并指定相应的分析器;如果需要进行聚合查询,可以将数值类型字段设置为聚合类型,并指定相应的聚合方式。此外,还可以设置字段的索引选项、存储选项、忽略字段等属性,以便更好地控制字段的行为和性能。

  3. 索引的更新和删除策略:在设计索引时,需要考虑索引的更新和删除策略,以便更好地控制索引的性能和存储空间。例如,如果需要频繁更新或删除文档,可以将索引设置为支持快速更新和删除的类型,并使用合适的缓存策略来提高性能;如果需要保留历史数据或备份数据,可以将索引设置为支持冷热分离的类型,并使用合适的存储策略来降低存储成本。

  4. 索引的查询负载和性能需求:在设计索引时,需要考虑索引的查询负载和性能需求,以便更好地优化查询性能和响应时间。例如,如果查询负载较高或查询响应时间较长,可以使用缓存策略、查询优化器、索引分析器等技术来提高查询性能;如果需要支持实时查询或高并发查询,可以使用分布式查询、负载均衡、索引优化等技术来提高查询性能和可用性。

四、 ES 数据的冷热分离

设计 Elasticsearch 数据的冷热分离需要考虑以下几个方面:

  1. 数据的访问频率:将访问频率较高的数据放在热节点上,访问频率较低的数据放在冷节点上。

  2. 数据的存储周期:将存储周期较短的数据放在热节点上,存储周期较长的数据放在冷节点上。

  3. 数据的大小:将数据较小的放在热节点上,数据较大的放在冷节点上。

  4. 数据的重要性:将重要性较高的数据放在热节点上,重要性较低的数据放在冷节点上。

在实际应用中,可以通过以下几种方式来实现数据的冷热分离:

  1. 使用 Elasticsearch 的索引别名功能,将热数据和冷数据分别放在不同的索引中,并使用别名来统一访问。

  2. 使用 Elasticsearch 的节点标签功能,将热节点和冷节点分别打上不同的标签,并使用标签来控制数据的路由。

  3. 使用 Elasticsearch 的分片路由功能,将热数据和冷数据分别路由到不同的分片中,并使用分片路由来控制数据的访问。

  4. 使用 Elasticsearch 的索引生命周期管理功能,根据数据的存储周期来自动将数据从热节点转移到冷节点。文章来源地址https://www.toymoban.com/news/detail-816418.html

到了这里,关于ElasticSearch 学习、实践笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch学习笔记(1)

    Elasticsearch是一个开源的搜索引擎,主要应用于文章解锁中,如在购物网站搜索物品时快速查找到目标,Elasticsearch的建立是基于一个一个的索引库,与mysql的数据库有些许类似的地方 –name设置容器名称 -e设置环境变量,这里设置的内存大小和是否为集群模式 -v设置数据卷挂载

    2024年04月11日
    浏览(34)
  • ElasticSearch学习笔记(狂神说)

    视频地址:https://www.bilibili.com/video/BV17a4y1x7zq 在学习ElasticSearch之前,先简单了解一下Lucene: Doug Cutting开发 是apache软件基金会 jakarta项目组的一个子项目 是一个开放源代码的全文检索引擎工具包 不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询

    2024年02月04日
    浏览(48)
  • ES(elasticSearch学习笔记)

    es是面向文档型的数据库,一条数据在es数据库就是一个文档,和关系型数据库做一个类比: 1:es的索引类比关系型数据库的数据库, 2:es的type类比数据表( 7.0版本以上删除了type这个概念 ), 3:es的索引下的文档document类比关系型数据库的行,新增时可以指定文档主键id

    2023年04月08日
    浏览(44)
  • 【超容易理解】Elasticsearch学习笔记

    安装docker,步骤略 安装elasticsearch 安装kibana 挂载目录,修改目录权限 运行es和kibana 注:启动kibana的ip地址要换成自己的ip 打开192.168.56.10:5601,进入kibana,打开下面的界面,这个界面就是执行api的界面,因为elasticsearch是对 Lucene 的封装,提供了 REST API 的操作接口,在不接触底

    2024年02月03日
    浏览(42)
  • Linux学习笔记——ElasticSearch安装部署

    5.6.1、简介 全文搜索属于最常见的需求,开源的ElasticSearch(以下简称es)是目前全文搜索引擎的首选。 它可以快速的储存、搜索和分析海量数据。维基百科、Stack Overflow、GitHub都采用它。 ElasticSearch简称es,在企业内同样是一款应用非常广泛的搜索引擎服务。 很多服务中的搜

    2024年02月09日
    浏览(34)
  • Elasticsearch7学习笔记(尚硅谷)

    Elasticsearch是一个 实时的分布式搜索和分析引擎 。它可以帮助你用前所未有的速度去处理大规模数据。它可以用于 全文搜索,结构化搜索以及分析 ,当然你也可以将这三者进行组合。 Elasticsearch是一个建 立在全文搜索引擎 Apache Lucene™ 基础 上的搜索引擎,可以说Lucene是当今

    2024年01月23日
    浏览(60)
  • ElasticSearch学习笔记一——下载及安装

    最近发现ES是个很重要的内容啊,各种大厂都会使用ES来做一些大范围的搜索之类的功能,所以今天我们也来学习一下。 首先我们要准备Java的环境,推荐版本8、11、14 ES官方的JDK兼容性列表(有些慢,需要耐心等待一下哈) 在我写文章时,针对JDK1.8能支持的ES最高版本是Elastics

    2024年02月15日
    浏览(49)
  • Elasticsearch8.x学习笔记

    ES7.x版本可以参考:Elasticsearch7学习笔记 从 2019 年 4 月 10 日 Elasticsearch7.0 版本的发布,到 2022 年 2 月 11 日 Elasticsearch8.0 版本的发布的近 3 年间,基于不断优化的开发设计理念,Elasticsearch 发布了一系列的小版本。这些小版本在以下方面取得了长足的进步并同时引入一些全新的

    2024年02月08日
    浏览(38)
  • ElasticSearch7.6.x 学习笔记

    ElasticSearch,简称es,es是一个 开源 的 高扩展 的 分布式全文检索引擎 ,它可以近乎实时的存储、检索数据。且本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用java开发并使用Lucene作为核心来实现所用索引和搜索的功能。但是,它的目的是通过简单的

    2023年04月16日
    浏览(53)
  • 全文检索学习之ElasticSearch学习笔记

    在非关系型数据库中,数据是非结构化的,如果直接去查找效率极低,全文检索将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。索引就是从非结构化数据中提取出的然后重新组

    2023年04月11日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包