标签归档:Elasticsearch

elasticsearch —— 基本操作命令

一直以来没有时间细细的看elasticsearch的命令操作。最近公司需要做一个直播聊天系统。我就想把聊天内容放到elasticsearch里面。乘这个机会来整理一下基本操作命令。

注: 命令语法是基于kibana的插件sense的格式。

  • 基本命令
    • 索引操作
    • 类型mapping添加
  • curd
  • 搜索、过滤
  • 其他

基本命令

1、 查看elasticsearch信息

会返回一些elasticsearch的基本信息。
比如说elasticsearch会自动帮助本节点取的名字,以及集群名字,版本信息,基于lucene的版本信息,以及口号You Know, for Search

索引操作

2、创建索引

重复创建会报错。

创建时还可以初始化一些设置。

number_of_shards表示分片数,初始化后不能修改。
number_of_replicas表示副本数,初始化后可修改。

副本是为了保障数据的可靠性,当一个节点的主分片丢失,elasticSearch可以把任意一个可用的分片副本推举为主分片。所以elasticSearch会默认创建一个副本。

分片则是为了提高查询的吞吐量。一个索引会分成多个分片存储。分片会带来额外的分割和合并的损耗,理论上分片数越少,搜索的效率越高

分片数量推荐: 分片数*副本数=集群数量

所以如果是单机的话,可以设置为1个分片,1个副本。

3、 修改索引设置

4、查看索引

会返回一写索引的基本信息。如: 别名、mapping、设置信息。

5、 删除索引

重复删除与会报错。

类型操作

6、 创建type并且插入数据

当然,同一个索引下可以创建多个不同的类型。这写类型的mapping可以不一致。

7、 创建type并且插入数据

上面2个创建都是通过直接插入数据,自动映射出mapping。我们也可以手动设置mapping。以及关闭自动映射mapping

8、 创建type但是不插入数据

通过设置配置文件./config/elasticsearch.yml 来关闭自动映射mapping。如果没有的话直接添加即可。

9、 修改类型

注: elasticsearch2.x版本后取消了直接删除类型的操作。

curd

10、 添加数据

11、 根据ID获取数据

12、 更新整个文档

13、 局部更新

14、 删除文档

15、 批量获取

也可以通过ID来获取,如果不存在,该IDfoundfalse

16、 批量操作

bulk API允许我们使用单一请求来实现多个文档的createindexupdatedelete

这种格式类似于用”\n”符号连接起来的一行一行的JSON文档流
格式如下:

注意: 由于delete操作没有报文,所以报文不需要填写。具体如下:

搜索和过滤

为了方便测试我在type_3中添加了4条测试数据。

17、 查询数据所有数据

18、 分页搜索

19、 排序查询

20、 多字段排序

按年龄升序,在年龄相同的情况下,按手机号倒序。

条件查询

21、空查询,即无条件查询

可以简化为

22、 按谈条件查询

22、多条件搜索

mysql相比较的话,
must 类似 and xxx = xxx
must not 类似 and xxx != xxx
should 类似 or

23、 and 条件 age = 19 and name 包含 4

24、 or 条件 age = 19 or name 包含 John

25、 (name 包含 4 and age = 19) or name 包含 3

过滤查询

过滤查询与条件查询的语法类型,只是把query替换成了filter

那么 filterquery 有什么区别么?

主要的区别:
1、 filter的结果将会被缓存,而query的结果。
2、 filter出来的记过_score字段全部为1,而query则计算相关性,为每个结果打分。
3、运用场景,如果你的查询是范围和类型比较粗大的,用filter ! 如果是那种精准的,就用query来查询。

26、 filter基本操作

27、 范围查询

28、 查询test索引里存在age字段的文档

29、查询test索引里不存在age字段的文档

30、term过滤

term主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed的字符串

31、 多个字段匹配过滤同一个关键词

搜索过滤结合使用

32、 filtered查询

filtered查询的有点事:借助于filter的速度可以快速过滤出文档,然后再由query根据条件来匹配。推荐使用。

其他操作

33、 获取文档条数

当然查询颗粒度可以更粗或更细。

34、 查看所有基本信息

35、 查看mapping

elasticsearch —— kibana

一、简介

Logstash 早期曾经自带了一个特别简单的 logstash-web 用来查看 ES 中的数据。其功能太过简单,于是 Rashid Khan 用 PHP 写了一个更好用的 web,取名叫 Kibana。这个 PHP 版本的 Kibana 发布时间是 2011 年 12 月 11 日。
Kibana 迅速流行起来,不久的 2012 年 8 月 19 日,Rashid Khan 用 Ruby 重写了 Kibana,也被叫做 Kibana2。因为 Logstash 也是用 Ruby 写的,这样 Kibana 就可以替代原先那个简陋的 logstash-web 页面了。
目前我们看到的 angularjs 版本 kibana 其实原名叫 elasticsearch-dashboard,但跟 Kibana2 作者是同一个人,换句话说,kibana 比 logstash 还早就进了 elasticsearch 名下。这个项目改名 Kibana 是在 2014 年 2 月,也被叫做 Kibana3。全新的设计一下子风靡 DevOps 界。随后其他社区纷纷借鉴,Graphite 目前最流行的 Grafana 界面就是由此而来,至今代码中还留存有十余处 kbn 字样。
2014 年 4 月,Kibana3 停止开发,ES 公司集中人力开始 Kibana4 的重构,在 2015 年初发布了使用 JRuby 做后端的 beta 版后,于 3 月正式推出使用 node.js 做后端的正式版。由于设计思路上的差别,一些 K3 适宜的场景并不在 K4 考虑范围内,所以,至今 K3 和 K4 并存使用。

二、安装

1、下载

2、解压

完成

三、运行使用

1、启动

2、 设置

浏览器访问 kibana 网址,http://192.168.1.5:5601/

进入setting界面,进行设置。如图:
enter image description here

建立索引以便我们查看,在上一章节里我们创建了index索引,我们这里就为kibana创建index索引。

如图:

enter image description here

点击create进行创建后,我们可以进入Discover界面查看index索引中的相关数据。

如图:

enter image description here

我们可以到上一章节中我们输入的数据。

四、安装插件

安装Marvel

1、首先为ES安装插件

2、安装Marvel

重启Kibana后可以重下图中看到Marvel

enter image description here

enter image description here

Marvel是一个监控ES的工具。

安装Sense

Sense是一个简便的ES命令查询工具

elasticsearch —— ik

一、 ik是什么?

IK中文分词器在Elasticsearch上的使用。原生IK中文分词是从文件系统中读取词典,es-ik本身可扩展成从不同的源读取词典。

二、安装

1、 maven

安装ik前首先要安装mavenmaven是一个项目管理工具,它包含了一个项目对象模型,一组标准集合,一个项目生命周期,一个依赖管理系统,和用来运行定义在生命周期阶段中插件目标的逻辑。这里主要使用它的依赖关系管理。

1、 下载
下载链接: http://maven.apache.org/download.cgi

2、 解压缩

并且移动到相应目录

3、 配置相关环境

使其生效

4、 查看版本

5、 更换镜像

默认使用官方的镜像,由于GFW的问题会不稳定,我们可以使用OSCMaven镜像。

详情参考: http://maven.oschina.net/help.html

2、ik

1、下载

更具官网提示,根据不同的ES版本选在不同的版本下载。
Github链接: https://github.com/medcl/elasticsearch-analysis-ik

2、 编译安装

进入目录,执行命令

命令完成后,就是已经编译完成。

将编译完成的软件复制到ES目录下,并且解压

完成。

3、 测试

重启ES,我们可以使用官网上的案例来进行测试。

1、 建立索引

2、 创建mapping

3、 录入数据

4、 验证

elasticsearch (三) 索引管理

创建索引

之前我们简单的通过添加一个文档的方式创建了一个索引。这个索引使用默认设置,新的属性通过动态映射添加到分类中。现在我们需要手动创建索引,在请求中加入所有设置和类型映射。

事实上,你可以通过在 config/elasticsearch.yml 中添加下面的配置来防止自动创建索引。

以下为创建索引的格式:


索引设置

提示: Elasticsearch 提供了优化好的默认配置。除非你明白这些配置的行为和为什么要这么做,请不要修改这些配置。

下面是两个最重要的设置:

number_of_shards
定义一个索引的主分片个数,默认值是 5。这个配置在索引创建后不能修改。

number_of_replicas
每个主分片的复制分片个数,默认是 1。这个配置可以随时在活跃的索引上修改。

例如,我们可以创建只有一个主分片,没有复制分片的小索引。

然后,我们可以用 update-index-settings API 动态修改复制分片个数:


配置分析器

analysis是用来配置已存在的分析器或创建自定义分析器来定制化你的索引。

standard 分析器是用于全文字段的默认分析器,对于大部分西方语系来说是一个不错的选择。它考虑了以下几点:

  • standard 分词器,在词层级上分割输入的文本。
  • standard 表征过滤器,被设计用来整理分词器触发的所有表征(但是目前什么都没做)。
  • lowercase 表征过滤器,将所有表征转换为小写。
  • stop 表征过滤器,删除所有可能会造成搜索歧义的停用词,如 atheandis

默认情况下,停用词过滤器是被禁用的。如需启用它,你可以通过创建一个基于 standard 分析器的自定义分析器,并且设置 stopwords 参数。可以提供一个停用词列表,或者使用一个特定语言的预定停用词列表。

在下面的例子中,我们创建了一个新的分析器,叫做 es_std,并使用预定义的西语停用词:

es_std 分析器不是全局的,它仅仅存在于我们定义的 spanish_docs 索引中。为了用 analyze API 来测试它,我们需要使用特定的索引名。

以下是返回结果,停用词 El 被正确的删除了


自定义分析器

虽然 Elasticsearch 内置了一系列的分析器,但是真正的强大之处在于定制你自己的分析器。你可以通过在配置文件中组合字符过滤器,分词器和表征过滤器,来满足特定数据的需求。

字符过滤器

字符过滤器是让字符串在被分词前变得更加“整洁”。例如,如果我们的文本是 HTML 格式,它可能会包含一些我们不想被索引的 HTML 标签,诸如 <p> 或 <div>。

我们可以使用 html_strip 字符过滤器 来删除所有的 HTML 标签,并且将 HTML 实体转换成对应的 Unicode 字符,比如将 & Aacute ; 转成 Á。

一个分析器可能包含零到多个字符过滤器。

elasticsearch (二) 入门

让我们建立一个员工目录


创建数据

假设我们刚好在Megacorp工作,这时人力资源部门出于某种目的需要让我们创建一个员工目录,这个目录用于促进人文关怀和用于实时协同工作,所以它有以下不同的需求:

  • 数据能够包含多个值的标签、数字和纯文本。
  • 检索任何员工的所有信息。
  • 支持结构化搜索,例如查找30岁以上的员工。
  • 支持简单的全文搜索和更复杂的短语(phrase)搜索
  • 高亮搜索结果中的关键字
  • 能够利用图表管理分析这些数据

首先创建一个员工

系统返回结果

这个文档是employee类型,属于megacorp索引。如果说之前elasticsearch中没有employee类型或者megacorp索引的话,系统会自动创建。 并且上面插入数据的时候指定了_id为1,所以插入数据后,这个文档的_id就是为1。假设不指定_id的话,系统会默认设置一个_id。如下,

PS: 上面两次操作中,一次使用了PUT,一次使用了POST,区别就是PUT是修改,必须制定_id,如果elasticsearch中不存在的话会进行插入操作,类似mysql中的replace intoPOST的话就是正常的插入操作。

当我们插入一条数据的时候,系统返回中有_index_type_id_version前三个上文已说过,接下来说下_version

Elasticsearch中每个文档都有版本号,每当文档变化(包括删除)都会使_version增加。在《版本控制》章节中我们将探讨如何使用_version号确保你程序的一部分不会覆盖掉另一部分所做的更改。


检索文档

输入命令

返回结果

命令中主要逻辑为_index/_type/_id进行查找,参数pretty的作用是美化输出结果。

返回结果中,found的记过为boolean,表示是否成功。_source表示我们所查的具体文档。

如果是查询不到内容的话_found字段的值为false,如下

我们也可以指定返回文档中的一部分

当然也可以只返回_source


创建一个新文档

请记住_index_type_id三者唯一确定一个文档。所以要想保证文档是新加入的,最简单的方式是使用POST方法让Elasticsearch自动生成唯一_id

然而,如果想使用自定义的_id,我们必须告诉Elasticsearch应该在_index_type_id三者都不同时才接受请求。为了做到这点有两种方法,它们其实做的是同一件事情。你可以选择适合自己的方式:

第一种方法使用op_type查询参数:

或者第二种方法是在URL后加/_create做为端点:

如果包含相同的_index_type_id的文档已经存在,Elasticsearch将返回409 Conflict响应状态码,错误信息类似如下:


更新整个文档

系统返回的数据中_version进行了自增。created等于false表示这次操作不是创建。

其实文档在Elasticsearch中是不可变的——我们不能修改他们。在内部,Elasticsearch已经标记旧文档为删除并添加了一个完整的新文档。旧版本文档不会立即消失,但你也不能去访问它。Elasticsearch会在你继续索引更多数据时清理被删除的文档。


文档局部更新

其实局部更新与整体更新一样。Elasticsearch内部都是这个过程如下:

  1. 从旧文档中检索JSON
  2. 修改它
  3. 删除旧文档
  4. 索引新文档

删除文档

删除文档的语法模式与之前基本一致,只不过要使用DELETE方法:

elasticsearch (一) 初识

一、 elasticsearch是什么

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
—— 引用自百度百科

简而概之就是一个非常牛逼的搜索引擎。

二、相关概念

  1. 集群(cluster) & 节点(node)
    一个集群是有一个或多个节点组成,节点是集群中的一个服务器。节点会存储数据,参与集群的索引和搜索。默认情况下,节点会获取一个随机的名字来作为标识。与节点类似,集群也会默认获取一个名字,一般情况下这个名字为elasticsearch

  2. 索引(index) & 类型(type) & 文档(document) & 字段(field)

和关系型数据库类似,elasticsearch中也有类似库表行字段的含义。大致关系如下:

解释:

Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。

三、安装

  1. 安装elasticsearch

官网下载最新版。

下载之后解压即可。无需安装使用方便。

  1. 安装Marvel

MarvelElasticsearch的管理和监控工具,在开发环境下免费使用。它包含了一个叫做Sense的交互式控制台,使用户方便的通过浏览器直接与Elasticsearch进行交互。

Marvel是一个插件,可在Elasticsearch目录中运行以下命令来下载和安装:

你可能想要禁用监控,你可以通过以下命令关闭Marvel:

四、运行

Elasticsearch已经准备就绪,执行以下命令可在前台启动:

如果想在后台以守护进程模式运行,添加-d参数。

打开另一个终端进行测试:

你能看到以下返回信息:

这说明你的ELasticsearch集群已经启动并且正常运行,接下来我们可以开始各种实验了。