ElasticSearch基础(一)

ElasticSearch基础(二)

一、什么是ElasticSearch?

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。

ElaticSearch,简称为es, es是一个开源的高扩展的分布式全文检索和分析引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
elasticsearch相当于数据库。

官方说明 :
Elasticsearch 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,由 Elasticsearch N.V.(即现在的 Elastic)于 2010 年首次发布。Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件;Elastic Stack 是一套适用于数据采集、扩充、存储、分析和可视化的免费开源工具。人们通常将 Elastic Stack 称为 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为 Beats,可用来向 Elasticsearch 发送数据。

Elasticsearch 的用途是什么?

Elasticsearch 在速度和可扩展性方面都表现出色,而且还能够索引多种类型的内容,这意味着其可用于多种用例:

应用程序搜索
网站搜索
企业搜索
日志处理和分析
基础设施指标和容器监测
应用程序性能监测
地理空间数据分析和可视化
安全分析
业务分析

Elasticsearch 的工作原理是什么?

原始数据会从多个来源(包括日志、系统指标和网络应用程序)输入到 Elasticsearch 中。数据采集指在 Elasticsearch 中进行索引之前解析、标准化并充实这些原始数据的过程。这些数据在 Elasticsearch 中索引完成之后,用户便可针对他们的数据运行复杂的查询,并使用聚合来检索自身数据的复杂汇总。在 Kibana 中,用户可以基于自己的数据创建强大的可视化,分享仪表板,并对 Elastic Stack 进行管理。

Elasticsearch 索引是什么?

Elasticsearch 索引指相互关联的文档集合。Elasticsearch 会以 JSON 文档的形式存储数据。每个文档都会在一组键(字段或属性的名称)和它们对应的值(字符串、数字、布尔值、日期、数值组、地理位置或其他类型的数据)之间建立联系。

Elasticsearch 使用的是一种名为倒排索引的数据结构,这一结构的设计可以允许十分快速地进行全文本搜索。倒排索引会列出在所有文档中出现的每个特有词汇,并且可以找到包含每个词汇的全部文档。

在索引过程中,Elasticsearch 会存储文档并构建倒排索引,这样用户便可以近实时地对文档数据进行搜索。索引过程是在索引 API 中启动的,通过此 API 您既可向特定索引中添加 JSON 文档,也可更改特定索引中的 JSON 文档。

为何使用 Elasticsearch?

Elasticsearch 很快。由于 Elasticsearch 是在 Lucene 基础上构建而成的,所以在全文本搜索方面表现十分出色。Elasticsearch 同时还是一个近实时的搜索平台,这意味着从文档索引操作到文档变为可搜索状态之间的延时很短,一般只有一秒。因此,Elasticsearch 非常适用于对时间有严苛要求的用例,例如安全分析和基础设施监测。

Elasticsearch 具有分布式的本质特征。Elasticsearch 中存储的文档分布在不同的容器中,这些容器称为分片,可以进行复制以提供数据冗余副本,以防发生硬件故障。Elasticsearch 的分布式特性使得它可以扩展至数百台(甚至数千台)服务器,并处理 PB 量级的数据。

Elasticsearch 包含一系列广泛的功能。除了速度、可扩展性和弹性等优势以外,Elasticsearch 还有大量强大的内置功能(例如数据汇总和索引生命周期管理),可以方便用户更加高效地存储和搜索数据。

Elastic Stack 简化了数据采集、可视化和报告过程。通过与 Beats 和 Logstash 进行集成,用户能够在向 Elasticsearch 中索引数据之前轻松地处理数据。同时,Kibana 不仅可针对 Elasticsearch 数据提供实时可视化,同时还提供 UI 以便用户快速访问应用程序性能监测 (APM)、日志和基础设施指标等数据。

1.使用倒排索引的方式 速度快
2.使用分词器,可以做到精准的搜索
3.支持PB级别数据 上百个节点扩展

ElasticSearch常见经典面试题

1、ElasticSearch的使用案例

2013年初,GitHub抛弃了Solr,采取ElasticSearch 来做PB级的搜索。 “GitHub使用ElasticSearch搜索20TB的数据,包括13亿文件和1300亿行代码”

维基百科:启动以elasticsearch为基础的核心搜索架构

SoundCloud:“SoundCloud使用ElasticSearch为1.8亿用户提供即时而精准的音乐搜索服务”

百度:百度目前广泛使用ElasticSearch作为文本数据分析,采集百度所有服务器上的各类指标数据及用户自定义数据,通过对各种数据进行多维分析展示,辅助定位分析实例异常或业务层面异常。目前覆盖百度内部20多个业务线(包括casio、云析分、网盟、预测、文库、直达号、钱包、风控等),单集群最大100台机器,200个ES节点,每天导入30TB+数据

新浪:使用ES 分析处理32亿条实时日志

阿里:使用ES 构建挖财自己的日志采集和分析体系

2、ElasticSearch对比Solr

Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能;

Solr 支持更多格式的数据,而 Elasticsearch 仅支持json文件格式;

Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多由第三方插件提供;

Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch;

Elasticsearch支持RestFul风格编程(uri的地址,就可以检索),Solr暂不支持;
ElasticSearch基础(一)_第1张图片在这里插入图片描述

3、理解倒排索引

通常我们搜索某些东西,是通过内容,找词 这样容易区分,这种方式成为正向搜索,那么数据量大就效率低,那么还有一种就是倒排索引方式,可以通过词去找内容,这样速度就非常快了。

要建立倒排索引表,需要先对文本进行分词(理解成按照一定规则拆分出词条和值),也就是将词语进行切分然后形成某种结构和映射关系。

那么这个过程就是分词,分词的过程需要有分词器来进行。我们有许多的分词器,默认就是标准分词器。

4、几个概念

4.1) 索引(index)
一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。索引类似于关系型数据库中Database的概念。在一个集群中,如果你想,可以定义任意多的索引。

4.2) 类型(type)
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。类型类似于关系型数据库中Table的概念。

4.3)文档(document)
一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以JSON(Javascript Object Notation)格式来表示,而JSON是一个到处存在的互联网数据交互格式。
在一个index/type里面,只要你想,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的type。文档类似于关系型数据库中Record的概念。实际上一个文档除了用户定义的数据外,还包括_index、_type和_id字段。

二、ElasticSearch安装与启动

https://www.elastic.co/downloads/past-releases/elasticsearch-5-6-8

1、安装ES服务

Window版的ElasticSearch的安装很简单,类似Window版的Tomcat,解压开即安装完毕,解压后的ElasticSearch的目录结构如下:
ElasticSearch基础(一)_第2张图片注意:ES的解压目录不要出现中文,也不要有特殊字符。
双击elasticsearch.bat 启动服务

注意:

9300是tcp通讯端口,集群间和TCPClient都执行该端口,可供java程序调用;
9200是http协议的RESTful接口

通过浏览器访问ElasticSearch服务器,看到如下返回的json信息,代表服务启动成功:
ElasticSearch基础(一)_第3张图片
ElasticSearch5是使用java开发的,且本版本的es需要的jdk版本要是1.8以上

(2)出现闪退,通过路径访问发现“空间不足”

修改:解压目录下的/config/jvm.options文件
ElasticSearch基础(一)_第4张图片

2、安装ES的图形化界面插件

ElasticSearch不同于Solr自带图形化界面,我们可以通过安装ElasticSearch的head插件,完成图形化界面的效果,完成索引数据的查看。

*elasticsearch-5-以上版本安装head插件,需要先安装 nodejs 以及 grunt
2.1、安装nodejs
ElasticSearch基础(一)_第5张图片安装成功后,执行cmd命令查看版本:

node -v

ElasticSearch基础(一)_第6张图片npm和cnpm(windows)安装步骤
npm(node package manager):nodejs的包管理器,用于node插件管理(包括安装、卸载、管理依赖等)
cnpm:因为npm安装插件是从国外服务器下载,受网络的影响比较大,可能会出现异常,如果npm的服务器在中国就好了,所以我们乐于分享的淘宝团队干了这事。来自官网:“这是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。”

2.2、安装ES head 插件

cd到目录elasticsearch-head-master中 执行命令

npm run start

2.3、配置ES支持head插件
修改elasticsearch/config下的配置文件:elasticsearch.yml,增加以下配置:

http.cors.enabled: true
http.cors.allow-origin: "*"
network.host: 127.0.0.1

解释:
http.cors.enabled: true:此步为允许elasticsearch跨域访问,默认是false。
http.cors.allow-origin: “*”:表示跨域访问允许的域名地址(*表示任意)。
network.host:127.0.0.1:主机域名
ElasticSearch基础(一)_第7张图片

3、docker方式

3.1 安装

docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.7

3.2 安装es容器

# 启动单节点Elasticsearch集群进行开发或测试
docker run -it -d --name es01-test  -p 127.0.0.1:9200:9200 -p 127.0.0.1:9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.17.7

(3)开启远程连接
上面完成安装后,es并不能正常使用,elasticsearch从5版本以后默认不开启远程连接,程序直接连接会报如下错误:

failed to load elasticsearch nodes : org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: [{#transport#-1}{5ttLpMhkRjKLkvoY7ltUWg}{192.168.211.132}{192.168.211.132:9300}]

copy elasticsearch.yml文件到宿主机,修改之后在copy回去

docker cp cg_elasticsearch:/usr/share/elasticsearch/config/elasticsearch.yml ./

修改elasticsearch.yml文件 vim elasticsearch.yml
ElasticSearch基础(一)_第8张图片copy回docker容器中:

docker cp ./elasticsearch.yml changgou_elasticsearch:/usr/share/elasticsearch/config/

(4)系统参数配置
重启后发现重启启动失败了,这时什么原因呢?这与我们刚才修改的配置有关,因为elasticsearch在启动的时候会进行一些检查,比如最多打开的文件的个数以及虚拟内存区域数量等等,如果你放开了此配置,意味着需要打开更多的文件以及虚拟内存,所以我们还需要系统调优

修改vi /etc/security/limits.conf ,追加内容 (nofile是单个进程允许打开的最大文件个数 soft nofile 是软限制 hard nofile是硬限制 )

* soft nofile 65536
* hard nofile 65536

修改vi /etc/sysctl.conf,追加内容 (限制一个进程可以拥有的VMA(虚拟内存区域)的数量 )

vm.max_map_count=655360

执行下面命令 修改内核参数马上生效

sysctl -p

重新启动虚拟机,再次启动容器,发现已经可以启动并远程访问

reboot

三、ElasticSearch相关概念

系统中的问题
1.传统的方式进行搜索的时候速度慢
2.搜索的精度不高
ElasticSearch基础(一)_第9张图片

Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储(store),还会索引(index)每个文档的内容使之可以被搜索。在Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。Elasticsearch比较传统关系型数据库如下:

Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices   -> Types  -> Documents -> Fields

ElasticSearch基础(一)_第10张图片

ElasticSearch基础(一)_第11张图片
索引 index —> 数据库的库

类型 type —> 数据库的表

文档 document —> 数据库的表中的行

字段 Field —> 数据库中的行的列

映射 Mapping —> 列的限制(约束)

3.2.1 索引 index

一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,可以定义任意多的索引。

3.2.2. 类型 type

​ 在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。

3.2.3. 文档 document

​ **一个文档是一个可被索引的基础信息单元。**比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以JSON(Javascript Object Notation)格式来表示,而JSON是一个到处存在的互联网数据交互格式。

在一个index/type里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的type。

注意:

每一篇文档注意在进行创建的时候都会进行打分。用于进行排名,打分的公式实际上用的就是lucene的打分公式。

3.2.4. 字段Field

​ 相当于是数据表的字段,对文档数据根据不同属性进行的分类标识
name:value 相当于列名和列值

3.2.5. 映射 mapping

映射是定义文档及其包含的字段如何存储和索引的过程。
每个文档都是字段的集合,每个字段都有自己的数据类型。在映射数据时,创建映射定义,其中包含与文档相关的字段列表。映射定义还包括元数据字段,如_source字段,它自定义如何处理文档关联的元数据。

使用动态映射和显式映射来定义数据。每种方法根据您在数据旅程中的位置提供不同的好处。例如**,显式地映射不希望使用默认值的字段,或者获得对创建哪些字段的更大控制。**然后,您可以允许Elasticsearch动态添加其他字段。

在7.0.0之前,映射定义包括一个类型名。Elasticsearch 7.0.0及以后版本不再接受默认映射。参见Removal of mapping types。

在搜索请求中定义运行时字段,以试验不同的映射选项,并通过在搜索请求期间覆盖
映射中的值来修复索引映射值中的错误。

显式映射

显式映射允许您精确地选择如何定义映射定义,例如:

  • 哪些字符串字段应该被视为全文文本字段。
  • 哪些字段包含数字、日期或地理位置。
  • 日期值的格式。
  • 用于控制动态添加字段的映射的自定义规则。
    防止映射激增的设置
    在索引中定义太多字段会导致映射激增(mapping explosion),从而导致内存不足错误和难以恢复的情况。
    考虑这样一种情况:插入的每个新文档都会引入新字段,例如使用动态映射。每个新字段都被添加到索引映射中,随着映射的增长,这可能会成为一个问题。

字段数据类型

常见类型

binary
二进制值编码为Base64字符串

boolean
true and false values.

Keywords
The keyword family, including keyword, constant_keyword, and wildcard.

Numbers
Numeric types, such as long and double, used to express amounts.

`Dates``
Date types, including date and date_nanos.

对象和关系类型

object
A JSON object.
flattened
An entire JSON object as a single field value.

nested
保留其子字段之间关系的JSON对象。

数组(arrays )

在Elasticsearch中,数组不需要专用的字段数据类型。默认情况下,任何字段都可以包含零个或多个值,但是数组中的所有值必须具有相同的字段类型

Multi-fields

为了不同的目的,用不同的方法索引相同的字段通常是有用的
例如,字符串字段可以映射为用于全文搜索的text 字段,也可以映射为用于排序或聚合的keyword 字段。另外,您也可以使用standard分析器、english 分析器和french 分析器对text 字段进行索引。

这就是 multi-fields的目的。大多数字段类型通过fields参数支持多字段。

例如:
ElasticSearch基础(一)_第12张图片Field中有四个重要的属性:数据类型,是否分词 是否存储 是否索引. 类似于指定数据库中的表中的列的一些约束,需要根据不同的应用场景来决定使用哪种数据类型和属性值。

  • 数据类型 定义了该Field的数据存储的方式 有基本数据类型 和 字符串类型以及 复杂的数据类型
  • 是否分词 定义了该字段的值是否要被索引。分词的目的就是为了要索引
  • 是否索引 定义了该字段是否要被搜索 要索引的目的就是为了要搜索
  • 是否存储 定义了是否存储该数据到底层的lucene中.默认是不存储的。存储不存储看页面是否需要展示

图解Elasticsearch中的_source、_all、store和index属性

3.2.6. 接近实时 NRT(near real time)

​ Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒以内)

3.2.7. 集群 cluster

一个集群就是由一个或多个节点组织在一起,它们共同持有整个的数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,这个名字默认就是“elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。

3.2.8. 节点 node

一个节点是集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。和集群类似,一个节点也是由一个名字来标识的, 不能重复,默认情况下,这个名字是一个随机的角色的名字,这个名字会在启动的时候赋予节点。这个名字对于管理工作来说挺重要的,因为在这个管理过程中,你会去确定网络中的哪些服务器对应于Elasticsearch集群中的哪些节点。

一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做“elasticsearch”的集群中,这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。

在一个集群里,只要你想,可以拥有任意多个节点。而且,如果当前你的网络中没有运行任何Elasticsearch节点,这时启动一个节点,会默认创建并加入一个叫做“elasticsearch”的集群。

3.2.9. 分片 和 复制 shards & replicas

一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch提供了将索引划分成多份的能力,这些份就叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。分片很重要,主要有两方面的原因: 1)允许你水平分割/扩展你的内容容量。 2)允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量。

至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch管理的,对于作为用户的你来说,这些都是透明的。

在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫复制。

(后面大家自己看即可)

复制之所以重要,有两个主要原因在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的。扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并行运行。总之,每个索引可以被分成多个分片。一个索引也可以被复制0次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定在索引创建之后,你可以在任何时候动态地改变复制的数量,但是你事后不能改变分片的数量

默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个复制分片(1个完全拷贝),这样的话每个索引总共就有10个分片。

四、操作ElasticSearch

操作ES就相当于对操作数据库,我们应该知道针对数据库我们有不同的CRUD功能,那么同样的道理,操作elasticsearch也能有CRUD功能,只不过叫法不一样。有两种方式:如下:

  • 使用Elasticsearch提供的restfull风格的API实现操作ES
  • 使用elasticsearch提供的java Client API来实现操作ES 又有许多方式,我们这里主要使用springboot集成spring data elasticsearch来实现
    • java API 使用官方提供的TransportClient
    • java API 使用 REST clients
    • java api 使用 Jest
    • java api 使用 spring data elasticsearch(后续推荐使用)

TransportClient操作

spring data elasticsearch已有TransportClient依赖
4.1、添加依赖:

	<parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.1.4.RELEASEversion>
    parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-data-elasticsearchartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>
    dependencies>

4.2 配置文件

spring:
  data:
    elasticsearch:
      cluster-name: elasticsearch
      cluster-nodes: 127.0.0.1:9300

4.3 测试:

import com.fasterxml.jackson.databind.ObjectMapper;
import org.elasticsearch.client.transport.TransportClient;

@SpringBootTest
@RunWith(SpringRunner.class)
public class EsTest {
    @Autowired
    private TransportClient transportClient; //操作链接到es服务端的客户端API

    @Autowired
    private ObjectMapper objectMapper; //json的转换器
    //创建索引  创建类型  创建文档  能自动的进行映射  (创建博客系统 blog02,article类型,docuemnt数据(JSON))

    //insert update
    @Test
    public void create() throws JsonProcessingException {
        Article article = new  Article(1L, "聚天下英才而用之", "聚天下英才而用之");

        //参数1 指定索引名
        //参数2 指定类型名称
        //参数3 指定文档的唯一标识
        IndexResponse indexResponse = transportClient.prepareIndex("blog02", "article", "1")
                //参数1 指定文档的数据 是一个JSON字符串
                //参数2 指定数据类型 JSON数据类型
                .setSource(objectMapper.writeValueAsString(article), XContentType.JSON)
                .get();
        System.out.println(indexResponse);
    }

    //select
    @Test
    public void select(){
        GetResponse documentResponse = transportClient.prepareGet("blog02", "article", "1").get();
        String sourceAsString = documentResponse.getSourceAsString();
        System.out.println(sourceAsString);
    }

    //delete
    @Test
    public void delete(){
        transportClient.prepareDelete("blog02", "article", "1").get();

    }
}

ElasticSearch基础(一)_第13张图片

五、分词器和ElasticSearch集成使用

在进行数据存储的时候,需要先进行分词。而分词指的就是按照一定的规则将词一个个切割。这个规则是有内部的分词器机制来决定的,不同的分词器就是不同的规则

  • standard分词器
  • ik分词器
  • stop分词器
  • 其他的分词器
以上:在说明这个情况的时候我们应该知道在默认的情况下ES提供了英文相关的分词器默认为standard分词器
对于中文分词不是特别的好。所以我们需要用到中文相关的分词器,那么IK分词器就是其中的佼佼者

分词的过程比较复杂,不同的分词器就有不同的规则,例如:

如有一段文本:Lucene is a full-text search java 

使用标准分词器:
	浏览器地址输入:http://localhost:9200/_analyze?analyzer=standard&text=Lucene is a full-text search java

最终形成词汇为:
Lucene 
is 
a 
full 
text 
search 
java

使用停用分词器:
	浏览器地址输入:http://localhost:9200/_analyze?analyzer=stop&text=Lucene is a full-text search java

最终形成词汇为:
lucene 
full 
text 
search 
java

1、IK分词器

IK分词是一款国人开发的相对简单的中文分词器。虽然开发者自2012年之后就不在维护了,但在工程应用中IK算是比较流行的一款!

特点:

  1. 能将原本不是词的变成一个词
  2. 分词效果优秀
  3. 能将原本是一个词的进行停用,这些词我们称为停用词。停用词:单独运用没有具体语言意义的词汇,可根据语义自己定义。

1.1、IK分词器安装
https://github.com/medcl/elasticsearch-analysis-ik/releases

  • 先将其解压,将解压后的elasticsearch文件夹重命名文件夹为ik
  • 将ik文件夹拷贝到elasticsearch/plugins 目录下。
  • 重新启动,即可加载IK分词器

IK提供了两个分词算法ik_smart 和 ik_max_word. 其中 ik_smart 为最少切分(智能切分),ik_max_word为最细粒度划分

  • 第一种:最小切分
  • 第二种:种最细切分

测试第一种:浏览器中输入:

http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序员

1.2、自定义词库/词典

浏览器的测试效果如下  http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=boke 
{
  "tokens" : [
    {
      "token" : "播",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "CN_CHAR",
      "position" : 0
    },
    {
      "token" : "客",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "CN_CHAR",
      "position" : 1
    }
  ]
}

(1)通过测试1发现,播客没有作为整体被分词出来。我们需要将其扩展为一个词,此时我们需要自定义扩展词典

  • 进入elasticsearch/plugins/ik/config目录
  • 新建一个my.dic文件(文件名任意),特别注意编辑内容(以utf8无bom保存, 如果不行加一些换行)
播客

修改IKAnalyzer.cfg.xml(在ik/config目录下)

<properties>
    <comment>IK Analyzer 扩展配置comment>
    <!‐‐用户可以在这里配置自己的扩展字典,多个词典之间用分号分隔 ‐‐>
    <entry key="ext_dict">my.dicentry>
    <!‐‐用户可以在这里配置自己的扩展停止词字典‐‐>
    <entry key="ext_stopwords">entry>
properties>
  1. 如果需要停用一些词,比如有些文本在进行创建文档建立倒排索引的时候需要过滤掉一些没有用的词,则可以进行自定义词典:我们把他叫做停用词典

(1)进入elasticsearch/plugins/ik/config目录

(2)创建一个stopwords.dic 文件,特别注意:编辑内容(以utf8无bom保存, 如果不行加一些换行)

(3)在文件中添加一个字为:的

(4)修改IKAnalyzer.cfg.xml(在ik/config目录下)

<properties>
    <comment>IK Analyzer 扩展配置comment>
    <!‐‐用户可以在这里配置自己的扩展字典 ‐‐>
    <entry key="ext_dict">my.dicentry>
    <!‐‐用户可以在这里配置自己的扩展停止词字典‐‐>
    <entry key="ext_stopwords">stopwords.dicentry>
properties>

你可能感兴趣的:(分布式,elasticsearch,java)