Elasticsearch 2.3でKuromojiとキャッキャウフフしてみる

最近Elasticsearchそのものをあまり触っていなかったので、勘が鈍るとアレなので久しぶりに。
 
Elasticsearch2.3.1(2016年4月8日現在の最新)をダウンロードします。
Screen Shot 2016-04-08 at 13.56.33
 
unzipして解凍したディレクトリに移動します。

$ unzip elasticsearch-2.3.1.zip
Archive:  elasticsearch-2.3.1.zip
   creating: elasticsearch-2.3.1/
  inflating: elasticsearch-2.3.1/LICENSE.txt
  inflating: elasticsearch-2.3.1/NOTICE.txt
   creating: elasticsearch-2.3.1/modules/
〜略〜
$ cd elasticsearch-2.3.1

 
Japanese (kuromoji) Analysis Pluginをインストールします。
bin/pluginって叩くと、pluginsってディレクトリを作ってそこに入れてくれる感じ。
Elasticsearch 2.0からKuromojiは”Core Elasticsearch Plugins”ってヤツに入ってインストールがより簡単になりました。
その辺の話は↓こちら
https://www.elastic.co/guide/en/elasticsearch/plugins/current/installation.html

$ bin/plugin install analysis-kuromoji
-> Installing analysis-kuromoji...
Plugins directory [『ES_HOME』/plugins] does not exist. Creating...
Trying https://download.elastic.co/elasticsearch/release/org/elasticsearch/plugin/analysis-kuromoji/2.3.1/analysis-kuromoji-2.3.1.zip ...
Downloading .....................
.................................DONE
Verifying https://download.elastic.co/elasticsearch/release/org/elasticsearch/plugin/analysis-kuromoji/2.3.1/analysis-kuromoji-2.3.1.zip checksums if available ...
Downloading .DONE
Installed analysis-kuromoji into 『ES_HOME』/plugins/analysis-kuromoji

 
イロイロとオペレーションをするのに、コンソールでガツガツ書くと辛いのでSenseをインストールします。
まず、Senseを動かすためにKibanaをダウンロートします。
Elasticsearch2.0からSenseはオープンソースになってKibanaのアプリとなっています。(以前はMarvel内のコンポーネントでした。)
Screen Shot 2016-04-08 at 14.30.23
解凍後にKibanaのディレクトリに移動します。

$ tar xvf kibana-4.5.0-darwin-x64.tar.gz
x kibana-4.5.0-darwin-x64/
x kibana-4.5.0-darwin-x64/LICENSE.txt
x kibana-4.5.0-darwin-x64/README.txt
x kibana-4.5.0-darwin-x64/bin/
x kibana-4.5.0-darwin-x64/config/
〜略〜
$ cd kibana-4.5.0-darwin-x64

 
KibanaにSenseをインストールします。

$ bin/kibana plugin --install elastic/sense
Installing sense
Attempting to transfer from https://download.elastic.co/elastic/sense/sense-latest.tar.gz
Transferring 1352402 bytes....................
Transfer complete
Extracting plugin archive
Extraction complete
Optimizing and caching browser bundles...
Plugin installation complete

 
Kibanaの画面でSenseを選ぶと、
Settings_Kibana_Sense
 
馴染みのある画面が 🙂
Screen Shot 2016-04-08 at 14.39.14
 
ということで、環境は整ったので日本語でanalyzeしてみます。
Screen Shot 2016-04-08 at 15.24.06
 
次にシノニム展開。寿司と言ったらシースーとか。。

$ cat config/synonym.txt
寿司,シースー

 
ってことで、Index作ります。Kuromojiで形態素解析して↑でシノニム展開する、と。
とりあえずインデックス作って、kuromoji_tokenizer&シノニムなヤツを。

PUT test
{
    "index":{
        "analysis" : {
            "analyzer" : {
                "kuromoji" : {
                    "tokenizer" : "kuromoji_tokenizer",
                    "filter" : ["synonym"]
                }
            },
            "filter" : {
                "synonym" : {
                    "type" : "synonym",
                    "synonyms_path" : "synonym.txt"
                }
            }
        }
    }
}

_analyzeでexplainをtrueにしてやると、イイ感じに動いてそうです。
Screen Shot 2016-04-08 at 16.27.45
 
それっぽくsynonym展開も出来てそうです。

"name": "synonym",
"tokens": [
  {
    "token": "シースー",
    "start_offset": 0,
    "end_offset": 4,
    "type": "word",
    "position": 0
  },
  {
    "token": "寿司",
    "start_offset": 0,
    "end_offset": 4,
    "type": "SYNONYM",
    "position": 0
  },

 
シノニムだけでなく、形態素解析の辞書にも手を入れたくなってきました。
例えば、”きゃりーぱみゅぱみゅとシースーにいきたい”みたいな文章があってもちゃんと検索したいよね、と。
何もしないと”きゃりーぱみゅぱみゅ”は以下のようにトークナイズされます。

"tokenizer": {
  "name": "kuromoji_tokenizer",
  "tokens": [
    {
      "token": "きゃ",
      "start_offset": 0,
      "end_offset": 2,
      "type": "word",
      "position": 0
    },
    {
      "token": "り",
      "start_offset": 2,
      "end_offset": 3,
      "type": "word",
      "position": 1
    },
    {
      "token": "ー",
      "start_offset": 3,
      "end_offset": 4,
      "type": "word",
      "position": 2
    },
    {
      "token": "ぱみゅぱみゅ",
      "start_offset": 4,
      "end_offset": 10,
      "type": "word",
      "position": 3
    }
  ]
},

形態素解析の辞書に↓を加えて、

$ cat config/userdict_ja.txt
きゃりーぱみゅぱみゅ,きゃりーぱみゅぱみゅ,キャリーパミュパミュ,カスタム人名

DELETE testしてから↓を流します。変更内容としては以下2点です。
・tokenizerをkuromoji_user_dictという名前で外出しにして定義
・kuromoji_user_dictの設定の中でカスタム辞書(userdict_ja.txt)を定義

PUT test
{
    "index":{
        "analysis" : {
            "analyzer" : {
                "kuromoji" : {
                    "tokenizer" : "kuromoji_user_dict",
                    "filter" : ["synonym"]
                }
            },
            "tokenizer" : {
                "kuromoji_user_dict" : {
                    "type" : "kuromoji_tokenizer",
                    "user_dictionary" : "userdict_ja.txt"
                }
            },
            "filter" : {
                "synonym" : {
                    "type" : "synonym",
                    "synonyms_path" : "synonym.txt"
                }
            }
        }
    }
}

 
再度 _analyze 叩くと、

GET test/_analyze
{
    "text" : "きゃりーぱみゅぱみゅとシースー食べる",
    "analyzer" : "kuromoji",
    "explain" : true,
    "attributes" : ["keyword"]
}

↓狙ったようにイケました。この要領で辞書をホゲホゲしていけば、芸能人とギロッポンでシースーも夢ではない!(検索上は、、、w)

"tokens": [
  {
    "token": "きゃりーぱみゅぱみゅ",
    "start_offset": 0,
    "end_offset": 10,
    "type": "word",
    "position": 0
  },
  {
    "token": "と",
    "start_offset": 10,
    "end_offset": 11,
    "type": "word",
    "position": 1
  },
  {
    "token": "シースー",
    "start_offset": 11,
    "end_offset": 15,
    "type": "word",
    "position": 2
  },
  {
    "token": "寿司",
    "start_offset": 11,
    "end_offset": 15,
    "type": "SYNONYM",
    "position": 2
  },
  {
    "token": "食べる",
    "start_offset": 15,
    "end_offset": 18,
    "type": "word",
    "position": 3
  }
]

 

検索エンジン自作入門 ~手を動かしながら見渡す検索の舞台裏
山田 浩之 末永 匡
技術評論社
売り上げランキング: 89,431

シェアする

  • このエントリーをはてなブックマークに追加

フォローする