ElasticSearch
引言
1.在海量数据中执行搜索功能时,如果使用MySQL, 效率太低。
2.如果关键字输入的不准确,一样可以搜索到想要的数据。
3.将搜索关键字,以红色的字体展示。
介绍:
es是一个使用java语言并且基于Lucene编写的搜索引擎框架,提供了分布式的全文搜索功能,提供了一个统一的基于restful风格的web接口。
- haystack:全文检索的框架,支持whoosh、solr、Xapian、Elasticsearc四种全文检索引擎。
- whoosh:纯Python编写的全文搜索引擎,虽然性能比不上sphinx、xapian、Elasticsearc等,但是无二进制包,程序不会莫名其妙的崩溃,对于小型的站点,whoosh已经足够使用,点击查看whoosh文档。
- jieba:一款免费的中文分词包,如果觉得不好用可以使用一些收费产品。
分布式:突出横向扩展能力。
全文检索:将一段词语进行分词,并且将分出的单个词语统一的放到一个分词库中,在搜索时,根据关键字去分词库中检索,找到匹配内容。(倒排索引)
端口:9200
倒排索引
1.将存放的数据,以一定的方式进行分词,并且将分词的数据存放到一个单独的分词库中
2.当用户去查询数据时,会将用户的查询关键字进行分词
3.然后去分词库中匹配内容,最终得到数据的id标识
4.根据id标识去存放数据的位置拉取到指定的数据
不会直接去存放数据的数据库检索而是先去分词库去检索,再返回数据库的数据
1.es服务中可以创建多个索引。
2.es服务每一个索引默认有5个分片。
3.每一个分片都会存在至少一个备份分片。
4.从分片默认是不会帮助检索数据,当es检索压力特别大时,备份分片才会帮助检索数据。
5.备份的分片必须放在不同的服务器中。
分片可以提高检索效率,分片1会备份分片2中的数据,防止分片2挂掉
kibana
kibana端口:5601
查看索引的文档信息
1.配置索引,点击进行下一步
2.点击Discover,进行查看
##启动es和kibana
cd /Users/yutang/docker_es
docker-compose up
1.索引基本操作
1.1 创建一个索引
#创建一个person索引
PUT /person
{
"settings": {
"number_of_shards": 5, //分片数
"number_of_replicas": 1 //备份数
}
}
1.2 查看索引信息
#查看索引
GET /person
1.3 删除索引
#删除索引
DELETE /person
1.4 ES中Field可以指定的类型
官网地址核心数据类型地址:https://www.elastic.co/guide/en/elasticsearch/reference/6.5/mapping-types.html
字符串String:
text:一般用于全文检索。将当前的field进行分词
keyword: 当前的Field不可被分词
数值类型Numeric:
long,
integer,
short,
byte,
double,
float,
half_float,
scaled_float
时间类型Data:
date,可以指定具体的格式
布尔类型Boolean:
boolean
二进制类型Binary:
binary
范围类型Range:
integer_range, float_range, long_range, double_range, date_range
经纬度类型:
geo_point:用来存储经纬度
ip类型:
ip:可以存储ipv4或者ipv6
1.5 创建索引并指定数据结构
以创建小说为例子
PUT /book
{
"settings": {
//备份数
"number_of_replicas": 1,
//分片数
"number_of_shards": 5
},
//指定具体的数据结构
"mappings": {
//指定类型 Type
"novel": {
//文件存储的Field属性名
"properties": {
"name": {
"type": "text",
//指定分词器的名称
"analyzer": "ik_max_word",
//指定当前的Field可以作为查询的条件,默认是true
"index": true
},
"authoor": {
"type": "keyword"
},
// 字数
"count": {
"type": "long"
},
"onSale": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"descr": {
"type": "text"
}
}
}
}
}
1.6 文档的操作
文档在ES服务中的唯一标志,_index, _type, _id 三个内容为组合,来锁定一个文档,操作抑或是修改
PUT要指定id,不然会失败;POST则不用
1.6.1 新建文档
- 自动生成id
POST /book/novel
{
"name": "西游记",
"authoor": "刘明",
"onSale": "2020-12-11",
"count": 100000,
"descr": "哈哈哈哈哈哈"
}
- 手动指定ID(更推荐)
PUT /book/novel/1
{
"name": "三国演义",
"authoor": "小明",
"onSale": "2020-12-11",
"count": 100000,
"descr": "哈哈哈哈哈哈"
}
1.6.2 修改文档
-
覆盖式修改
# 直接覆盖id为1的数据
PUT /book/novel/1
{
"name": "三国演义",
"authoor": "小明",
"onsale": "2020-12-11"
}
- doc修改方式(更推荐)
POST /book/novel/1/_update
{
"doc": {
"name": "极品家丁"
}
}
#先锁定文档,_update 修改需要的字段即可
1.6.3 删除文档
-
删库
DELETE /book/novel/1
1.6.4 查询结果过滤
_source 过滤显示指定字段
POST /book/novel/_search
{
"query": {
"match_all": {}
},
"_source": ["name", "authoor"]
}
1.6.5 排序
sort 按照指定顺序返回,此时的_score是nul
POST /book/novel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"count": {
"order": "desc" //降序
}
}
]
}