Elasticsearch 简介和实战


最近项目要用到全文搜索,需要有中文、拼音检索以及混合搜索以及数据聚合功能,使用到了 Elsaticsearch

关于 Elasticsearch

Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,Elasticsearch 是用 Java 语言开发的,基于 RESTful web 接口,其客户端在其他语言中都是可用的

Lucene 被认为是目前最先进,性能最好、功能最全的搜索引擎库,不过,Lucene 只是一个库,需要使用 java 集成到应用中,而且 Lucene 是非常复杂的,需要深入了解检索的相关知识来理解它的工作原理。一般我们会选择 Solr 和 Elasticsearch 来做搜索服务,两者的对比可以网上自行了解

Elasticsearch 基于 Lucene,提供一套简单一致的 RESTful API,隐藏 Lucene 的复杂性,使得全文检索变得更简单,不过 Elasticsearch 也不仅仅只是全文搜索引擎

  • 一个分布式的实时文档存储,每个字段 可以被索引与搜索
  • 一个分布式实时分析搜索引擎
  • 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据

摘自 Elasticsearch: 权威指南

回忆时光

许多年前,一个刚结婚的名叫 Shay Banon 的失业开发者,跟着他的妻子去了伦敦,他的妻子在那里学习厨师。 在寻找一个赚钱的工作的时候,为了给他的妻子做一个食谱搜索引擎,他开始使用 Lucene 的一个早期版本。

直接使用 Lucene 是很难的,因此 Shay 开始做一个抽象层,Java 开发者使用它可以很简单的给他们的程序添加搜索功能。 他发布了他的第一个开源项目 Compass。

后来 Shay 获得了一份工作,主要是高性能,分布式环境下的内存数据网格。这个对于高性能,实时,分布式搜索引擎的需求尤为突出, 他决定重写 Compass,把它变为一个独立的服务并取名 Elasticsearch。

第一个公开版本在2010年2月发布,从此以后,Elasticsearch 已经成为了 Github 上最活跃的项目之一,他拥有超过300名 contributors(目前736名 contributors )。 一家公司已经开始围绕 Elasticsearch 提供商业服务,并开发新的特性,但是,Elasticsearch 将永远开源并对所有人可用。

据说,Shay 的妻子还在等着她的食谱搜索引擎…

Elasticsearch 安装

从官网 elastic.co下载最新或合适版本的 Elasticsearch(这里是7.6.2)

解压之后进入目录下

修改配置文件config/elasticsearch.yml

vim config/elasticsearch.yml
# 集群名称,建议修改,防止误用默认集群
cluster.name: es-zou

# 配置绑定地址,配置外网可以访问(或本地地址)
network.host: 0.0.0.0

# 配置访问端口
http.port: 9200

运行命令

bin/elasticsearch

# 后台启动
bin/elasticsearch -d 

运行 curl http://localhost:9200/ 可以看到以下信息,启动成功

{
  "name" : "DESKTOP-G11TC44",
  "cluster_name" : "es-zou",
  "cluster_uuid" : "yoq-PT-sTVml0H0Vrna6xQ",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

在 Linux 下,network.host 设置为 0.0.0.0 启动可能遇见的问题

[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

切换到root用户,修改配置文件 /etc/security/limits.conf,增加配置

vi /etc/security/limits.conf

* soft nofile 65536
* hard nofile 65536

[2]: max number of threads [3818] for user [es] is too low, increase to at least [4096]

最大线程个数太低。修改配置文件 etc/security/limits.conf,增加配置

vi /etc/security/limits.conf

* soft nproc 4096
* hard nproc 4096

[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

修改 /etc/sysctl.conf,增加配置

vi /etc/sysctl.conf

vm.max_map_count=262144

执行命令 sysctl -p 生效

[4]: system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk

问题原因:因为 Centos6 不支持 SecComp,而ES5.2.1默认 bootstrap.system_call_filter 为 true 进行检测,所以导致检测失败,失败后直接导致ES不能启动
解决方法:在 elasticsearch.yml 中配置 bootstrap.system_call_filter 为 false,注意要在 Memory下面:

bootstrap.memory_lock: false
bootstrap.system_call_filter: false

Kibana 安装

Kibana 是官方的数据可视化工具,不过我们暂时用不到那些数据分析的功能,其中有个 Dev Tools 开发工具可以比较方便的与 Elasticsearch 服务进行交互

下载对应 Elasticsearch 版本的 Kibana 并解压(与 Elasticsearch 保持一致,这里都是 7.6.2)

编辑配置文件 config/kibana.yml

vim config/kibana.yml
# 服务地址,对外暴露地址,(服务器地址)
#server.host: "localhost"
server.host: "127.0.0.1"

# 配置 elasticsearch 地址
elasticsearch.hosts: ["http://localhost:9200"]

# 中文支持
i18n.locale: "zh-CN"

启动命令

bin/kibana

# 使用nohup命令 后台启动
nohup bin/kibana >/dev/null &

启动后,浏览器输入地址 http://localhost:5601

可以使用开发工具 Dev Tools 与 Elasticsearch 服务进行交互

基本概念

操作之前,先简单了解一波 Elasticsearch 中的数据模型和一些基本概念

全文搜索(full-text search)

全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。全文搜索搜索引擎数据库中的数据

集群、节点(cluster & node)

一个 节点(node) 就是一个 Elasticsearch 实例,而一个 集群(cluster) 由一个或多个节点组成,它们具有相同的 cluster.name (默认为 “elasticsearch”),节点可以通过这个集群名加入群集,可以在 elasticsearch.yml 自定义集群名称和节点名称

# Use a descriptive name for your cluster:
cluster.name: my-application

# Use a descriptive name for the node:
node.name: node-1

索引(index)

index 包含两层意思,一是名词索引,类似于关系型数据库中的一个数据库,是一个存储关系型文档的地方;二是动词,表示建立索引,存储一个文档到索引中以被检索查询

一个 Elasticsearch 集群可以包含多个 索引 ,相应的每个索引可以包含多个 类型 ,这些不同的类型存储着多个 文档 ,每个文档又有多个 属性 。我们可以与关系型数据库做个简单对比

Relational DB -> Databases -> Tables -> Rows      -> Columns
Elasticsearch -> Indices   -> Types  -> Documents -> Fields

类型(mapping type)

之前的版本中,每个索引下可以建立多个类型,存储文档的时候需要指定 index 和 type,但是从 6.0 开始每个索引只能有一个类型,7.0 以后不建议使用,8.0 以后将完全不支持

为什么要移除映射类型

开始的时候,我们把**索引(index)类型(type)**类比于SQL数据库中的 database 和 table,但是这样类比是不合适的。在SQL数据库中,表之间是相互独立的。一个表中的各列并不会影响到其它表中的同名的列。而在映射类型(mapping type)中却不是这样的。

在同一个 Elasticsearch 索引中,其中不同映射类型中的同名字段在内部是由同一个 Lucene 字段来支持的。换句话说,使用上面的例子,user 类型中的 user_name 字段与 tweet 类型中的 user_name 字段是完全一样的,并且两个 user_name 字段在两个类型中必须具有相同的映射(定义)。

这会在某些情况下导致一些混乱,比如,在同一个索引中,当你想在其中的一个类型中将 deleted 字段作为 date 类型,而在另一个类型中将其作为 boolean 字段。

在此之上需要考虑一点,如果同一个索引中存储的各个实体如果只有很少或者根本没有同样的字段,这种情况会导致稀疏数据,并且会影响到Lucene的高效压缩数据的能力

文档(document)

索引里存储的单条数据,被索引信息的基本单位

Elasticsearch 是 面向文档(document oriented) 的,这意味着它可以存储整个对象或 文档(document),还会 索引(index) 每个文档的内容使之可以被搜索。在 Elasticsearch 中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。这种理解数据的方式与以往完全不同,这也是Elasticsearch能够执行复杂的全文搜索的原因之一

映射、字段(mapping & field)

Elasticsearch 是使用 JSON 作为文档序列化格式,映射就定义了文档的结构,会包含许多字段。一个映射定义了字段类型,每个字段的数据类型,以及字段被 Elasticsearch 处理的方式。映射还用于设置关联到类型上的元数据

快速入门

使用 RESTful API 通过端口 9200 可以和 Elasticsearch 进行交互,可以使用 curl 命令,也可以用 Kibana 的 Dev Tools 更加方便

这里简单创建一个索引,并添加几条数据

创建索引

用 curl 命令创建了一个 commodity 商品索引

curl -X PUT "localhost:9200/commodity?pretty"

也使用 Kibana,并配置参数和映射

PUT /commodity
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "commodity_id": {
        "type": "long"
      },
      "commodity_name": {
        "type": "text"
      },
      "picture_url": {
        "type": "keyword"
      },
      "price": {
        "type": "double"
      }
    }
  }
}

创建了一个分片数为1,副本数为1的索引,没有指定类型,默认会创建一个 _doc 类型,有四个不同类型的字段,创建成功返回如下结果

{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "commodity"
}

添加文档数据

PUT /commodity/_doc/1
{
  "commodity_id": 1,
  "commodity_name": "全面屏手机",
  "picture_url": "/commodity/1",
  "price": 1999
}

这里是在 commodity 索引的 _doc 类型下创建一个 id 为 1 的文档数据,创建成功

{
  "_index" : "commodity",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 2,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}

查询

查询所有

POST /commodity/_search

查询名称

POST /commodity/_search
{
  "query": {
    "match": {
      "commodity_name": "全面"
    }
  }
}
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.9646722,
    "hits" : [
      {
        "_index" : "commodity",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.9646722,
        "_source" : {
          "commodity_id" : 1,
          "commodity_name" : "全面屏手机",
          "picture_url" : "/commodity/1",
          "price" : 1999
        }
      }
    ]
  }
}

后面再去总结 API 的详细用法

前言 第1章 Elasticsearch入门 1 1.1 Elasticsearch是什么 1 1.1.1 Elasticsearch的历史 2 1.1.2 相关产品 3 1.2 全文搜索 3 1.2.1 Lucene介绍 4 1.2.2 Lucene倒排索引 4 1.3 基础知识 6 1.3.1 Elasticsearch术语及概念 6 1.3.2 JSON介绍 10 1.4 安装配置 12 1.4.1 安装Java 12 1.4.2 安装Elasticsearch 12 1.4.3 配置 13 1.4.4 运行 15 1.4.5 停止 17 1.4.6 作为服务 17 1.4.7 版本升级 19 1.5 对外接口 21 1.5.1 API约定 22 1.5 .2 REST介绍 25 1.5.3 Head插件安装 26 1.5.4 创建库 27 1.5.5 插入数据 28 1.5.6 修改文档 28 1.5.7 查询文档 29 1.5.8 删除文档 29 1.5.9 删除库 30 1.6 Java接口 30 1.6.1 Java接口说明 30 1.6.2 创建索引文档 33 1.6.3 增加文档 34 1.6.4 修改文档 35 1.6.5 查询文档 35 1.6.6 删除文档 35 1.7 小结 36 第2章 索引 37 2.1 索引管理 37 2.1.1 创建索引 37 2.1.2 删除索引 39 2.1.3 获取索引 39 2.1.4 打开/关闭索引 40 2.2 索引映射管理 41 2.2.1 增加映射 41 2.2.2 获取映射 44 2.2.3 获取字段映射 45 2.2.4 判断类型是否存在 46 2.3 索引别名 46 2.4 索引配置 51 2.4.1 更新索引配置 51 2.4.2 获取配置 52 2.4.3 索引分析 52 2.4.4 索引模板 54 2.4.5 复制配置 55 2.4.6 重建索引 56 2.5 索引监控 60 2.5.1 索引统计 60 2.5.2 索引分片 62 2.5.3 索引恢复 63 2.5.4 索引分片存储 64 2.6 状态管理 64 2.6.1 清除缓存 64 2.6.2 索引刷新 64 2.6.3 冲洗 65 2.6.4 合并索引 65 2.7 文档管理 66 2.7.1 增加文档 66 2.7.2 更新删除文档 69 2.7.3 查询文档 73 2.7.4 多文档操作 76 2.7.5 索引词频率 80 2.7.6 查询更新接口 83 2.8 小结 87 第3章 映射 88 3.1 概念 88 3.2 字段数据类型 90 3.2.1 核心数据类型 91 3.2.2 复杂数据类型 96 3.2.3 地理数据类型 100 3.2.4 专门数据类型 106 3.3 元字段 108 3.3.1 _all字段 109 3.3.2 _field_names字段 109 3.3.3 _id字段 110 3.3.4 _index字段 110 3.3.5 _meta字段 111 3.3.6 _parent字段 111 3.3.7 _routing字段 112 3.3.8 _source字段 114 3.3.9 _type字段 115 3.3.10 _uid字段 115 3.4 映射参数 116 3.4.1 analyzer参数 116 3.4.2 boost参数 118 3.4.3 coerce参数 119 3.4.4 copy_to参数 120 3.4.5 doc_values参数 121 3.4.6 dynamic参数 122 3.4.7 enabled参数 122 3.4.8 fielddata参数 123 3.4.9 format参数 126 3.4.10 geohash参数 128 3.4.11 geohash_precision参数 129 3.4.12 geohash_prefix参数 130 3.4.13 ignore_above参数 131 3.4.14 ignore_malformed参数 131 3.4.15 include_in_all参数 132 3.4.16 index参数 133 3.4.17 index_options参数 133 3.4.18 lat_lon参数 134 3.4.19 fields参数 135 3.4.20 norms参数 136 3.4.21 null_value参数 137 3.4.22 position_increment_gap参数 137 3.4.23 precision_step参数 138 3.4.24 properties参数 138 3.4.25 search_analyzer参数 139 3.4.26 similarity参数 140 3.4.27 store参数 141 3.4.28 term_vector参数 141 3.5 动态映射 142 3.5.1 概念 142 3.5.2 _default_映射 143 3.5.3 动态字段映射 143 3.5.4 动态模板 145 3.5.5 重写默认模板 148 3.6 小结 148 第4章 搜索 149 4.1 深入搜索 149 4.1.1 搜索方式 149 4.1.2 重新评分 153 4.1.3 滚动查询请求 155 4.1.4 隐藏内容查询 158 4.1.5 搜索相关函数 161 4.1.6 搜索模板 164 4.2 查询DSL 167 4.2.1 查询和过滤的区别 167 4.2.2 全文搜索 168 4.2.3 字段查询 179 4.2.4 复合查询 183 4.2.5 连接查询 188 4.2.6 地理查询 190 4.2.7 跨度查询 197 4.2.8 高亮显示 200 4.3 简化查询 203 4.4 小结 206 第5章 聚合 207 5.1 聚合的分类 207 5.2 度量聚合 209 5.2.1 平均值聚合 209 5.2.2 基数聚合 211 5.2.3 最大值聚合 213 5.2.4 最小值聚合 214 5.2.5 和聚合 214 5.2.6 值计数聚合 215 5.2.7 统计聚合 215 5.2.8 百分比聚合 215 5.2.9 百分比分级聚合 216 5.2.10 最高命中排行聚合 217 5.2.11 脚本度量聚合 217 5.2.12 地理边界聚合 221 5.2.13 地理重心聚合 222 5.3 分组聚合 223 5.3.1 子聚合 224 5.3.2 直方图聚合 226 5.3.3 日期直方图聚合 230 5.3.4 时间范围聚合 233 5.3.5 范围聚合 234 5.3.6 过滤聚合 235 5.3.7 多重过滤聚合 236 5.3.8 空值聚合 238 5.3.9 嵌套聚合 239 5.3.10 采样聚合 240 5.3.11 重要索引词聚合 242 5.3.12 索引词聚合 245 5.3.13 总体聚合 251 5.3.14 地理点距离聚合 251 5.3.15 地理散列网格聚合 253 5.3.16 IPv4范围聚合 255 5.4 管道聚合 257 5.4.1 平均分组聚合 259 5.4.2 移动平均聚合 261 5.4.3 总和分组聚合 262 5.4.4 总和累计聚合 262 5.4.5 最大分组聚合 264 5.4.6 最小分组聚合 265 5.4.7 统计分组聚合 266 5.4.8 百分位分组聚合 268 5.4.9 差值聚合 269 5.4.10 分组脚本聚合 273 5.4.11 串行差分聚合 275 5.4.12 分组选择器聚合 276 5.5 小结 277 第6章 集群管理 278 6.1 集群节点监控 278 6.1.1 集群健康值 278 6.1.2 集群状态 279 6.1.3 集群统计 280 6.1.4 集群任务管理 280 6.1.5 待定集群任务 281 6.1.6 节点信息 281 6.1.7 节点统计 282 6.2 集群分片迁移 283 6.3 集群节点配置 284 6.3.1 主节点 285 6.3.2 数据节点 286 6.3.3 客户端节点 286 6.3.4 部落节点 287 6.4 节点发现 287 6.4.1 主节点选举 288 6.4.2 故障检测 288 6.5 集群平衡配置 289 6.5.1 分片分配设置 289 6.5.2 基于磁盘的配置 290 6.5.3 分片智能分配 291 6.5.4 分片配置过滤 292 6.5.5 其他集群配置 293 6.6 小结 293 第7章 索引分词器 294 7.1 分词器的概念 294 7.2 中文分词器 298 7.3 插件 300 7.3.1 插件管理 301 7.3.2 插件安装 301 7.3.3 插件清单 302 7.4 小结 304 第8章 高级配置 305 8.1 网络相关配置 305 8.1.1 本地网关配置 305 8.1.2 HTTP配置 306 8.1.3 网络配置 307 8.1.4 传输配置 308 8.2 脚本配置 310 8.2.1 脚本使用 311 8.2.2 脚本配置 313 8.3 快照和恢复配置 318 8.4 线程池配置 324 8.5 索引配置 326 8.5.1 缓存配置 326 8.5.2 索引碎片分配 329 8.5.3 合并 332 8.5.4 相似模块 332 8.5.5 响应慢日志监控 333 8.5.6 存储 335 8.5.7 事务日志 336 8.6 小结 337 第9章 告警、监控和权限管理 338 9.1 告警 338 9.1.1 安装 338 9.1.2 结构 339 9.1.3 示例 352 9.1.4 告警输出配置 354 9.1.5 告警管理 355 9.2 监控 356 9.2.1 安装 356 9.2.2 配置 357 9.3 权限管理 360 9.3.1 工作原理 361 9.3.2 用户认证 361 9.3.3 角色管理 366 9.3.4 综合示例 368 9.4 小结 369 第10章 ELK应用 370 10.1 Logstash 370 10.1.1 配置 371 10.1.2 插件管理 374 10.2 Kibana配置 377 10.2.1 Discover 379 10.2.2 Visualize 381 10.2.3 Dashboard 383 10.2.4 Settings 386 10.3 综合示例 387 10.4 小结 390 附录 Elasticsearch 5.0的特性与改进 391
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值