Elasticsearch是一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎( Lucene 可以说是当今最先进,最高效的全功能开源搜索引擎框架)。
Elasticsearch是一个实时分布式和开源的全文搜索和分析引擎, 它可以从RESTful Web服务接口访问,并使用 JSON(JavaScript Object Notation,JavaScript对象标志法)文档来存储数据。它基于Java编程语言,这使Elasticsearch能够在不同的平台上运行,使用户能够以非常快的速度来搜索非常大的数据量。
1 Elasticsearch的特性及相关概念
1.1 Elasticsearch的特性
Elasticsearch可扩展高达PB级的结构化和非结构化数据
Elasticsearch可以用来替代MongoDB和RavenDB等做文档存储
Elasticsearch使用非标准化来提高搜索性能
Elasticsearch源代码开放
1.2 相关概念
节点 - 它指的是ElasticSearch的单个正在运行的实例。单个物理和虚拟服务器容纳多个节点,这取决于其物理资源的能力,如RAM,存储和处理能力。
集群 - 它是一个或多个节点的集合。 集群为整个数据提供跨所有节点的集合索引和搜索功能。
索引 - 它是不同类型的文档和文档属性的集合。索引还使用分片的概念来提高性能。 例如,一组文档包含社交网络应用的数据。
类型/映射 - 它是共享同一索引中存在的一组公共字段的文档的集合。 例如,索引包含社交网络应用的数据,然后它可以存在用于用户简单数据的特定类型,另一类型可用于消息的数据,以及另一类型可用于评论的数据。
文档 - 它是以JSON格式定义的特定方式的字段集合。每个文档都属于一个类型并驻留在索引中。每个文档都与唯一标识符(称为UID)相关联。
分片 - 索引被水平细分为分片。这意味着每个分片包含文档的所有属性,但包含的数量比索引少。水平分隔使分片成为一个独立的节点,可以存储在任何节点中。主分片是索引的原始水平部分,然后这些主分片被复制到副本分片中。
副本 - Elasticsearch允许用户创建其索引和分片的副本。 副本不仅有助于在故障情况下增加数据的可用性,而且还可以通过在这些副本中执行并行搜索操作来提高搜索的性能。
1.3 优点和不足
1、优点
Elasticsearch是基于Java开发的,因此平台兼容性很强。
Elasticsearch是准实时的,换句话说,一秒钟后(默认),添加的文档可以在这个引擎中搜索得到
Elasticsearch是分布式的,这使得它易于在任何大型组织中扩展和集成
通过使用Elasticsearch中的网关概念,创建完整备份很容易
与Apache Solr相比,在Elasticsearch中处理多租户非常容易
Elasticsearch使用JSON对象作为响应,这使得可以使用不同的编程语言调用Elasticsearch服务器
Elasticsearch支持几乎大部分文档类型,但不支持文本呈现的文档类型
2、不足
Elasticsearch在处理请求和响应数据方面没有多语言和数据格式支持(仅在JSON中可用),与Apache Solr不同,Elasticsearch不可以使用CSV,XML等格式
Elasticsearch也有一些棘手的问题发生,虽然在极少数情况下才会发生。
2 安装及环境配置
本机安装的是elasticsearch-5.2.0 版本(Windows),并安装了 Sense 插件
下载链接: elasticsearch-5.2.0
启动 elasticsearch.bat 报“encountered environment variables that are no longer supported” 错误:
环境变量都设置没问题,实在没找到有效的解决方法,直接将启动文件里面的 bad_env_var 变量校验去掉,可以解决该问题:
启动后,在浏览器访问 http://localhost:9200/ 或使用 Sense 访问,返回如下结果:
{
"name" : "uKpwu-H",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "fiMmhaEPQsWdlg-S8Dfxyg",
"version" : {
"number" : "5.2.0",
"build_hash" : "24e05b9",
"build_date" : "2017-01-24T19:52:35.800Z",
"build_snapshot" : false,
"lucene_version" : "6.4.0"
},
"tagline" : "You Know, for Search"
}
3 简单使用-文档管理(CRUD)
3.1 创建索引
索引对应于 CRUD 中的 C 和 U,如果具有相同类型和ID的文档已存在,则会进行覆盖。
创建索引的URL格式为:
http://localhost:9200/<index>/<type>/[<id>]
其中,index 和 type 是必须的,id 可选,如果没有指定 id,ElasticSearch 会默认生成一个 id。但是,如果不指定 id,应该使用 http 的 POST 而不是 PUT 请求。
现以一个电影对象信息来创建索引:
{
"title": "The Godfather",
"director": "Francis Ford Coppola",
"year": 1972
}
以 movies 为索引名,类型为 movie, id 为 1,curl 的请求方式如下:
curl -XPUT "http://localhost:9200/movies/movie/1" -d'
{
"title": "The Godfather",
"director": "Francis Ford Coppola",
"year": 1972
}'
可以使用 curl(参考window下使用curl操作elasticsearch),也可以使用Sense 来执行:
响应对象包含创建索引的相关信息,如index、type、文档 id, 版本,分片等信息
查询索引
curl localhost:9200/_cat/indices?v
或 Sense 请求
GET /_cat/indices?v
3.2 更新索引
更新索引只需使用相同的 id 索引。使用与创建索引完全相同的请求,但修改了 JSON 对象:
curl -XPUT "http://localhost:9200/movies/movie/1" -d'
{
"title": "The Godfather",
"director": "Francis Ford Coppola",
"year": 1972,
"genres": ["Crime", "Drama"]
}'
此时 _version 变为 2,result 为 “updated”, _id 还是为 1。
注: _version 可用于跟踪文档已编入索引的次数。其主要目的是允许乐观的并发控制,因为可以在索引请求中提供一个版本,如果提供的版本高于索引中的版本,ElasticSearch将只覆盖文档内容,ID值不变,版本号自动添加。
3.3 由ID获取文档/索引
通过ID从ElasticSearch中检索文档可发出GET请求:
http://localhost:9200/<index>/<type>/<id>
如:
curl -XGET "http://localhost:9200/movies/movie/1" -d''
sense 下为: GET /movies /movie/1
3.4 删除文档
删除的请求格式如下:
curl -XDELETE "http://localhost:9200/<index>/<type>/[<id>]" -d''
删除示例:
curl -XDELETE “http://localhost:9200/movies/movie/1” -d”
响应信息中包含一个 “_found” 属性,表示指定的文档已找到并且操作成功。