【入门】以粗略的方式解析Elasticsearch #1 – 概述篇

由于参与了项目涉及Elasticsearch的工作,我决定将学习的内容整理成备忘录。
在不断试错的过程中学习,可能有些地方理解错误,如果您能指出,我将不胜感激。

Elasticsearch是什么?

首先是从这里开始的。
虽然听说过并且包含了”search”一词,所以应该是用于搜索的工具,但是它能做些什么呢。。。
于是我进行了一些调查,发现Elasticsearch似乎是一个全文搜索引擎。

全文搜索是指通过关键词等方式在整个文本中进行搜索。

全文搜索是指从多个文件中搜索特定字符串的过程,有grep型和索引型两种类型。

我觉得很多人对grep类型都很熟悉,是的,Linux的grep命令就是代表例。
grep类型通过逐个扫描多个文本文件来查找目标字符串。
然而,由于需要逐个扫描文件,随着搜索目标的增加,搜索速度会逐渐降低。

在这种情况下,出现的是索引类型,Elasticsearch也属于这种索引类型。
索引类型会事先扫描要检索的文档集合,准备倒排索引数据,
通过访问该数据来实现快速搜索。

転置索引即为一种索引结构。

转置索引是指表示某个字符串在作为搜索目标的文档组中的哪个位置存在的索引结构。
可以将字典索引作为一个易于理解的例子。
字典索引上列有每个单词所在的页码,我们可以查找目标单词在哪一页上,而无需逐页查看厚厚的页码。这就是在书籍中的转置索引。

因为仅仅通过词典的例子很难具体地理解,所以我将展示实际在Elasticsearch中创建的索引的图像。

假设有一个使用Elasticsearch的SNS应用,用户可以在此应用中发布两篇文档Doc1和Doc2。

文档1:“今天的足球比赛是日本对巴西,一定要看。”

文档2:“今年的巴西代表踢得很有趣,我觉得。”

当将它们保存在 Elasticsearch 中时,将根据字符分割规则(为简化说明而省略的重要细节)创建以下索引。

"今日": Doc1
"サッカー": Doc1, Doc2
"試合": Doc1
"日本": Doc1
"ブラジル": Doc1, Doc2
"絶対": Doc1
"見る": Doc1
"今年": Doc2
"代表": Doc2
"面白い": Doc2
"思う": Doc2
※実際は文字列が文書中のどの位置にあるかなどの情報も格納されます。

通过这个倒排索引,当我们在SNS应用中搜索”巴西”时,将会命中Doc1和Doc2;
而搜索”日本”时,只有Doc1会被命中。

Elasticsearch的应用

我从官方网站引用了Elasticsearch是一个使用倒排索引的搜索引擎的简单描述,以具体说明它在什么样的应用中被使用。

    • アプリ検索

 

    • Webサイト検索

 

    • エンタープライズサーチ

 

    • ロギングとログ分析

 

    • インフラメトリックとコンテナー監視

 

    • アプリケーションパフォーマンス監視(APM)

 

    • 地理空間データ分析と可視化

 

    • セキュリティ分析

 

    ビジネス分析

在我参与的项目中,我们将其作为应用程序搜索来利用。你可以将其想象成类似Twitter的服务,可以用来搜索其他人的帖子。此外,我们还经常在网络上看到与Logstash和Kibana结合使用来构建日志分析基础设施的使用示例。尽管有许多用途,但主要适用于快速搜索大量数据的情况。

首先试试触摸一下

无论如何,实际触摸是最好的理解方法。
设置使用Docker。按照官方参考手册的说明,拉取Docker镜像后,请使用单节点设置Elasticsearch。如果只是验证基本操作,这就足够了。
然后,我们将启动Kibana可视化工具的Docker。
一旦可以通过浏览器访问Kibana,准备工作就完成了。

登录 Kibana 后,首先打开 Dev Tools。
Dev Tools 位于控制台左上角的汉堡菜单→管理部分中。

那么,作为基本操作,我们需要创建和搜索数据。

スクリーンショット 2023-03-04 20.45.49.png
POST sample/_doc
{
  "user_name": "tanaka_taro123",
  "user_id": 1,
  "crated_at": "2023-03-01T10:04:40.241",
  "tweet": "今日観たスラムダンクの映画は今までに観たどの映画よりも感動したなぁ",
  "likes": [
    {
      "likedBy": 2,
      "likedAt": "2023-03-04T12:03:10.109"
    },
    {
      "likedBy": 3,
      "likedAt": "2023-03-04T12:06:15.111"
    }
  ]
}

只要在Dev Tools的右侧显示出下面这样的执行结果,处理就成功了。

{
  "_index": "sample",
  "_id": "2bHPrIYBMaUGLwUHbxju",
  "_version": 1,
  "result": "created",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 1,
  "_primary_term": 1
}

现在的操作已经成功将数据一次性注册到Elasticsearch中。
现在,我们将简单解释刚刚进行的内容。

首先,显眼的是第一行的 “POST sample/_doc”。
Elasticsearch是一个RESTful引擎,需要指定HTTP方法和请求URI,并根据需要使用JSON传递数据。
在这里,我们使用POST方法请求在sample索引中创建一个名为”文档”的数据。

文件可以看作关系数据库中的记录。
文件能够存储字符串、数字、布尔值和日期等项目,还可以存储数组和对象。

接下来是关于”样本索引”的内容。
这里所说的索引不是指前面提到的倒排索引本身…而是指文档集合。可以将其想象成RDB中的表格,这样更容易理解。
顺便说一下,倒排索引是针对每个文档的字符串字段(除了一些特殊类型)创建的。
索引可以进行字段定义和其他各种设置。
顺便说一下,对于RDB来说,需要先创建表格然后再进行插入操作,而Elasticsearch会在创建文档时自动创建索引和字段定义(除了字段定义,通常还会有其他设置需求,所以大部分情况下都会事先定义好)。

接下来,将对刚刚创建的数据进行搜索。
请将以下内容复制到 Dev Tools 中并执行。
使用 GET 方法将搜索查询发送到 sample 索引。

GET sample/_search
{
  "query": {
    "match": {
      "tweet": {
        "query": "スラムダンクは面白い"
      }
    }
  }
}

尽管并不完全一致,但刚才创建的文件却能找到。

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.5753642,
    "hits": [
      {
        "_index": "sample",
        "_id": "2LHCrIYBMaUGLwUHnxhP",
        "_score": 0.5753642,
        "_source": {
          "user_name": "tanaka_taro123",
          "user_id": 1,
          "crated_at": "2023-03-01T10:04:40.241",
          "tweet": "今日観たスラムダンクの映画は今までに観たどの映画よりも感動したなぁ",
          "likes": [
            {
              "likedBy": 2,
              "likedAt": "2023-03-04T12:03:10.109"
            },
            {
              "likedBy": 3,
              "likedAt": "2023-03-04T12:06:15.111"
            }
          ]
        }
      }
    ]
  }
}

在搜索查询中有各种不同类型的查询,这里使用了称为match查询的查询。
使用match查询,我们对搜索关键词进行词法分析后进行搜索。
我们将确认在实际搜索之前进行了哪些分析。

在Elasticsearch中,我们使用一个叫做Analyzer的功能来处理需要进行词法分析的场景。
您可以通过以下请求指定Analyzer,并模拟解析搜索词。
当前尚未对Analyzer进行特别设置,默认为标准分析器(standard analyzer),我们将使用它进行指定。

POST sample/_analyze
{
  "analyzer": "standard",
  "text": "スラムダンクは面白い"
}

我收到了以下结果。

{
  "tokens": [
    {
      "token": "スラムダンク",
      "start_offset": 0,
      "end_offset": 6,
      "type": "<KATAKANA>",
      "position": 0
    },
    {
      "token": "は",
      "start_offset": 6,
      "end_offset": 7,
      "type": "<HIRAGANA>",
      "position": 1
    },
    {
      "token": "面",
      "start_offset": 7,
      "end_offset": 8,
      "type": "<IDEOGRAPHIC>",
      "position": 2
    },
    {
      "token": "白",
      "start_offset": 8,
      "end_offset": 9,
      "type": "<IDEOGRAPHIC>",
      "position": 3
    },
    {
      "token": "い",
      "start_offset": 9,
      "end_offset": 10,
      "type": "<HIRAGANA>",
      "position": 4
    }
  ]
}

通过观察我们可以知道,标准分析器成功地从专有名词“Slam Dunk”中提取并创建了倒排索引。
因为在文档创建时,对于推文项目的值也是通过标准分析器创建了倒排索引,所以我们可以说通过“Slam Dunk”这个关键词进行搜索时能够命中。

除此之外,还有多种搜索查询可以选择,例如完全匹配搜索、使用AND和OR组合多个查询,还可以使用类似于Java的painless脚本来定义搜索条件等等。由于存在这么多不同的搜索查询选项,我们打算将它们一并整理起来。

我希望通过下面的总结,让大家对Elasticsearch有一个大致的了解。以后的篇章中,我会一一对更详细的功能进行重点讲解。

補充:關於OpenSearch

当你在搜索有关Elasticsearch的信息时,也许会看到一个叫做OpenSearch的全文搜索引擎。
OpenSearch是Elasticsearch的兄弟项目,也是一个全文搜索引擎。
Elasticsearch最初是一个开源项目,在AWS也提供了Elasticsearch的全托管服务,但在2021年2月的许可更新后,Elasticsearch不再是开源软件。
简单来说,开发Elasticsearch的Elastic公司对于利用该OSS项目赚钱的亚马逊并不满意。
因此,亚马逊对Elasticsearch进行了分叉,并将其作为一项开源软件进行开发,同时将服务名称更改为Amazon OpenSearch Service。
基于这样的背景,Elasticsearch和OpenSearch在功能上有很多相似之处,
所以OpenSearch用户可以参考Elasticsearch的文档(由于历史悠久,Elasticsearch的文档更加全面)。

参考網站

    • https://www.elastic.co/guide/en/elasticsearch/reference/current/elasticsearch-intro.html

 

    • https://hub.docker.com/_/elasticsearch

 

    https://gihyo.jp/dev/serial/01/search-engine/0003
广告
将在 10 秒后关闭
bannerAds