在构建全文搜索服务时,应首先查看的链接集合是 Elasticsearch 相关的

結論 –

当学习Elasticsearch时,首先要阅读官方最新版本的文档。

我做了一件蠢事

    • 業務利用(全文検索サービス作成)でElasticsearchを使う機会があり、Elasticsearchのキャッチアップが必要になった

 

    • とりあえず「Elasticsearch 入門」でググると、「この記事は1年前に作られました」の文字が気になりつつも良さげな実用サンプル付きの日本語記事が複数ヒット

 

    • 最低限の構成でクエリ検索できるところまでならスムーズに行けるだろうと思いながら記事の通りに手を動かしてみると、思いの外いろいろなところでハマってしまった

Dockerイメージが立ち上がらない、インデックスが作れない、日本語検索のスコアがおかしい(日本語の構文解析ができていない)、etc…

沉迷其中的原因

    • Elasticsearchメジャーバージョン間では仕様が大きく異なる箇所が幾つかある

例えばElasticsearch5系→6系に上がる際はインデックス内複数タイプの使用が不可能になったため、それより前(~2017年8月)に書かれた記事通りに動かすとエラーになるケースがある
さらに直近の6系→7系アップデートでは更にタイプ自体が廃止(※7系は受け入れAPIのみ。全体廃止は8系予定とのこと)の方針となったため、インデックス作成時のマッピング定義でタイプフィールドが含まれるものはもれなくエラーとなってしまう

「Elasticsearch 入門」などで上位にヒットする日本語記事の幾つかは前バージョンのものを前提にしていることに加え、Elasticsearch自体も頻繁にメジャーバージョンアップデートを行っておりかつ仕様変更も多い

このような背景から、「とりあえず日本語の入門記事から取り掛かろう!」とする人たちはハマりやすいのでは?と思いました(私はハマりました…)

這篇文章的目的是什麼?

    • そもそもハマらないようにするにはまず最初に公式ドキュメントを読むべき

とはいえ公式ドキュメントは全編英語(少なくともCurrentバージョンは)かつ分量が多く(チャプターだけでも29あり、全セクションだと1,000ほどあります)すべてを読み通してから手を付けるのはかなり大変
そこで、自分がハマったあとに改めて参照した公式ドキュメント内ページをピックアップし、「やりたいこととそれが載っているページ(+ハマった経験を基にしたコメント)の一覧」を作ってみました
公式ドキュメントの読み進め方の1つとして、これからキャッチアップする人が少しでも参考になれば幸いです

请留意以下事项。

    • この記事自体も2019年12月現在のバージョン7.5に依存して書かれているため、仕様変更等で将来的に遷移先URLがリンク切れになっている場合や、解決しない場合が起こりうるかもしれません

Elasticsearch Referenceから各ページをそれぞれ参照していくのが確実

公式文件的基本使用方法

弹性堆栈与产品文档

    • Elastic社の提供する諸製品(Elasticsearch, Kibana, Beats, Logstash)が網羅されているページ

 

    分量がとてつもなく多いので、とりあえずElasticsearchを使いたい場合は後回しで見たほうがいいかも

Elasticsearch 参考指南

可以通过Elasticsearch参考文献[<当前版本>]从上述的弹性堆栈和产品文档-> Elasticsearch:存储,搜索和分析中进行访问。

Install_Elasticsearch_with_Docker___Elasticsearch_Reference__7_5____Elastic.png

只需提供一个选项,以下为中文翻译:

不论你想做什么,最好先查看官方文档内的页面列表。

安裝教程

编写docker-compose.yml文件,以最简配置启动。

使用Docker安装Elasticsearch | Elasticsearch参考文档

    • 最小構成の場合は「Starting a single node cluster with Docker」に従う

同ページ中程にいい感じのdocker-compose.ymlがありますが、そちらはmulti-node cluster(複数ノード構成)なのでキャッチアップとしては少し複雑になってしまう
以下のように「Starting a single node cluster with Docker」記載のdocker runコマンドをdocker-compose.yml向けに書き換えるのが良さそう

version: '2'
services:
  elasticesarch:
    build: docker/elasticsearch # 後述のDockerfileを参照
    container_name: elasticsearch
    restart: always
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      - "discovery.type=single-node"

然而,请按照文件中所述,单节点(仅由一个节点构成)应仅用于测试或开发环境。为了安全起见。

安装指南

使得能够用日语进行搜索。

日本語(くろもじ)分析プラグイン | Elasticsearch リファレンス

在Elasticsearch插件和集成中,可以通过Analysis Plugins来参考日语(kuromoji)分析插件。

    • Elasticsearchはデフォルトで日本語解析プラグインが未インストールのため、日本語解析・および検索をするためには上記ドキュメント記載のインストール手順を別途実行する必要あり

 

    • Dockerの場合はDockerfileに以下のように書いておくと、立ち上げ時にインストール済み状態になってくれます

<タグ名>は前項のInstall Elasticsearch with Dockerからアクセス可能なdocker.elastic.coの一覧から選択

FROM docker.elastic.co/elasticsearch/elasticsearch:<タグ名>
RUN elasticsearch-plugin install analysis-kuromoji
    因みにAWSで提供されているマネージド型ElasticsearchServiceを使う場合は、予めkuromoji-analyzerがインストールされているためこの作業は不要です(参照: AWS公式ドキュメント: サポートされるプラグイン一覧)

创建一个可以解析日语的索引。

分析器 | Elasticsearch 参考文档

    • Elasticsearchは動的マッピング機能があるため、そもそもインデックスを作る際のマッピング定義の指定は必須ではない

 

    • しかしデフォルトの定義ではAnalyzer(構文解析)が日本語に適していないため、そのまま日本語ドキュメントを投入すると投入時点で日本語文字が1文字ずつ細切れで格納されてしまい正しい検索スコアが出せない

とりあえず最低限の日本語解析がやりたい場合は、マッピング定義内のproperties内オブジェクトごとにAnalyzerの指定をすればOK

フィルター等を組み合わせることでより高度な構文解析ができたり、properties内オブジェクトごとにAnalyzeの有効/無効を切り替えてパフォーマンスチューニングしたりできますが今回は割愛…
公式ドキュメントにはすぐに使える日本語解析用のいい感じのサンプルがないため、このあたりはElasticsearchのバージョン違いによる仕様変更に注意(↓のJSON内コメント参照)しつつ「elasticsearch kuromoji mapping」等でググりつつ日本語記事を探すのが良いかなと思います

curl -X PUT http://localhost:9200/hoge-index -H 'Content-Type: application/json' -d @mapping.json
{
  "mappings": { // 6系以前は直下の行にtypeフィールドがあったが7系以降は廃止された
    "properties": {
      "article": { 
        "type":     "text", // <- 6系以降は"string"を使うとエラーになる
        "analyzer": "kuromoji" // <- 日本語構文解析用のAnalyzerを指定
      }
    }
  }
}

执行完之后,最好确认一下是否成功生成了。

$ curl localhost:9200/hoge-index?pretty
{
  "hoge-index" : {
    "aliases" : { },
    "mappings" : {
      "properties" : {
        "article" : {
          "type" : "text",
          "analyzer" : "kuromoji"
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "xxx",
        "number_of_shards" : "1",
        "number_of_replicas" : "1",
        "uuid" : "xxx",
        "version" : {
          "created" : "xxx"
        },
        "provided_name" : "hoge-index"
      }
    }
  }
}

批量插入文件

批量 API | Elasticsearch 参考资料

PUTで1レコードずつ挿入もできるが、上記内ページ記載の通りバルクインサートのほうがパフォーマンスが良くなるらしい

スクリプト書くにしてもBulk API使ったほうが勝手が良いかと

バージョン違いによる仕様変更はあまり無いので、実用的なサンプルとして旧バージョンの日本語記事を参照しても大丈夫そう

7系以降で_type指定が廃止された点のみ注意

AWSのマネージド型Elasticsearchの場合は、HTTPリクエストペイロードのサイズに制限があるため、大量データのバルクインサート用スクリプトを作る際は分割しながら送るようにする必要があることに注意

搜索编辑

查询 DSL | Elasticsearch 参考文档

    • インストールとセットアップの山さえ乗り越えてしまえば、検索クエリのキャッチアップはそこまで大変ではないと思うのでさっくりとリンクのみ紹介

インストールとセットアップはエラーの度にインデックス削除&再生成が必要だが、検索クエリは再度投げるだけなのでトライ&エラーのテンポが速くなる

基本的には上記のQuery DSLの必要そうな記事を読み進めればOK

以下、やりたいこととマッチしそうな記事をピックアップしました

在进行关键字搜索时进行完全匹配

术语查询 | Elasticsearch 参考文档

搜索时包括日语拼写变体(全文搜索)。

对照查询 | Elasticsearch参考

从多个字段和搜索条件进行搜索

布尔查询 | Elasticsearch 参考文档

提供可以进行OR搜索和AND搜索的选项。

查询字符串查询 | Elasticsearch 参考文档
简单查询字符串查询 | Elasticsearch 参考文档

    • OR検索やAND検索のみであればSinmple query string queryでOK

 

    • 外部公開する場合などはSimple query string queryを使い、かつ機能制限をかけたほうが安全

Query string queryは複雑なクエリを簡単に投げられるので、サーバリソース消費の攻撃を受けるリスクが高い

在搜索结果中包含摘要和高亮显示

请问能否将请求体中的搜索结果进行高亮显示?谢谢。

elasticsearch_-_Google_検索.png

最后

如果简单阅读上述列举的文章,我认为可以至少掌握制作可运行的东西。作为进一步提升的目标,可以决定诸如“提高搜索精确度”和“提升性能”等事项。

    • まずは現行バージョンの公式ドキュメントを読みながら

 

    必要に応じて日本語検索用の実装サンプルを(記事を書いた人の想定バージョンに注意しながら)ググっていく

我认为用风格进行推进可能是个不错的选择。

bannerAds