文本 主要是记录一些 有关于ElasticSearch的入门的使用
是什么?
- ElasticSearch 简称 ES 是一个 开源的 高扩展的 分布式 全文检索 引擎
- 可以 近乎实时 的 存储 检索 数据 本身扩展性很好 可扩展到 上百台 服务器 处理 PB 级别的数据
- ElasticSearch 可以使用 Java开发 并使用 Lucene【注:1】作为其核心 来实现 所有 检索 和 搜索的功能 但是 它(ElasticSearch)的目的 是通过 简单的 RESTful API 来隐藏 Lucene 的 复杂性 从而 让 全文搜索变得简单
ElasticSearch 和 Solr 的 对比
- 上面说到了 目前常见的 两款 搜索引擎服务软件 接下来说说两者的区别
- Solr 利用Zookeeper 进行 分布式 管理 而 ElasticSearch 自身 带有 分布式 协调 管理功能
- Solr 支持 更多格式的数据 而 ElasticSearch 仅仅支持 JSON文件格式
- Solr 官方提供 的功能更多 而 ElasticSearch 本身更注重于核心功能 高级功能多由 第三方 插件提供
- Solr 在 传统的搜索 应用中表现 好于 ElasticSearch 但 在处理 实时搜索 应用时 效率 明显低于 ElasticSearch
应用场景
- 为 用户 提供 按 关键字 查询 的 全文搜索功能
- 著名的ELK框架(ElasticSearch,Logstash,Kibana【注:2】) 实现企业海量日志的 处理 分析 的解决方案 是 大数据 领域的重要一份子
- 分析用户的行为 精准营销 例如:用户鼠标在哪个商品上 图片上的停留时间 对商品的点击量 查看评论的条数
IK 分词器 【注:3】和 ElasticSearch 集成使用
- 下载
- 解压安装IK插件
- 直接解压到plugins\ik\目录下,注意目录结构,解压后的zip不要放在plugins目录下,删除掉
- 重新启动ElasticSearch之后,查看ElasticSearch启动日志 ,日志中加载了analysis-ik 代表安装成功
ElasticSearch 的客户端使用
安装好ElasticSearch后 在bin目录下 启动elasticsearch.bat(我这里是用的Windows版本)
等待ElasticSearch启动完毕 发送http请求(RESTful风格) 到 9200端口
Java代码 操作 9300端口
启动Kibana 可视化工具 (在其安装目录bin下 双击kibana.bat)
访问端口5061 在目录栏点击 开发工具
具体操作
索引库操作
创建索引库(index)
# 在kibana中,不用写地址和端口,/shopping是简化写法,真实请求地址是:发送请求 :http://127.0.0.1:9200/shopping
PUT /shopping
响应结果
#! Deprecation: the default number of shards will change from [5] to [1] in 7.0.0; if you wish to continue using the default of [5] shards, you must manage this on the create index request or with an index template
{
“acknowledged” : true,
“shards_acknowledged” : true,
“index” : “shopping”
}
“acknowledged” : true, 代表操作成功
“shards_acknowledged” : true, 代表分片操作成功
“index” : “shopping” 表示创建的索引库名称
注意:创建索引库的分片数默认5片,在7.0.0之后的ElasticSearch版本中,默认1片;
重复添加:报错,已经存在
查看所有索引(index)
发送请求:GET /_cat/indices?v
表头的含义(查看帮助信息:GET/_cat/indices?help)
- health : 当前服务器健康状态(green集群完整 yellow单点正常 集群不完整 red单点不正常)
- status : 索引打开 关闭状态
- index :索引名
- uuid : 索引统一编号
- pri : 主分片数量
- rep : 副分片数量
- docs.count : 可用文档数量
- docs.deleted : 文档删除状态 (逻辑删除 段合并时被清除)
- store.size : 主分片 和 副分片 整体 占 空间大小
- pri.store.size : 主分片 占 空间大小
查看某个索引(index)
发送请求 :GET /shopping
响应结果
{
“shopping” : {
“aliases” : { },
“mappings” : { },
“settings” : {
“index” : {
“creation_date” :
“1586587411462”,
“number_of_shards” :
“5”,
“number_of_replicas” :
“1”,
“uuid” :
“VCl1hHsJQDe2p2dn46o0NA”,
“version” : {
“created” :
“6080199”
},
“provided_name” :
“shopping”
}
}
}
}内容解释:
{
“shopping【索引库名】” : {
“aliases【别名】” : { },
“mappings【映射】” : { },
“settings”【索引库设置】 : {
“index【索引】” : {
“creation_date【创建时间】” : “1586587411462”,
“number_of_shards【索引库分片数】” : “5”,
“number_of_replicas【索引库副本数】” : “1”,
“uuid【唯一标识】” : “VCl1hHsJQDe2p2dn46o0NA”,
“version【版本】” : {
“created” : “6080199”
},
“provided_name【索引库名称】” : “shopping”
}
}
}
}
删除索引(index)
发送请求:DELETE /shopping
响应结果
{
“acknowledged” : true
}
类型及映射操作
类型(type)及(mapping)操作
创建类型映射
有了索引库,等于有了数据库中的database。
接下来就需要建索引库(index)中的类型(type)了,类似于数据库(database)中的表(table)。创建数据库表需要设置字段名称,类型,长度,约束等;索引库也一样,在创建索引库的类型时,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做映射(mapping)。
给shopping这个索引库添加了一个名为product的类型,并且在类型中设置了4个字段:
- title:商品标题
- subtitle: 商品子标题
- images:商品图片
- price:商品价格
发送请求:
PUT /shopping/product/_mapping
{
“properties”: {
“title“:{
“type”: “text”,
“analyzer”: “ik_max_word”
},
“subtitle“:{
“type”: “text”,
“analyzer”: “ik_max_word”
},
“images“:{
“type”: “keyword”,
“index”: false
},
“price“:{
“type”: “float”,
“index”: true
}
}
}
内容解释:
PUT / 索引库名/_mapping/类型名称或 索引库名/类型名称/_mapping
{
“properties”: {
“字段名称”:{
“type【类型】”: “类型”,
“index【是否索引】”: true,
“store【是否存储】”: false,
“analyzer【分词器】”: “具体分词器”
}
…
}
}
响应结果
#!Deprecation: [types removal] Specifying types in put mapping requests is
deprecated. To be compatible with 7.0, the mapping definition should not be
nested under the type name, and the parameter include_type_name must be
provided and set to false.
{
“acknowledged” : true
}说明:
#! 弃用:[类型删除]不建议在放置映射请求中指定类型。 为了与7.0兼容,映射定义不应嵌套在类型名称下,并且必须提供参数include_type_name并将其设置为false。
- 类型名称:就是前面将的type的概念,类似于数据库中的表
- 字段名:任意填写,下面指定许多属性,例如:title、subtitle、images、price
- type:类型,Elasticsearch中支持的数据类型非常丰富,说几个关键的
- String类型,又分两种:
- text:可分词
- keyword:不可分词,数据会作为完整字段进行匹配
- Numerical:数值类型,分两类
- 基本数据类型:long、interger、short、byte、double、float、half_float
- 浮点数的高精度类型:scaled_float
- Date:日期类型
- Array:数组类型
- Object:对象
- index:是否索引,默认为**true**,也就是说你不进行任何配置,所有字段都会被索引。
- true:字段会被索引,则可以用来进行搜索
- false:字段不会被索引,不能用来搜索
- store:是否将数据进行独立存储,默认为false
- 原始的文本会存储在_source里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source里面提取出来的。当然你也可以独立的存储某个字段,只要设置”store”: true即可,获取独立存储的字段要比从_source中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置。
- analyzer:分词器,这里的ik_max_word即使用ik**分词器**
查看类型映射
发送请求:GET /shopping/product/_mapping
响应结果:
{
“shopping” : {
“mappings” : {
“product” : {
“properties” : {
“images” : {
“type” :
“keyword”,
“index” : false
},
“price” : {
“type” :
“float”
},
“subtitle” : {
“type” :
“text”,
“analyzer” :
“ik_max_word”
},
“title” : {
“type” :
“text”,
“analyzer” :
“ik_max_word”
}
}
}
}
}
}创建索引库同时进行映射配置(常用)
发送请求:
PUT /shopping2
{
“settings”: {},
“mappings”: {
“product“:{
“properties”: {
“title“:{
“type”: “text”,
“analyzer”: “ik_max_word”
},
“subtitle“:{
“type”: “text”,
“analyzer”: “ik_max_word”
},
“images“:{
“type”: “keyword”,
“index”: false
},
“price“:{
“type”: “float”,
“index”: true
}
}
}
}
}
响应结果:
{
“acknowledged” : true,
“shards_acknowledged” : true,
“index” : “shopping2”
}
其他的 操作 下一篇 ElasticSearch 相关操作 再进行说明
Lucene【注:1】 是什么?
- Lucene 是一个 提供全文搜索功能类库的 核心工具包 (真正使用它 还需要完善的服务架构搭起来 进行应用)
- ElasticSearch 的 处理分词 构建倒排索引 等等 都是 Lucene做的
- 目前 市面上流行的 搜索引擎软件 主流:ElasticSearch 和 Solr 这两款都是 基于Lucene 搭建的 可以独立部署启动的 搜索引擎服务软件
由于内核相同 两者 除了 服务器安装 部署 管理 集群外 对于数据的操作 修改 添加 保存 查询 都十分相似
ELK框架(ElasticSearch,Logstash,Kibana)【注:2】是什么?
- ELK 是 三大开源架构的 首字母大写 简称 市面上 也称为 Elastic Stack
- Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。应用于程序搜索、网站搜索、企业搜索、日志处理和分析、基础设施指标和容器监测、应用程序性能监测、地理空间数据分析和可视化、安全分析、业务分析等。
- Logstash 是Elastic Stack 的核心产品之一,可用来对数据进行聚合和处理,并将数据发送到ElasticSearch。Logstash是一个开源的服务器端数据处理管道,允许您在将数据索引到
Elasticsearch 之前同时从多个来源采集数据,并对数据进行充实和转换。- Kibana 是一款适用于Elasticsearch 的数据可视化和管理工具,可以提供实时的直方图、线形图、饼状图和地图。Kibana 同时还包括诸如 Canvas 和 Elastic Maps 等高级应用程序;Canvas 允许用户基于自身数据创建定制的动态信息图表,而 Elastic Maps 则可用来对地理空间数据进行可视化。
IK分词器【注:3】是什么?
- IKAnalyzer是一个开源的,基于Java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出 了3个大版本。最初,它是以开源项目Lucene为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。
- IK分词器3.0的特性如下
- 采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力。
- 采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。
- 对中英联合支持不是很好,在这方面的处理比较麻烦.需再做一次查询,同时是支持个人词条的优化的词典存储,更小的内存占用。
- 支持用户词典扩展定义。
- 针对Lucene全文检索优化的查询分析器IKQueryParser;采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率。