Elasticsearch的概述

Elasticsearch是什么?

Elasticsearch 是由 Elastic 公司开发的开源分布式全文搜索/分析引擎。
与关系数据库不同,它使用 json 创建查询并通过 POST 进行 RESTful 搜索。

特点

符合RESTful标准的搜索

在RDB中,我们使用SQL来搜索数据,而在ES中,我们使用RESTful接口来搜索数据。如果您之前使用过NoSQL数据库,那么可能会更容易接受。查询是以json结构的形式进行的,您可以发出结构化的查询。

根据分数搜索。

Elasticsearch不仅通过完全匹配提供搜索结果,还提供了基于相关度(得分)的搜索结果。例如,在从某个字段搜索一个词语时,除了完全匹配和部分匹配外,还可以容忍拼写错误的模糊匹配搜索,或者以出现相关的词语而不包含该词的方式进行评分。这是基于TF/IDF(词频/逆文档频率)的思想。

快速公路

虽然存在其他几种全文搜索引擎,但相较之下,它被普遍认为是极为高速的。

可扩展

Elasticsearch在集群环境中运行,并且可以适应从小型系统到大型系统的各种规模。通过数据分散和冗余,它具有很高的可用性。

无数据库

RDB需要进行数据库定义、表定义等模式定义才能插入数据,但Elasticsearch则不需要。这是因为它可以使用任意的JSON结构来注册数据,然后自动生成模式。然而,如果要进行更匹配的搜索方法,建议进行模式定义(Elasticsearch中称为映射)。

多租户

在各种服务中轻松地进行搜索和分析跨界行动是可行的。
通过使用Elasticsearch分析客户端“Kibana”,可以轻松实现数据可视化和分析。

请用例子来说明。

由于我们是一个全文搜索引擎,所以当然可以用于搜索文档。
文档搜索的例子包括:
– 博客系统中的文章搜索
– 社交网络系统中的帖子搜索

如果同时使用IT/IDF进行相关度评分,可以实现一个简单的匹配系统。
匹配的例子
– 社交网络等用户匹配
– 相关文章的设置

使用Elasticsearch

关键词

在使用Elasticsearch之前,需要理解的关键词是什么。

群集与节点

节点相当于一个服务器,而集群是由多个节点组成的整体。
当流量增加时,通过增加节点可以实现处理的分散。

索引 (suǒ

与RDB数据库相对应的概念。一个索引可以关联多个类型。

打字

关系数据库中对应的概念。

文件

每一行都是RDB中的一个概念,通过id作为主键进行管理。

碎片

创建一个索引时,会创建多个分片。
这与RAID硬盘的配置相似,默认情况下会创建5个主分片(可写入)和一个副本分片(只读)。
需要注意的是,主分片和副本分片不会被放置在同一个节点上,所以至少需要两个节点才能利用分片功能。

数据录入

只需将JSON数据发布到终端点,即可轻松注册要搜索的数据。

PUT /index/type/1
{
  "key": "value",
  "array": {
    "name": "Jhon doe",
    "age": 28
  }
}

如果在URI末尾的位置指定数字”1″,那么它将表示文档的ID。如果该ID的数据已经存在,则会进行覆盖操作;如果数据不存在,则会创建一个新的文档。
另外,如果没有指定这个数值,系统会自动分配一个ID,因此在进行新的注册操作时可以不需要指定。

搜索

例如,搜索包含指定单词的文档的查询将如下所示。

GET /index/type/_search
{
  "query": {
    "match": {
      "key": "text"
    }
  }
}

由于存在模糊搜索、加权等各种查询方式,建议参考以下链接:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html

进行地图映射

在Elasticsearch中,与模式对应的概念是映射(mapping)。由于它是无模式的,因此不必定义映射。但是,为了满足某些要求,需要定义映射。
需要定义映射的情况包括想指定数据类型或者指定字符串的分析方法。

以下是一种可能的中文表达:
指定文字串的分析方法是在想要指定形态素解析引擎的情况下,或者是想要定义只接受完全匹配记录而不需要形态素解析的情况。例如,对于诸如博客标签等等,通常更方便进行只有完全匹配的搜索,而不进行形态素解析。

只需要将以下json放置到端点上,映射也会完成。

PUT /index/type/
{
  "mappings": {
    "type": {
      "properties": {
        "name": {
          "type": "text",
          "index": "not_analyzed"
        },
        "location": {
          "type": "geo_point"
        }
      }
    }
  }
}

在Kibana上创建热图时,将位置的类型指定为geo_point可以实现。如果想要进行数据分析,最好设置适合的数据类型。

有关映射的详细规格,请参考官方文档。
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html

另外,无法在后期更改映射,若要更新映射,必须删除索引。

在实际运行中需要注意的事项。

我认为在之前的解释中,有人考虑将Elasticsearch用作关系数据库(RDB)一样使用。然而,Elasticsearch只是一个全文搜索引擎,并不是用来替代关系数据库管理系统(RDBMS)的。这是因为与(*1)中所解释的规格有关。

另外,无法在后期更改映射,并且必须删除索引才能更新映射。

如果需要更新映射,就需要删除索引,而这实际上意味着需要一次性丢弃所有数据。因此,在更新映射后能够再次进行搜索,就需要重新注册数据。
因此,必须单独保存要搜索的数据,而为此需要使用关系型数据库。

因此,在实际实现基于Elasticsearch的系统搜索时,数据需要先存储到关系型数据库(RDB),然后在数据更新时实现将数据注册到Elasticsearch的处理程序,或者需要一个用于将搜索目标数据注册到Elasticsearch的批处理服务器/程序。

关于Kibana的内容

Kibana是用于Elasticsearch的分析工具。除了使用Elasticsearch进行搜索,还可以进行数据分析和可视化。可以说,它是使用Elasticsearch所必需的工具。下面将解释其三个主要功能。

开发工具

dev_tool.png

开发工具可以进行包括数据注册、搜索和映射在内的数据操作。
在这个例子中,我们可以将Apache的访问日志解析成数据,并进行搜索。

探索

DIscover.png

这是一个专注于数据搜索的功能。
可以通过GUI界面进行数据挖掘等操作。

形象化

visualize.png

可以将数据以不同形式(如饼图、柱状图等)进行可视化的工具。
Elasticsearch既是一种强大的全文搜索引擎,同时也可以说是一种分析工具,能够直观地展示这一点。
顺便提一句,这个饼图是用于可视化访问日志中的HTTP方法和相应的状态码。

赠品

使用 Kibana 可以估计生活范围。

参考资料

以下是一篇关于Elasticsearch的综合文章,内容分别来自以下链接:
1. https://vitalify.jp/blog/2017/02/elasticsearch_matome.html
2. https://dev.classmethod.jp/server-side/elasticsearch-getting-started-06/
3. https://qiita.com/nskydiving/items/1c2dc4e0b9c98d164329#%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%82%92%E8%BF%BD%E5%8A%A0
4. https://dev.classmethod.jp/cloud/aws/amazon-elasticsearch-service-kibana6-tutorial-02/

bannerAds