Es的快速入门文档
1.对比数据库理解
ElasticSearch是面向文档型数据库,一条数据在这里就是一个文档。
注意:从ElasticSearch6.X开始,一个Index下只能包含一个Type,因此,在ElasticSearch7.X及之后的版本已经删除了Type的概念。
2.倒排索引
在关系型数据库中,我们经常通过索引找内容,但是在全文检索的场景中,关系型数据库通过like来逐行实现全文检索,数据量上来之后,显然不太现实。所以这时候就诞生了倒排索引,通过关键词建立索引,然后关联文档编号(id),通过关键词的匹配权重(score)来对文档进行排序。
3.IK分词器
github下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
找到和es一样的版本,这里我用的es为7.13.4,ik也选7.13.4版本。
下载之后传到服务器上,创建ik文件夹,解压到ik目录下。创建Dockerfile文件,内容如下:
FROM elasticsearch:7.13.4
ADD ik /usr/share/elasticsearch/plugins/elasticsearch-analysis-ik
如上图,含有ik分词器的es镜像已制作好。替换原来的镜像,重启es即可。
若使用的KubeSphere部署的es,参考下图:
重启之后,验证ik分词器是否安装好了,如下图,则说明已安装好。
这里我以Kibana为例,我们知道,ik分词器提供了两个分词算法:分别为ik_smart(最少切分)和ik_max_word(最细粒度切分)。
我这里输入"少年攻城狮说Java",期望切分成,"少年攻城狮","爱","中华"。
ik_smart的切分结果:
ik_max_word的切分结果:
两种算法对比后,发现"少年攻城狮"没有被切到一起,这说明ik分词器字典里没有"少年攻城狮"这个词,这时候对于这种定制化名词,我们就需要自己添加到ik分词器的字典里。
修改成功后,重新打镜像,替换原来的elasticsearch_ik:7.13.4镜像,重启es。
如上图,显然,我们的字典已生效。
4.REST风格操作ES
常用数据类型
4.1.创建索引
第一种创建方式:类似设计表
PUT /test1
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "long"
},
"birthday": {
"type": "date"
}
}
}
}
第二种创建方式:默认识别类型
PUT /test2/_doc/1
{
"name": "少年攻城狮",
"age": 18,
"birth": "1998-02-16"
}
#查看索引库默认属性,确认字段类型的默认值
GET test2
4.2.查看全部索引信息
GET _cat/indices?v
4.3.修改文档数据(推荐)
这种修改,当字段没有传的时候,不会覆盖成null值。
POST /test2/_doc/1/_update
{
"doc": {
"name": "张无忌"
}
}
4.4.删除索引
DELETE test
4.5.删除文档数据
DELETE test2/_doc/1
4.6.新增或修改文档数据(不推荐使用这种修改,推荐使用4.3的修改)
这个方法,存在就修改,不存在就新增,用这种方法做修改,少写了某个字段的时候,少写的字段的值会被赋上null值。
PUT /student/user/1
{
"name": "张三",
"age": 16,
"desc": "一顿操作猛如虎",
"tags": ["抽烟","喝酒"]
}
PUT /student/user/2
{
"name": "里斯",
"age": 18,
"desc": "天王盖地虎",
"tags": ["学习","喝酒"]
}
PUT /student/user/3
{
"name": "王五",
"age": 22,
"desc": "宝塔镇河妖",
"tags": ["旅游","喝酒"]
}
#根据id查看数据
GET /student/user/1
4.7.简单的查询
#根据id查询
GET /student/user/1
#_search代表查询操作,q代表查询条件
GET student/user/_search?q=name:张三
4.8.返回值只看指定列
GET student/user/_search
{
"query": {
"match": {
"name": "张三"
}
},
"_source": ["name","age"]
}
4.9.排序
4.10.分页
GET student/user/_search
{
"query": {
"match": {
"name": "张三"
}
},
"sort": [
{
"age": "desc"
}
],
"from": 0,
"size": 1
}
4.11.And查询(must)
4.12.Or查询(should)
GET student/user/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"name": "张三"
}
},
{
"match": {
"age": 18
}
}
]
}
}
}
4.13.Not查询(must_not)
GET student/user/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"name": "张三"
}
},
{
"match": {
"age": 18
}
}
]
}
}
}
4.14.范围查询(filter)
GET student/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "张三"
}
}
],
"filter": [
{
"range": {
"age": {
"gte": 18,
"lte": 23
}
}
}
]
}
}
}
4.15.数组内多条件查询
GET student/user/_search
{
"query": {
"match": {
"tags": "喝酒 习"
}
}
}
4.16.精确查询多个值(term查询)
待完善
4.17.自定义高亮查询
GET student/_search
{
"query": {
"match": {
"name": "张三"
}
},
"highlight": {
"pre_tags": "<p style='color:red'>",
"post_tags": "</p>",
"fields": {
"name": {}
}
}
}