一、安装配置

在官网下载Es,注意版本号,不同大版本号之间差异很大。我安装的是7.14.0版本

1.1 安装成服务

  cmd 进入bin目录下执行

elasticsearch-service.bat install

1.2 安装插件

  ik分词器,分词器的版本和ES版本需要一致

elasticsearch-plugin.bat install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.14.0/elasticsearch-analysis-ik-7.14.0.zip

1.3 配置账号密码

修改config目录下面的elasticsearch.yml文件,在里面添加如下内容,并重启。

xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true

执行:

elasticsearch-setup-passwords interactive

然后配置每个账户密码。

通过账号密码链接: http://username:password@127.0.0.1:9200

二、基础概念

2.1 文档元数据

节点

说明

_index

文档存储的地方,必须小写,不能以下划线开头,不能包含逗号

_type

文档代表的对象的类,命名可以是大写或者小写,但是不能以下划线或者句号开头,不应该包含逗号

_id

文档的唯一标识

2.2 索引

一个 索引 类似于传统关系数据库中的一个 数据库 ,是一个存储关系型文档的地方。事实上,我们的数据被存储在分片(shards)中,索引只是一个把一个或多个分片分组在一起的逻辑空间。

2.3 文档

文档指最顶层结构或根对象序列化的JSON数据(以唯一Id标识并存储于ES中),相当于关系数据的行。在版本7.0中已经没有文档了,统一为“_doc”。

三、数据的物理存储

  ES为什么能搜索和存储海量数据呢?是因为它的水平拓展,它内部分将整个数据进行分片,每个分片存储部分数据。

如图:将整个数据分为5片,每一片都有一个副本,5个主分片分别存储在不同节点。每个节点就是一个ElasticSearch实例。

3.1 数据是怎么存储到分片中的?

  在创建索引时,主分片的数量和其副本的数量已经确定了,当创建文档时,Es会根据文档的Id值选择一个主分片,可能这个主分片,在另一个节点。文档被发送到主分片和该主分片所有的副分片中。在新建一个文档的时候, Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?首先这肯定不会是随机的,否则将来要获取文档的时候我们就不知道从何处寻找了。实际上,这个过程是根据下面这个公式决定的:

shard = hash(routing) % number_of_primary_shards

routing 是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值。这就解释了为什么我们要在创建索引的时候就确定好主分片的数量 并且永远不会改变这个数量:因为如果数量变化了,那么所有之前路由的值都会无效,文档也再也找不到了。

新建、索引、删除操作,必须在主分片上完成后才能被复制到相关副分片。

3.2 多个节点查询的过程

  当其中一个节点接收到搜索请求时,会将请求转发到其他节点,然后将每个节点的结果聚集返回。在默认情况下,搜索请求通过round-robin轮询机制选中主分片和副分片。

3.3 为什么ElasticSearch查询快?

  Es为了查询速度,使用的是倒排索引。假如存储的一个文档中Content字段值为:

  1:My nickname is Microheart.

  2:Hello Microheart

  为了创建倒排索引,我们首先将每个文档的 content 域拆分成单独的词(也就是tokens),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。

my

1

nickname

1

is

1

microheart

1,2

hello

2

 
 如果我们此时查询 microheart ,2个文档都会出现。但是文档而的长度短,搜索词条占比大,所以匹配度更高。倒排索引的特点就是不需要直接查询内容,根据词匹配,找到匹配文档的Id。

3.4 相关性

  上面的例子,提到了相关性,相关性主要根据下面三个有关:

  • 检索词频率:检索词在该字段出现的频率,出现频率越高,相关性也越高。 字段中出现过 5 次要比只出现过 1 次的相关性高。
  • 反向文档频率:每个检索词在索引中出现的频率,频率越高,相关性越低。检索词出现在多数文档中会比出现在少数文档中的权重更低。
  • 字段长度准则:字段的长度是多少?长度越长,相关性越低。 检索词出现在一个短的 title 要比同样的词出现在一个长的 content 字段权重更大。

3.5 映射

域映射:域最重要的属性是type,就是字段类型。对于非string的域,只需要设置type

string域映射有两个重要的属性 index和 analyzer

Index:控制怎样索引字符串

  • analyzed :首先分析字符串,然后索引它。换句话说,以全文索引这个域。
  • not_analyzed:索引这个域,所以它能够被搜索,但索引的是精确值。不会对它进行分析。
  • no:不索引这个域。这个域不会被搜索到。

analyzer:指定分词器

  上面的例子中,为什么会按照单词拆词呢?因为默认不指定分词器,就是standard分词器,它会按照英文单词拆词。分词器有:snowball、standard、keyword、ik_smart、ik_max_word。其中ik_smart和ik_max_word是中文的分词

ES 2.x版本中只有string类型,ES 5.x以后,只有text 和 keyword字段。

比如一篇博客,有标题和内容两个字段,指定为ik_smart。假如标题为 “.Net Core中使用ElasticSearch”,就会被拆词为 “net”、“core”、 "中"、“使用”、“elasticsearch”。如果用户搜索“.net core”,应该对用户的搜索词也进行拆词,拆分为 “net”、“core”,那么标题就会命中。

        /// <summary>
/// 标题
/// </summary>
[Text(Analyzer = "ik_smart")]
public string Title { get; set; } /// <summary>
/// 内容
/// </summary>
[Text(Analyzer = "ik_smart")]
public string Content { get; set; }

.Net Core中使用ElasticSearch(一)的更多相关文章

  1. .Net Core中使用ElasticSearch(二)

    .Net的ElasticSearch 有两个版本,Elasticsearch.Net(低级) 和 NEST(高级),推荐使用 NEST,低级版本的更灵活,水太深 把握不住.有个需要注意,使用的版本号必 ...

  2. ElasticSearch实战——.Net Core中的应用

    dll引用: NLog.Targets.ElasticSearch,版本:4.0.0-beta26 Nlog,版本:4.5.0-rc04 Microsoft.Extensions.Configurat ...

  3. 使用Logstash同步数据至Elasticsearch,Spring Boot中集成Elasticsearch实现搜索

    安装logstash.同步数据至ElasticSearch 为什么使用logstash来同步,CSDN上有一篇文章简要的分析了以下几种同步工具的优缺点:https://blog.csdn.net/la ...

  4. ELK系列(二):.net core中使用ELK

    ELK安装好后,我们现在.net Core中使用一下,大体思路就是结合NLog日志组件将数据写入ELK中,其它语言同理. ELK的安装还是有些复杂的,我们也可以在Docker中安装ELK:docker ...

  5. .net core中的那些常用的日志框架(Serilog篇)

    前言 上文说到Nlog日志框架,感觉它功能已经很强大,今天给大家介绍一个很不错的日志框架Serilog,根据我的了解,感觉它最大的优势是,结构化日志,它输出的日志是Json的格式,如果你使用的是Mon ...

  6. .NET Core 中的日志与分布式链路追踪

    目录 .NET Core 中的日志与分布式链路追踪 .NET Core 中的日志 控制台输出 非侵入式日志 Microsoft.Extensions.Logging ILoggerFactory IL ...

  7. 如何在 ASP.Net Core 中使用 Serilog

    记录日志的一个作用就是方便对应用程序进行跟踪和排错调查,在实际应用上都是引入 日志框架,但如果你的 日志文件 包含非结构化的数据,那么查询起来将是一个噩梦,所以需要在记录日志的时候采用结构化方式. 将 ...

  8. 如何在 ASP.Net Core 中实现 健康检查

    健康检查 常用于判断一个应用程序能否对 request 请求进行响应,ASP.Net Core 2.2 中引入了 健康检查 中间件用于报告应用程序的健康状态. ASP.Net Core 中的 健康检查 ...

  9. .NET Core中的认证管理解析

    .NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...

随机推荐

  1. Django实现基本的页面分页

    1.视图views.py from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage def index(requ ...

  2. 2021秋 noip 模拟赛

    9.9 T3 第负二题 \(f_i\) 的数学意义:中心在第 \(i\) 行的全 \(1\) 组成的最大正方形(对角线水平/竖直),对角线长 \(2f_i-1\). 显然 \(f_i\) 具有单调性( ...

  3. Apache Hudi内核之文件标记机制深入解析

    1. 摘要 Hudi 支持在写入时自动清理未成功提交的数据.Apache Hudi 在写入时引入标记机制来有效跟踪写入存储的数据文件. 在本博客中,我们将深入探讨现有直接标记文件机制的设计,并解释了其 ...

  4. MySQL实战45讲(21--25)-笔记

    21 | 为什么我只改一行的语句,锁这么多? 加锁规则里面:包含了两个"原则".两个"优化"和一个"bug". 原则 1:加锁的基本单位是 ...

  5. 了解HTTP基本知识板块

    一.HTTP 协议概述 HTTP协议采用了请求/响座模型. 客户端向服务器发送-个请求,请求头包含请求的方法.URT..协议版本.以以 及包含请求修饰符.客户信息和内容的类似于MIME的消息结构. 服 ...

  6. [源码解析] 深度学习流水线并行 PipeDream(6)--- 1F1B策略

    [源码解析] 深度学习流水线并行 PipeDream(6)--- 1F1B策略 目录 [源码解析] 深度学习流水线并行 PipeDream(6)--- 1F1B策略 0x00 摘要 0x01 流水线比 ...

  7. go中如果想要实现别人写的接口,如何保证确实实现了那个接口而不是错过了什么?

    在类型的实现方法上定义通用代码指令 var _ 要实现的接口  = (receiver类型)(nil) 比如要定义一个web处理程序 type  handler_def struct{} var _ ...

  8. 解读Flex布局及其基本使用

    Flex布局的基本内容: felx布局意为"弹性布局",主要用于为盒状模型提供最大的灵活性.被广泛的应用于移动端,PC端的响应式布局. 首先:定义盒子为flex布局: .box{ ...

  9. ESP8266- 使用AT指令获取网络时间

    前言:很早就考虑过用 ESP8266 获取网络时间,以前都是用 ESP8266 刷机智云的 Gagent 固件,但无奈现在手头的 ESP-01 的 Flash 只有 1M,实在无法胜任.经过在网络上的 ...

  10. 学习PHP中Fileinfo扩展的使用

    今天来学习的这个扩展其实现在也已经是标配的一个扩展了,为什么呢?因为 Laravel 框架在安装的时候它就是必须的一个扩展,没有打开它的话,连 Laravel 框架都是无法使用的. Fileinfo ...