スクリーンショット_2019-04-28_14

Elasticsearchで簡単に検索できるまでたどり着く方法

精度はおいておいて検索できるようにしよう

まずES公式ページからzipでダウンロードします。Dockerのイメージでとってきたりもできますが、初心者むけなのでシンプルにいきます(※ver7.0を前提に以下を解説していきます)。

色々ありますが「とりあえず検索できる」ようになるだけならKibanaとElasticsearchだけあれば大丈夫です。検索するだけなら本当はElasticsearchだけでもいいのですが、ESだけだと本当に検索機能だけです。jsonでデータを投入して、検索もjsonで投げる必要があります。ESのデータ投入とクエリって結構初心者にはとっつきにくいと思うのでGUIで入門するためにここでちょっと手間をかけてkibanaも導入しましょう。ファイルを解凍したのち、

/bin/kibana

/bin/elasticsearch

をそれぞれ実行し、

 http://localhost:5601/app/kibana#/home?_g=()

にアクセスします。

次にElasticsearch Machine Learningを選択します。Elasticsearch MLの新しい機能を利用することでデータのインポートがGUIでとても簡単に実行することができます。これはKibana 6.5から導入された機能です。ESをサクッと試したいという人にはかなり便利な機能だと思います。

Uploadfileを利用して手持ちのcsvなりjsonなりを読み込ませましょう。

記事であればbodyなどはtext型に設定しておくと良いです(挙動をしっかり調べてないですが多分自動で適当な型をつけてくれると思います).Advanced tabを選択することで設定の変更も可能です。また後半に述べるようにreindexと呼ばれるトリックを用いることで後からindexの設定を「変更」することもできます。

自動で設定されたschema定義を編集することができる

完了すればあとはdiscover タブで検索バーから検索できるようになります。

検索結果が気に入らなければindexを変更する

discoverで検索してもヒットしない・ヒット結果がおかしいといったケースが発生したときは、schema定義を変更しましょう。例えばMLの設定したデフォルトのanalyzerだとテキスト型の日本語の検索に不満があるかもしれません。そこでkuromoji_tokenizerをトークナイザと設定したanalyzerを利用したいケースを以下で解説します。

kuromojiを導入するにはanalysis pluginとよばれるプラグインを導入する必要があります。プラグインの導入はESが提供するmanagement toolで可能です。binフォルダ以下にあるelasticsearch-pluginを実行してkuromoji_tokenizerをインストールすることができます。

$ sh bin/elasticsearch-plugin install analysis-kuromoji

インストール後はESを再起動する必要があります(Kibanaは不要のはずです)。再起動後に

GET _nodes/plugins?pretty

をKibanaのdev toolsから実行するとanalysis-kuromojiというプラグインが導入されているのを確認することができます。

次に新しいインデックスを定義して、アナライザの定義を行います(カスタムアナライザといいます)。settings以下が前半のMLデータインポートで自動に設定されたものに追加されたanalyzerに関する設定です。settingsには他にもshard・replica数の設定が可能です。

PUT /your-new-index-name
{
    "mappings" : {
      "properties" : {
        "body" : {
          "type" : "text"
        },
        "tag" : {
          "type" : "keyword"
        },
        "title" : {
          "type" : "keyword"
        },
        "url" : {
          "type" : "keyword"
        }
      }
    },
     "settings" : {
      "index" : {
        "analysis" : {
          "analyzer" : {
            "ja-index-kuromoji" : {
              "type" : "custom",
              "tokenizer" : "kuromoji_tokenizer"
            }
          }
        }
      }
    }
}

sample of schema settings

インデックスの定義はこれで終わりましたのであとは、既存のインデックスからデータをコピーする必要があります。これをESではreindexと呼びます.

POST _reindex
{
  "source": {
    "index": "your-old-index-name"
  },
  "dest": {
    "index": "your-new-index-name"
  }
}

dev toolsでESに検索クエリを投げるだけならこれで十分ですが、Kibanaのdiscoverで検索したい場合はこれに加えて、Kibanaのindex設定が必要です。<home url>/app/kibana#/managementで設定できます。これが完了すればdiscover tabで新しいindex名を選択することでkuromojiで形態素解析された検索結果を享受できます。

-----

本格的に運用するにはbulk apiやlogstashを用いてデータをとりこみます。がとりあえず試してみたいだけなら上記の方法がお手軽かと思います。MLのData visualizerは100 MBが上限なのでそれ以上のデータを投入したいならbulk apiなどをためすしかありません。

この記事が気に入ったらサポートをしてみませんか?