学习使用Elasticsearch

本文详细介绍Elasticsearch的安装、配置及使用,涵盖索引管理、文档操作、高级查询技巧及批处理方法,适合初学者快速掌握全文搜索引擎的核心功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.简介:
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。
设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的。我们希望搜索解决方案要运行速度快,我们希望能有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP来索引数据,我们希望我们的搜索服务器始终可用,我们希望能够从一台开始并扩展到数百台,我们要实时搜索,我们要简单的多用户,我们希望建立一个云的解决方案。因此我们利用Elasticsearch来解决所有这些问题及可能出现的更多其它问题。

二.安装:
去官网下载自己需要的版本,一般不会用最新的版本,我这里选择的是6.2.2

百度网盘链接:
Elasticsearch和kibana

提取码:bb3t
在这里插入图片描述
(1).该软件是基于Java编写的解压即用的软件,只需要有Java的运行环境即可,把压缩包解压后,进入到bin目录运行
elasticsearch.bat,出现以下界面,表示成功启动服务器
在这里插入图片描述
浏览器输入:http://localhost:9200,看到浏览器输出服务器的信息,表示安装成功,可以使用了
在这里插入图片描述
注意:程序启动后有两个端口9200和9300,9200端口用于HTTP协议,基于RESTFul来使用,9300端口用于TCP协议,基于jar包来使用

(2).后台启动
在这里插入图片描述
然后在启动时会出现一个小bug,这里需要在设置一下JAVA_HOME的位置.如下:
在这里插入图片描述
在这里插入图片描述
然后,自己去选择使用哪种启动方式
在这里插入图片描述
(3).安装head插件
Elasticsearch默认的客户端工具是命令行形式的,操作起来不方便,也不直观看到数据的展示,所以我们需要去安装一个可视化插件,但是这些插件都是基于H5开发的,在谷歌的应用商店中找到elasticsearch-head插件,然后安装,使用该插件能比较直观的展示服务器中的数据
在这里插入图片描述
(4).安装kibana
该软件也是解压即用的工具,用于管理和监控Elasticsearch的运作,同时内部包含了客户端工具,支持RESTFul操作Elasticsearch。解压后运行bin/kibana.bat,看到启动成功的端口号即可以使用浏览器来使用了
在这里插入图片描述
浏览器输入:http://localhost:5601
在这里插入图片描述
初学者暂时只用的上 Dev Tools
在这里插入图片描述

三.概念名词
(1)数据存储图
在这里插入图片描述
注意:从Elasticsearch6开始一个索引里面只能有一个类型,后续计划删除类型这个概念,从ES6开始一般让索引名称和类型名称一致

(2).主要组件
1.索引
ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库,或者一个数据存储方案(schema)。索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。一个ES集群中可以按需创建任意数目的索
引。
2.类型
类型是索引内部的逻辑分区(category/partition),然而其意义完全取决于用户需求。因此,一个索引内部可定义一个或多个类型(type)。一般来说,类型就是为那些拥有相同的域的文档做的预定义。例如,在索引中,可以定义一个用于存储用户数据的类型,一个存储日志数据的类型,以及一个存储评论数据的类型。类比传统的关系型数据库领域来说,类型相当于表。
3.映射
Mapping,就是对索引库中索引的字段名称及其数据类型进行定义,类似于mysql中的表结构信息。不过es的mapping比数据库灵活很多,它可以动态识别字段。一般不需要指定mapping都可以,因为es会自动根据数据格式识别它的类型,如果你需要对某些字段添加特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须手动添加mapping。需要注意的是映射是不可修改的,一旦确定就不允许改动,在使用自动识别功能时,会以第一个存入的文档为参考来建立映射,后面存入的文档也必须符合该映射才能存入
4.文档
文档是Lucene索引和搜索的原子单位,它是包含了一个或多个域的容器,基于JSON格式进行表示。文档由一个或多个域组成,每个域拥有一个名字及一个或多个值,有多个值的域通常称为多值域。每个文档可以存储不同的域集,但同一类型下的文档至应该有某种程度上的相似之处。

(3)分片和副本
ES的分片(shard)机制可将一个索引内部的数据分布地存储于多个节点,它通过将一个索引切分为多个底层物理的Lucene索引完成索引数据的分割存储功能,这每一个物理的Lucene索引称为一个分片(shard)。每个分片其内部都是一个全功能且独立的索引,因此可由集群中的任何主机存储。创建索引时,用户可指定其分片的数量,默认数量为5
个。
Shard有两种类型:primary和replica,即主shard及副本shard。Primary shard用于文档存储,每个新的索引会自动创建5个Primary shard,当然此数量可在索引创建之前通过配置自行定义,不过,一旦创建完成,其Primaryshard的数量将不可更改。Replica shard是Primary Shard的副本,用于冗余数据及提高搜索性能。每个Primaryshard默认配置了一个Replica shard,但也可以配置多个,且其数量可动态更改。ES会根据需要自动增加或减少这些Replica shard的数量。

(4).分词器
把文本内容按照标准进行切分,默认的是standard,该分词器按照单词切分,内容转变为小写,去掉标点,遇到每个中文字符都当成1个单词处理,后面会安装开源的中文分词器插件(ik)

(5).倒排索引
在这里插入图片描述
四.基本操作:
(1)索引操作:
1.建立索引
语法:PUT /索引名
在没有特殊设置的情况下,默认有5个分片,1个备份,也可以通过请求参数的方式来指定
在这里插入图片描述
在这里插入图片描述
如下配置.效果和上图是一致的
在这里插入图片描述
2.删除索引
在这里插入图片描述
(2).文档操作:
1.新增文档:

语法:
PUT /索引名/类型名/文档ID 
{
 field1: value1,
  field2: value2, 
  ... 
}

注意:当索引/类型/映射不存在时,会使用默认设置自动添加 ES中的数据一般是从别的数据库导入的,所以文档的ID会沿用原数据库中的ID 索引库中没有该ID对应的文档时则新增,拥有该ID对应的文档时则替换
每一个文档都内置以下字段
_index:所属索引
_type:所属类型
_id:文档ID
_version:乐观锁版本号
_source:数据内容
在这里插入图片描述
在这里插入图片描述
2.查询文档

语法:
 根据ID查询 -> GET /索引名/类型名/文档ID 
 查询所有(基本查询语句) -> GET /索引名/类型名/_search

在这里插入图片描述
在这里插入图片描述
查询所有结果中包含以下字段
took:耗时
_shards.total:分片总数
hits.total:查询到的数量
hits.max_score:最大匹配度
hits.hits:查询到的结果
hits.hits._score:匹配度

3.更新文档:

语法:
PUT /索引名/类型名/文档ID 
{
 field1: value1,
  field2: value2,
   ... 
}

注意:更新的只是文档的内容

4.删除文档:

语法:
DELETE /索引名/类型名/文档ID
注意:这里的删除并不是真正意义上的删除,仅仅是清空文档内容而已,并且标记该文档的状态为删除

(3).高级查询:
1.结果排序

参数格式: 
{ 
"sort": [
 {
 field: 排序规则
 },
  ... ] 
}
  排序规则: 
  asc表示升序 
  desc:表示降序
   没有配置排序的情况下,默认按照评分降序排列

2.分页查询

参数格式:
 {
  "from": start,//从第几条数据开始
   "size": pageSize//显示几条数据
 }

3.检索查询

参数格式: 
{
"query": { 检索方式: {field: value} } }

检索方式:
term表示精确匹配,value值不会被分词器拆分,按照倒排索引匹配
match表示全文检索,value值会被分词器拆分,然后去倒排索引中匹配
range表示范围检索,其value值是一个对象,如{ “range”: {field: {比较规则: value, …}} } 比较规则有gt / gte / lt / lte 等
注意:term和match都能用在数值和字符上,range多用在数值上

在这里插入图片描述
在这里插入图片描述
4.关键字查询

参数格式:
 {
  "query": 
  { 
  "multi_match": {
   "query": value,
    "fields": 
    [field1, field2, ...]
     } 
  }
}

multi_match:表示在多个字段间做检索,只要其中一个字段满足条件就能查询出来,多用在字符上

5.高亮显示

参数格式: {
 "query": { ... },
  "highlight": { "fields": { field1: {}, field2: {}, ... },
  "pre_tags": 开始标签,
   "post_tags" 结束标签
    } 
}

highlight:表示高亮显示,需要在fields中配置哪些字段中检索到该内容需要高亮显示 必须配合检索(term / match)一起使用

6.逻辑查询

参数格式: 
{
 "query": { 
     "bool": {
  逻辑规则: [
   {检索方式: {field: value}},
    ... ],
    ... 
             } 
        } 
}

逻辑规则:must / should / must_not,相当于and / or / not

7.过滤查询:

参数格式: 
{ 
"query": { 
"bool":
 { "filter": [ 
 { 检索方式: { field: value } }... ] } } }

从效果上讲过滤查询和检索查询能做一样的效果 区别在于过滤查询不评分,结果能缓存,检索查询要评分,结果不缓存 一般是不会直接使用过滤查询,都是在检索了一定数据的基础上再使用
关于filter的更多认知推荐大家读这篇博客:https://blog.youkuaiyun.com/laoyang360/article/details/80468757

8.分组查询:

参数格式: 
{
 "size": 0,
  "aggs": { 
      自定义分组字段: {
             "terms": { 
                "field": 分组字段, 
                   "order": {自定义统计字段:排序规则}, 
                   "size": 10 //默认显示10组 },
  "aggs": { //分组后的统计查询,相当于MySQL分组函数查询 
  自定义统计字段: { 
  分组运算: { 
  "field": 统计字段 
                } 
           } 
         } 
      } 
  } 
}

分组运算:avg / sum / min / max / value_count / stats(执行以上所有功能的) 注意:这里是size=0其目的是为了不要显示hit内容,专注点放在观察分组上

9.批处理
当需要集中的批量处理文档时,如果依然使用传统的操作单个API的方式,将会浪费大量网络资源,Elasticsearch为了提高操作的性能,专门提供了批处理的API
①mget批量查询

语法: 
GET /索引名/类型/_mget { 
"docs": [ 
      {"_id": 文档ID},
      ... 
        ] 
 }

②bulk批量增删改

语法: 
POST /索引名/类型/_bulk {
动作:{"_id": 文档ID}} 
{...} 
{动作:{"_id": 文档ID}} 
{...}
}

动作:create / update / delete,其中delete只有1行JSON,其他操作都是有2行JSON,并且JSON不能格式化(即不能随意换行),如 果是update动作,它的数据需要加个key为doc 如:{“update”: {"_id": xx}} {“doc”: {“xx”:xx, “xx”:xx}}

10.安装IK分词器
直接把压缩文件中的内容解压,然后放在elasticsearch/plugins下,然后重启即可
在这里插入图片描述
IK分词器:
ik_smart:粗力度分词
ik_max_word:细力度分词

GET /shop_product/_analyze {
 "text":"I am Groot", 
 "analyzer":"ik_smart"
  }

//举例
GET /shop_product/_analyze { 
"text":"英特尔酷睿i7处理器", 
"analyzer":"ik_smart" 
}

GET /shop_product/_analyze { 
"text":"英特尔酷睿i7处理器",
 "analyzer":"ik_max_word"
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值