欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Elastic Search

程序员文章站 2022-07-05 07:58:40
...

1. 概述

Elasticsearch(ES): 是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。

elasticsearch-head: elasticsearch-head 项目提供了一个直观的界面,可以很方便地查看集群、分片、数据等等。elasticsearch-head最简单的安装方式是作为 chrome 浏览器插件进行安装.

Kibana: Kibana是一个开源的分析和可视化平台,用Kibana来搜索,查看,并和存储在Elasticsearch索引中的数据进行交互。可以轻松地执行高级数据分析,并且以各种图标、表格和地图的形式可视化数据。

1.1 ElasticSearch的matchQuery与termQuery区别

matchQuery: 会将搜索词分词,再与目标查询字段进行匹配,若分词中的任意一个词与目标字段匹配上,则可查询到。

termQuery: 不会对搜索词进行分词处理,而是作为一个整体与目标字段进行匹配,若完全匹配,则可查询到。term 查询被用于精确值匹配

2. 正向索引和倒排索引

2.1 正向索引

“文档1”的ID > 单词1:出现次数,出现位置列表;单词2:出现次数,出现位置列表;…………。

“文档2”的ID > 此文档出现的关键词列表。

2.2 倒排索引

可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。

单词词典(Lexicon): 搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。

倒排列表(PostingList): 倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。

倒排文件(Inverted File): 所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称之为倒排文件,倒排文件是存储倒排索引的物理文件。

3. IK中文分词器

  1. ik分词器提供两种分词器: ik_max_wordik_smart
  2. ik_max_word: 会将文本做最细粒度的拆分,会穷尽各种可能的组合,适合 Term Query
  3. ik_smart: 会做最粗粒度的拆分,适合Phrase查询.
  4. 通过analyzer属性指定要使用的分词器

4. Kibana 操作 ES

4.1 索引、分片和副本

Elastic Search

4.1.1 索引

ElasticSearch索引用来存储要搜索的数据,以倒排索引结构进行存储.类似MySQL中的表
当索引中存储了大量数据时,大量的磁盘io操作会降低整体搜索新能,这时需要对数据进行分片存储。

4.1.2 索引分片

在一个索引中存储大量数据会造成性能下架,这时可以对数据进行分片存储
在每个节点上都创建一个索引分片,把数据分散存放到多个节点的索引分片上,减少每个分片的数据量来提高IO性能.
每个分片都是一个独立的索引,数据分散存放在多个分片中,搜索时会同时搜索多个分片,并将搜索结果进行汇总.
如果一个节点宕机,导致部分分片不可用,则会造成部分数据无法搜索,可以对分片创建多个副本来解决

4.1.3 索引副本

对分片创建多个副本,即使一个节点宕机,其他节点长的副本分片还可以继续工作,不会造成数据不可用.

4.1.4 分片工作机制:

  1. 主分片的数据会复制到副本分片
  2. 搜索时,以负载均衡的方式工作,提高处理能力
  3. 主分片宕机时,其中一个副本分片会自动提升为主分片

4.1.5 创建索引

//创建索引,命名为 products
PUT /products
{
  "settings": {
    "number_of_shards": 3, 		//分片数量,默认值是 5
    "number_of_replicas": 2		//副本数量,默认值是 1
  }
}

4.1.6 删除索引

//删除 products 索引
DELETE /products

4.2 映射(数据结构)

类似于数据库表结构,索引数据也被分为多个数据字段,并且需要设置数据类型和其他属性
映射,是对索引中字段结构的定义和描述

4.2.1 常用数据类型

  • 数字类型:
    • byte , short , integer , long
    • float , double
    • unsigned_long
  • 字符串类型:
    • text: 会进行分词
    • keyword: 不会进行分词,适用于email,主机地址,邮编等
  • 日期和时间类型:
    • data

4.2.2 创建映射

分词器设置:

  • analyzer:在索引中添加文档时,text类型通过指定的分词器分词后,再插入倒排索引
  • search_analyzer:使用关键词检索时,使用指定的分词器对关键词进行分词
    查询时,关键词优先使用 search_analyzer 设置的分词器,如果 search_analyzer 不存在则使用 analyzer分词器。
//在 products 索引中创建映射,定义mapping:数据结构
PUT /products/_mapping
{
  "properties": {
    "title": {
      "type": "text",
      "analyzer": "ik_max_word",
      "search_analyzer": "ik_smart"
    },
    "barcode": {
      "type": "keyword"
    }
  }
}

5. 添加分档

添加的文档会有一个名为_id的文档id,这个文档id可以自动生成,也可以手动指定,通常可以使用数据的id作为文档id。

# 添加文档
PUT /products/_doc/10033
{
  "id":"10033",
  "title":"SONOS PLAY:5(gen2) 新一代PLAY:5无线智能音响系统 WiFi音箱家庭,潮酷数码会场",
  "category":"潮酷数码会场",
  "price":"3980.01",
  "city":"上海",
  "barcode":"527848718459"
}

6. 修改文档

底层索引数据无法修改,修改数据实际上是先删除再重新添加
两种修改方式:

  • PUT:对文档进行完整的替换
  • POST:可以修改一部分字段

修改价格字段的值:

//	修改文档 - 替换
PUT /products/_doc/10037
{
  "id":"10037",
  "title":"SONOS PLAY:1无线智能音响系统 美国原创WiFi连接 家庭桌面音箱",
  "category":"潮酷数码会场",
  "price":"9999.99",
  "city":"上海",
  "barcode":"527783392239"
}

修改价格和城市字段的值:

// 修改文档 - 更新部分字段
POST /products/_update/10037
{
  "doc": {
    "price":"8888.88",
    "city":"深圳"
  }
}