ElasticSearch浅谈(基于ES 7)

ElasticSearch浅谈

简介

ElasticSearch,简称为ES,是一个开源的高可用,高可扩展的分布式全文搜索引擎,可以视为全文搜索数据库。它可以实现近实时的存储和检索。可以相对方便的扩展到多台服务器上,实现集群的搭建,从而提高吞吐量。

ES是基于Lucene做的封装和增强,可通过简单的RESTful API实现各种复杂的操作。

ELK(ElasticSearch + Logstash + Kibana)是数据日志收集分析的统称,其中Logstash是日志数据收集服务,负责数据的收集;ES负责将数据进行存储;Kibana负责将数据进行展示。

安装

window下安装为开箱即用,Linux 安装需要一定的配置。安装过程不再赘述,需要安装ES,以及Kibana用于执行命令,安装head用于查看数据以及监测集群的健康状态。

核心概念

索引(Index),由于ES本身属于非关系型数据库,所以没有严格的库表结构取而代之的是索引。可以将索引对应到数据库的概念,或者单纯的理解为一批具有类似结构数据的容器(集合)。其中一个索引可以有多个分片,以及分片对应的副本。

分片(shards)可以理解为是一种物理概念,直观感受是将一个索引进行拆分,每一部分就可以理解为是分片,这个分片称之为主分片。对应的复制分片可以理解为副本,主分片具有上限(5个),一个主分片的副本没有规定。ES提出主分片以及副本是考虑了高可用(数据冗余不丢失)和高性能(数据查询更快速)的要求。

文档(document),这个可以理解为索引中存储的数据,对应于关系型数据库中的行数据概念。此外需要注意的是,文档和索引之间还有一个类型(Type)的概念,可以对应于关系型数据库中的表的概念,但是随着ES的版本更新,这一概念最终也会被弃用。

字段(field),是文档中的最小的数据单元,可以表示这个数据的的含义,以及类型。

映射(mapping),是随着索引创建后,规范当前索引数据的各个字段以及对应的类型的定义数据。ES可以根据插入的数据自动的生成对应的mapping,但是为了防止出现自动生成的与预先设定的出现偏差,需要进行手动的显示定义。

倒排索引,在搜索领域和NLP相关的内容中非常常见,,本质就是根据字词映射对应的文档列表,不做过多解释。

IK分词器,ES是针对英文做文本处理,拥有自己标准的分词工具。但是对于中文,天然不存在词汇之间的空格分隔,所以需要用适合的分词器将连续的文本分为一个个词汇。ik分词器便是对中文文本分词的支持插件(工具),拥有两种模式,ik_smart(最小切分)和ik_max_word(所有可能切分)。分词器还支持自定义的此表,用于对未登录词汇的切分。

CRUD

RESTful风格

方法 URL地址 说明
PUT localhost:9200/索引名称/类型名称/文档id 创建,修改文档(指定文档id)
POST localhost:9200/索引名称/类型名称 创建文档(随机文档id)
POST localhost:9200/索引名称/类型名称/文档id/_update 修改文档
DELETE localhost:9200/索引名称/类型名称/文档id 删除文档
GET localhost:9200/索引名称/类型名称/文档id 通过id查询文档
POST localhost:9200/索引名称/类型名称/文档id/_search 查询所有数据

字段的数据类型:

  1. 字符串类型:text(分词),keyword(不进行分词,为一个整体)
  2. 数值型:long、Integer、short、byte、double、float、half float、scaled float
  3. 日期类型:date
  4. 布尔类型:boolean
  5. 二进制类型:binary

索引

创建索引

发送PUT请求直接创建索引

http://localhost:9200/shopping

利用映射创建索引
发送PUT请求

http://localhost:9200/shopping
{
	"mappings":{
		"properties":{
			"name":{"type": "text"},
			"age": {"type": "long"},
			"birthday": {"type": "date"}
		}
	}
}

单独创建映射
先创建索引后单独设置映射关系
发送PUT请求

http://localhost:9200/shopping/_mapping
{
	"properties":{
		"name":{
			"type": "text",
			"index": true
		},
		"sex": {
			"type": "keyword",		# 不可被分词,搜索时仅可以完全匹配
			"index": true
		},
		"tel": {
			"type": "keyword",
			"index": false		# 不可被索引,搜不到这个字段的信息
		}
	}
}

查询索引的映射
发送GET请求

http://localhost:9200/shopping/_mapping

查看所有索引

发送GET请求

http://localhost:9200/_cat/indices?v

查看单个索引

发送GET请求, 查看索引的详细信息

http://localhost:9200/shopping

删除索引
发送DELETE请求

http://localhost:9200/shopping

文档

创建文档
发送POST请求

http://localhost:9200/shopping/_doc

{
	"title": "小米手机",
	"category": "小米",
	“price”: 3999.00
}

由于没有给定id,所以ES会自动生成一个随机的id,该方式只能发送POST请求,而PUT请求需要明确id

发送PUT请求

http://localhost:9200/test3/_doc/1
{
	"name": "张三",
	“age”: 18
}

修改文档
发送PUT请求,会覆盖所有字段,且更新数据中不包含的字段会被删除

http://localhost:9200/test3/_doc/1
{
	"name": "李四"
}

发送POST请求,会保留所有字段,更新新数据到原有文档中

http://localhost:9200/shopping/_doc/1/_update
{
	"title": "华为手机"
}

删除文档
发送DELETE请求

http://localhost:9200/shopping/_doc/1

当前删除为逻辑删除,并不会马上进行物理删除。

根据文档id查询
发送GET请求

http://localhost:9200/shopping/_doc/1

查询文档下的所有内容
发送GET请求

http://localhost:9200/shopping/_search

带有请求体的方式

http://localhost:9200/shopping/_search
{
	"query":{
		"match_all": {}
	}
}

条件查询
发送GET请求

http://localhost:9200/shopping/_search
{
	"query":{
		"match":{
			"category": "小米"
		}
	}
}

返回指定字段
发送GET请求

http://localhost:9200/shopping/_search
{
	"query":{
		"match_all": {}
	},
	"_source": ["title"]
}

分页查询

http://localhost:9200/shopping/_search
{
	"query":{
		"match_all":{}
	},
	"from": 0,
	"size": 2
}

查询排序

http://localhost:9200/shopping/_search
{
	"query": {
		"match_all":{}
	},
	"sort":{
		"price":{
			"order": "desc"
		}
	}
}

多条件查询
逻辑与 must 逻辑或 should

http://localhost:9200/shopping/_search
{
	"query":{
		"bool":{
			"must": [{
				"match": {
					"categroy": "小米"
				}
			}{
				“match”: {
					"price": 3999.00
				}
			}]
		}
	}
}

范围查询

http://localhost:9200/shopping/_search
{
	"query":{
		"bool": {
			"should":[{
				"match":{
					"categroy": ”小米“
				}
			},{
				"match":{
					"categroy": ”华为“
				}
			}
			]
		},
		"filter":{
			"range":{
				"price":{
					"gt": 2000
				}
			}
		}
	}
}

全文检索(匹配数组)
查询query进行分割,再召回进行搜索

http://localhost:9200/shopping/_search
{
	"query":{
		"match":{
			"categroy": "小 为"
		}
	}
}

完全匹配
不会将查询语句进行分词处理的查询

http://localhost:9200/shopping/_search
{
	"query":{
		"match_phrase":{
			"categroy": "小 为"
		}
	}
}

精确查询
term代表精确匹配,不会对搜索文本进行分词,并且对keyword进行匹配,text被分词后,有可能不会被查询出来

http://localhost:9200/shopping/_search
{
	"query":{
		"term":{
			"name": "张三"
		}
	}
}

高亮查询

http://localhost:9200/shopping/_search
{
	"query":{
		"match":{
			"name": "张三"
		}
	},
	"highlight":{
		"pre_tags": "",
		"post_tags": ""
		"fields":{
			"name":{}
		}
	}
}

聚合查询

统计

http://localhost:9200/shopping/_search
{
	"aggs": {
		"price_group":{
			"terms":{	//分组统计
				"field": "price"
			}
		}
	}
}

求平均

http://localhost:9200/shopping/_search
{
	"aggs":{
		"price_avg": {
			"avg":{	//求平均
				"field": "price"
			}
		}
	},
	"size": 0	//原始数据的展示数量
}

你可能感兴趣的:(开发相关,elasticsearch,自然语言处理,数据库开发)