Elasticsearch搜索中间件的Docker环境下安装和基本使用操作(增删改查、条件搜索、全文搜索、短语搜索、高亮搜索)

一、前言

检索功能是应用中非常常见的功能 而开源的Elasticsearch是全文搜索引擎的首选

Elasticsearch是一个底层基于Lucene的分布式搜索服务 Lucene是开源软件工具包 并不能直接使用
而Elasticsearch相当于是对其的封装 且提供了Restful风格的API 采用多shard(分片)的方式保证数据安全 还提供了自动resharding的功能
github等大型的站点也采用了Elasticsearch作为其搜索服务引擎

Elasticsearch可以快速存储 搜索和分析海量数据

二、安装

用Docker的方式安装
首先 要下载Elasticsearch的镜像

# 从阿里云的仓库拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/elasticsearch/elasticsearch:6.7.0

然后是启动容器
Elasticsearch默认使用9200端口进行web通信 分布式情况下Elasticsearch各个节点之间通信使用9300端口

# 启动容器
docker run -d -p 9200:9200 -p 9300:9300 --name ES01 02982be5777d

然后可在浏览器访问ip:9200
若出现如下数据 则启动成功:
在这里插入图片描述
若出现9200端口无法访问的情况
请参看鄙人另一篇博客:完美解决虚拟机安装Elasticsearch报错:[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase

三、使用

Elasticsearch是【面向文档】
这就意味着 它存储的是
整个对象或文档

Elasticsearch不仅是存储文档 而且会索引每个文档的内容 使之可以被检索
在Elasticsearch中 可对文档进行索引 检索 排序和过滤——​而不是仅仅对行列数据
这是一种完全不同的思考数据的方式 也是Elasticsearch能支持复杂全文检索的原因

Elasticsearch使用JSON(JavaScript Object Notation)作为文档的序列化格式
JSON 序列化为大多数编程语言所支持 并且已经成为NoSQL领域的标准格式 它简单 简洁 易于阅读 有轻量级和跨平台的优势

基本概念:

存储数据到Elasticsearch的行为叫做【索引】 但在索引一个文档之前 需要先确定将文档存储在哪里
(这里的索引是动词
索引一个文档 就是存储一个文档到一个 索引中以便被检索和查询
类似于SQL语句中的INSERT关键词)

一个Elasticsearch集群可以包含多个[索引] 相应的每个索引可以包含多个[类型]

这些不同的类型存储着多个[文档] 每个文档又有多个[属性]

(这里的索引是名词 类似于传统关系型数据库中的一个数据库 是一个存储关系型文档的地方)
在这里插入图片描述
若用MySQL作比较 就是:

  • Elasticsearch的的索引相当于MySQL的数据库
  • Elasticsearch的类型相当于MySQL的
  • Elasticsearch的文档相当于MySQL的记录
  • Elasticsearch的属性相当于MySQL的字段

1、增删改查

①、添加

要实现添加其实很简单
只需要发送一个PUT请求即可往指定索引的指定类型里存入一个文档

语法:

PUT请求 ----> ip:端口/索引名称/类型名称/编号

内容:

{
	要添加的JSON数据
}

例:

PUT请求 ----> ip:端口/zjitc/student/1
{
    "id" : "1",
    "name" :  "陈涛"
}

在这里插入图片描述


②、获取/查询

同样的 只需要发送一个GET请求即可获取一个指定文档:
语法:

GET请求 ----> ip:端口/索引名称/类型名称/编号

例:

GET请求 ----> ip:端口/zjitc/student/1

在这里插入图片描述


③、删除

发送一个DELETE请求即可删除一个指定文档
语法:

DELETE请求 ----> ip:端口/索引名称/类型名称/编号

例:

DELETE请求 ----> ip:端口/zjitc/student/3

在这里插入图片描述


④、判断是否存在

发送一个HEAD请求即可判断是否存在指定文档:
语法:

HEAD请求 ----> ip:端口/索引名称/类型名称/编号

例:

HEAD请求 ----> ip:端口/zjitc/student/3

在这里插入图片描述
在这里插入图片描述
不会有返回数据 若存在该数据 则返回200
不存在 则返回404


⑤、更新

PUT还能用于更新文档
语法:

PUT请求 ----> ip:端口/索引名称/类型名称/编号

内容:

{
    JSON数据
}

例:

PUT请求 ----> ip:端口/zjitc/student/1
{
    "id" : "1",
    "name" :  "王王涛"
}

在这里插入图片描述


2、高级搜索

①、搜索全部

使用_search
例:

GET请求 ----> ip:端口/zjitc/student/_search

在这里插入图片描述


②、条件搜索

命令行语法

使用_search?q=属性名:属性值
例:

GET请求 ----> ip:端口/zjitc/student/_search?q=id:2

能够根据相关性的得分将结果进行排序 类似于Redis的SortedSet

在这里插入图片描述


查询表达式语法

轻量搜索(命令行语法)可以通过命令非常方便地进行临时性的搜索 但它有自身的局限性
Elasticsearch提供了一个丰富灵活的查询语言 叫做【查询表达式】 它支持构建更加复杂和健壮的查询
单条件搜索:
语法:

POST请求 ----> ip:端口/索引名称/类型名称/_search

内容:

{
    "query" : {
        "match" : {
            "搜索条件key" : "搜索条件value"
        }
    }
}

例:

POST请求 ----> /zjitc/student/_search
{
    "query" : {
        "match" : {
            "id" : "1"
        }
    }
}

在这里插入图片描述


复杂搜索(多条件搜索):
通过添加filter来进行过滤查询结果
语法:

POST请求 ----> ip:端口/索引名称/类型名称/_search

内容:

{
    "query" : {
        "bool": {
            "must": {
                "match" : {
                    "首选搜索条件key" : "首选搜索条件value" 
                }
            },
            "filter": {
                "range" : {
                    "次选搜索条件key" : { "判断符" : 次选搜索条件value } 
                }
            }
        }
    }
}

例:

POST请求 ----> ip:端口/zjitc/student/_search
{
    "query" : {
        "bool": {
            "must": {
                "match" : {
                    "name" : "涛" 
                }
            },
            "filter": {
                "range" : {
                    "num" : { "gt" : 1 } 
                }
            }
        }
    }
}

在这里插入图片描述


③、全文搜索

只要目标字段包含搜索的条件中的值 都能查询出来
语法:

POST请求 ----> ip:端口/索引名称/类型名称/_search

内容:

{
    "query" : {
        "match" : {
            "搜索条件key" : "搜索条件value"
        }
    }
}

例:

POST请求 ----> ip:端口/zjitc/student/_search
{
    "query" : {
        "match" : {
            "about" : "rock climbing"
        }
    }
}

在这里插入图片描述


④、短语搜索

精确匹配一系列单词或短语
仅匹配同时包含“单词1”和“单词2” 并且 二者以短语“单词1 单词2”的形式紧挨着的记录
语法:

POST请求 ----> ip:端口/索引名称/类型名称/_search

内容:

{
    "query" : {
        "match_phrase" : {
            "搜索条件key" : "搜索条件value"
        }
    }
}

例:

POST请求 ----> ip:端口/zjitc/student/_search
{
    "query" : {
        "match_phrase" : {
            "hobby" : "watch TV"
        }
    }
}

在上述例子中 只会匹配hobby属性的值带有连着的watch TV的文档
若带有watch或TV 都不会匹配到


⑤、高亮搜索

在每个搜索结果中高亮部分文本片段 以便让用户知道为何该文档符合查询条件
语法:

POST请求 ----> ip:端口/索引名称/类型名称/_search

内容:

{
    "query" : {
        "match_phrase" : {
            "搜索条件key" : "搜索条件value"
        }
    },
    "highlight": {
        "fields" : {
            "要高亮的属性名" : {}
        }
    }
}

例:

POST请求 ----> ip:端口/zjitc/student/_search
{
    "query" : {
        "match_phrase" : {
            "name" : "涛"
        }
    },
    "highlight": {
        "fields" : {
            "name" : {}
        }
    }
}

在这里插入图片描述


发布了176 篇原创文章 · 获赞 5 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/Piconjo/article/details/105279672