Elastic Search
文章目录
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中文分词器
- ik分词器提供两种分词器:
ik_max_word
和ik_smart
- ik_max_word: 会将文本做最细粒度的拆分,会穷尽各种可能的组合,适合 Term Query
- ik_smart: 会做最粗粒度的拆分,适合Phrase查询.
- 通过
analyzer
属性指定要使用的分词器
4. Kibana 操作 ES
4.1 索引、分片和副本
4.1.1 索引
ElasticSearch索引用来存储
要搜索的数据,以倒排索引
结构进行存储.类似MySQL中的表
当索引中存储了大量数据时,大量的磁盘io操作会降低整体搜索新能,这时需要对数据进行分片存储。
4.1.2 索引分片
在一个索引中存储大量数据会造成性能下架,这时可以对数据进行分片存储
在每个节点上都创建一个索引分片,把数据分散存放
到多个节点的索引分片上,减少每个分片的数据量来提高IO性能.
每个分片都是一个独立的索引,数据分散存放在多个分片中,搜索时会同时搜索多个分片,并将搜索结果进行汇总.
如果一个节点宕机,导致部分分片不可用,则会造成部分数据无法搜索,可以对分片创建多个副本来解决
4.1.3 索引副本
对分片创建多个副本,即使一个节点宕机,其他节点长的副本分片还可以继续工作,不会造成数据不可用.
4.1.4 分片工作机制:
- 主分片的数据会复制到副本分片
- 搜索时,以负载均衡的方式工作,提高处理能力
- 主分片宕机时,其中一个副本分片会自动提升为主分片
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
- byte , short , integer ,
- 字符串类型:
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":"深圳"
}
}
推荐阅读
-
php array_search() 函数使用
-
荐 Java刷题笔记15:不同的二叉搜索树( Unique Binary Search Trees)
-
python正则表达式match和search用法实例
-
Elastic Stack 开源的大数据解决方案
-
python 使用re.search()筛选后 选取部分结果的方法
-
使用 Python 中 re 模块对测试用例参数化,进行搜索 search、替换 sub
-
Elastic search集群新增节点(同一集群,同一 物理机)
-
python正则表达式函数match()和search()的区别详解
-
js正则表达式之search方法讲解
-
php数组函数序列之array_search()- 按元素值返回键名