モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)

Elasticsearch 日本語全文検索

モーダルを閉じる

ステッカーを選択してください

モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

公開日公開日
2015/09/22
最終更新最終更新
2018/01/27
記事区分記事区分
一般公開

目次

    アカウント プロフィール画像 (サイドバー)

    週末エンジニア

    0
    ステッカーを贈るとは?

    Elasticsearch で日本語の全文検索を行うための方法の一つは Kuromoji を利用することです。Kuromoji は Java で書かれているオープンソースの日本語形態素解析エンジンです。コマンド例をまとめます。

    黒文字」というものは茶道でよく見られますが、和菓子をお盆から懐紙へ移動したり、食べやすい大きさに切ったりするための道具です。

    プラグインインストール (または削除)

    Elasticsearch 1.7 に対応する Kuromoji は 2.7.0 です。対応バージョンは elasticsearch-analysis-kuromoji から確認できます。

    インストール

    sudo /usr/share/elasticsearch/bin/plugin install elasticsearch/elasticsearch-analysis-kuromoji/2.7.0
    sudo /usr/share/elasticsearch/bin/plugin --list
    sudo service elasticsearch restart
    

    削除

    sudo service elasticsearch stop
    sudo /usr/share/elasticsearch/bin/plugin remove analysis-kuromoji
    sudo /usr/share/elasticsearch/bin/plugin --list
    sudo service elasticsearch start
    

    手動インストール (GitHub レポジトリの消失が心配で zip をローカルダウンロードしておいた場合)

    sudo mkdir /usr/share/elasticsearch/plugins/analysis-kuromoji
    wget http://download.elasticsearch.org/elasticsearch/elasticsearch-analysis-kuromoji/elasticsearch-analysis-kuromoji-2.7.0.zip
    unzip elasticsearch-analysis-kuromoji-2.7.0.zip
    sudo mv elasticsearch-analysis-kuromoji-2.7.0.jar lucene-analyzers-kuromoji-4.10.4.jar /usr/share/elasticsearch/plugins/analysis-kuromoji/
    sudo chown -R elasticsearch: /usr/share/elasticsearch/plugins/analysis-kuromoji
    sudo /usr/share/elasticsearch/bin/plugin --list
    sudo service elasticsearch restart
    

    Analyzer の動作検証 (参考: Analyze API)

    $ curl -XGET 'localhost:9200/_analyze?analyzer=kuromoji&pretty' -d '東京スカイツリー'
    {
      "tokens" : [ {
        "token" : "東京",
        "start_offset" : 0,
        "end_offset" : 2,
        "type" : "word",
        "position" : 1
      }, {
        "token" : "スカイ",
        "start_offset" : 2,
        "end_offset" : 5,
        "type" : "word",
        "position" : 2
      }, {
        "token" : "ツリー",
        "start_offset" : 5,
        "end_offset" : 8,
        "type" : "word",
        "position" : 3
      } ]
    }
    $ curl -XGET 'localhost:9200/_analyze?analyzer=kuromoji&pretty' -d '飲み'
    {
      "tokens" : [ {
        "token" : "飲む",
        "start_offset" : 0,
        "end_offset" : 2,
        "type" : "word",
        "position" : 1
      } ]
    }
    $ curl -XGET 'localhost:9200/_analyze?analyzer=kuromoji&pretty' -d '寿司がおいしいね'
    {
      "tokens" : [ {
        "token" : "寿司",
        "start_offset" : 0,
        "end_offset" : 2,
        "type" : "word",
        "position" : 1
      }, {
        "token" : "おいしい",
        "start_offset" : 3,
        "end_offset" : 7,
        "type" : "word",
        "position" : 3
      } ]
    }
    $ curl -XGET 'localhost:9200/_analyze?analyzer=kuromoji&pretty' -d 'コピー'
    {
      "tokens" : [ {
        "token" : "コピー",
        "start_offset" : 0,
        "end_offset" : 3,
        "type" : "word",
        "position" : 1
      } ]
    }
    $ curl -XGET 'localhost:9200/_analyze?analyzer=kuromoji&pretty' -d 'サーバー'
    {
      "tokens" : [ {
        "token" : "サーバ",
        "start_offset" : 0,
        "end_offset" : 4,
        "type" : "word",
        "position" : 1
      } ]
    }
    

    Kuromoji を利用するインデックスを作成

    Analyzer は 1 つの Tokenizer と 0 個以上の TokenFilter の組み合わせです。analysis-kuromoji を導入したことで「kuromoji_tokenizerkuromoji_baseform, kuromoji_part_of_speech, cjk_width, stop, kuromoji_stemmer, lowercase」が組み合さった kuromoji という Analyzer が提供されています。新規にインデックスを作成して kuromoji を my_type タイプのドキュメントの my_field 処理時の Analyzer として利用するようにカスタムマッピングを設定します。

    新規作成 (my_field のインデックス時と検索時には kuromoji Analyzer を利用)

    $ curl -XPUT 'localhost:9200/my_index?pretty' -d '
    {
      "mappings" : {
        "my_type" : {
          "properties" : {
            "my_field" : { "type": "string", "analyzer": "kuromoji" }
          }
        }
      }
    }'
    

    マッピングがなされていることを確認

    $ curl -XGET 'localhost:9200/my_index?pretty'
    {
      "my_index" : {
        "aliases" : { },
        "mappings" : {
          "my_type" : {
            "properties" : {
              "my_field" : {
                "type" : "string",
                "analyzer" : "kuromoji"  ← 設定された
              }
            }
          }
        },
        "settings" : {
          "index" : {
            "creation_date" : "1442870058455",
            "number_of_shards" : "5",
            "number_of_replicas" : "1",
            "version" : {
              "created" : "1070299"
            },
            "uuid" : "2XhIJowWQ62yigv5PvoLxQ"
          }
        },
        "warmers" : { }
      }
    }
    

    データを投入して検索

    データ投入

    $ curl -XPUT 'localhost:9200/my_index/my_type/1?pretty' -d '
    {
      "my_field": "東京スカイツリー"
    }'
    

    検索

    $ curl -XPOST 'localhost:9200/my_index/_search?pretty' -d '
    > {
    >   "query": { "match": { "my_field": "スカイ" } }
    > }'
    {
      "took" : 11,
      "timed_out" : false,
      "_shards" : {
        "total" : 5,
        "successful" : 5,
        "failed" : 0
      },
      "hits" : {
        "total" : 1,
        "max_score" : 0.15342641,
        "hits" : [ {
          "_index" : "my_index",
          "_type" : "my_type",
          "_id" : "1",
          "_score" : 0.15342641,
          "_source":
    {
      "my_field": "東京スカイツリー"
    }
        } ]
      }
    }
    

    参考: マッピングのない場合はデフォルトの Analyzer が利用されるためヒット率が低下

    $ curl -XPUT 'localhost:9200/my_index/my_type/2?pretty' -d '
    {
      "my_field_2": "東京スカイツリー"
    }'
    $ curl -XPOST 'localhost:9200/my_index/_search?pretty' -d '
    > {
    >   "query": { "match": { "my_field_2": "スカイ" } }
    > }'
    {
      "took" : 6,
      "timed_out" : false,
      "_shards" : {
        "total" : 5,
        "successful" : 5,
        "failed" : 0
      },
      "hits" : {
        "total" : 0,
        "max_score" : null,
        "hits" : [ ]
      }
    }
    

    以下のように分解されていたため「スカイ」がヒットしませんでした。

    $ curl -XGET 'localhost:9200/_analyze?pretty' -d '東京スカイツリー'
    {
      "tokens" : [ {
        "token" : "東",
        "start_offset" : 0,
        "end_offset" : 1,
        "type" : "<IDEOGRAPHIC>",
        "position" : 1
      }, {
        "token" : "京",
        "start_offset" : 1,
        "end_offset" : 2,
        "type" : "<IDEOGRAPHIC>",
        "position" : 2
      }, {
        "token" : "スカイツリー",
        "start_offset" : 2,
        "end_offset" : 8,
        "type" : "<KATAKANA>",
        "position" : 3
      } ]
    }
    
    0
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

    週末エンジニア

    記事の執筆者にステッカーを贈る

    有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

    さらに詳しく →
    ステッカーを贈る コンセプト画像

    Feedbacks

    Feedbacks コンセプト画像

      ログインするとコメントを投稿できます。

      関連記事

      • Kibana 4.1 導入手順
        サムネイル画像-23940c6fec
        Elasticsearch を利用して情報を可視化する Kibana について簡単にまとめます。Elasticsearch は準備済みであるとします。 参考にしたページ Kibana User Guide 4.1 実行手順 Downloads | Kibana からダウンロー
        ぼうし猫ぼうし猫1/15/2018に更新
        いいねアイコン画像0
      • Elasticsearch 導入のための基礎知識
        Elasticsearch は Apache Solr と同様に内部的に Apache Lucene を利用した全文検索アプリケーションです。公式ページをもとに導入手順および基本的なコマンド例をまとめます。 参考にしたページ [Elasticsearch 1.7](https://www.elastic.co/guide/en/elastics
        したくんしたくん6/20/2021に更新
        いいねアイコン画像0