end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

elasticsearch に analysis-sudachi プラグイン + ユーザ辞書を導入し、日本語の全文検索

先日のkuromojiではユーザ辞書の登録方法が不明でしたので、今回は sudachi。

それっぽい日本語全文検索はできましたが、期待した分かち書きにはならず、 「ホントにユーザ辞書が機能しているの?」という感じでした。

参考url

install elasticsearch 8.13.4 と、初回機能によるrootパスワード発行

2024/10時点の最新 analysis-sudachiは ver.3.2.2 で、 対応する elasticsearchが ver.8.4.3 でしたので、これをインストール

$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.13.4-linux-x86_64.tar.gz
$ tar -xzf elasticsearch-8.13.4-linux-x86_64.tar.gz
$ cd elasticsearch-8.13.4/
$ bin/elasticsearch
【略】
 Elasticsearch security features have been automatically configured!
 Authentication is enabled and cluster connections are encrypted.

  Password for the elastic user (reset with `bin/elasticsearch-reset-password -u elastic`):
  O_j2Ga64xnJNjwTYzOZO

install analysis-sudachiプラグイン ver.3.2.2

$ cd elasticsearch-8.13.4/
$ bin/elasticsearch-plugin install \
  https://github.com/WorksApplications/elasticsearch-sudachi/releases/download/v3.2.2/elasticsearch-8.13.4-analysis-sudachi-3.2.2.zip
-> Installing https://github.com/WorksApplications/elasticsearch-sudachi/releases/download/v3.2.2/elasticsearch-8.13.4-analysis-sudachi-3.2.2.zip
-> Downloading https://github.com/WorksApplications/elasticsearch-sudachi/releases/download/v3.2.2/elasticsearch-8.13.4-analysis-sudachi-3.2.2.zip
[=================================================] 100%?? 
-> Installed analysis-sudachi
-> Please restart Elasticsearch to activate any plugins installed

システム辞書と、ユーザ辞書の準備

システム辞書は、sudachi dictのgithub?からダウンロード

$ wget https://d2ej7fkh96fzlu.cloudfront.net/sudachidict/sudachi-dictionary-latest-core.zip
$ unzip sudachi-dictionary-latest-core.zip
$ mkdir config/sudachi
$ cp sudachi-dictionary-*/system_core.dic config/sudachi/system_core.dic

ユーザ辞書は、以前、sudachipyで作成したものを config/sudachi/ へ コピー

https://end0tknr.hateblo.jp/entry/20240409/1712611803

もし、java版sudachiでユーザ辞書csvからユーザ辞書をbuildする場合、以下

$ java -Dfile.encoding=UTF-8 -cp sudachi-*.jar \
    com.worksap.nlp.sudachi.dictionary.UserDictionaryBuilder \
    -o user.dic -s system_core.dic \
    -d 'my first user dictionary' \
    user.dic.csv

user.dic.csv    ....... Done! (1256 entries, 0.067 sec)
POS table               Done! (2 bytes, 0.002 sec)
WordId table    ....... Done! (6279 bytes, 0.002 sec)
double array Trie       Done! (46084 bytes, 0.022 sec)
word parameters         Done! (7530 bytes, 0.000 sec)
word entries            Done! (40914 bytes, 0.010 sec)
WordInfo offsets        Done! (5020 bytes, 0.000 sec)

index作成と、辞書設定

elasticsearch-8.13.4/sudachi.json を作成

{"settings": { "index": { "analysis": {
    "tokenizer": { "sudachi_tokenizer": {
        "type": "sudachi_tokenizer",
        "additional_settings":
           "{\"systemDict\":\"system_core.dic\",\"userDict\":[\"user.dic\"]}"
    } },
    "analyzer": {
      "sudachi_analyzer": {"type": "custom",
                           "tokenizer": "sudachi_tokenizer"}
    }
} } } }

index作成と、辞書設定

$ curl --cacert config/certs/http_ca.crt -u elastic \
  -H "Content-Type: application/json" -X PUT \
  http://localhost:9200/test_index \
   --data-binary @sudachi.json

{"acknowledged":true,"shards_acknowledged":true,"index":"test_index"}

index作成と、辞書設定の確認

$ curl --cacert config/certs/http_ca.crt -u elastic \
  http://localhost:9200/test_index/_settings

{"test_index": {
    "settings": {
      "index": {
        "routing": {
          "allocation": {
            "include": {"_tier_preference": "data_content"}
          }
        },
        "number_of_shards": "1",
        "provided_name": "test_index",
        "creation_date": "1728588381818",
        "analysis": {
          "analyzer": {
            "sudachi_analyzer": {"type": "custom",
                             "tokenizer": "sudachi_tokenizer"
            }
          },
          "tokenizer": {
            "sudachi_tokenizer": {
              "type": "sudachi_tokenizer",
              "additional_settings":
          "{\"systemDict\":\"system_core.dic\",\"userDict\":[\"user.dic\"]}"
            }
          }
        },
        "number_of_replicas": "1",
        "uuid": "qYb7XeDWSIaUOQidjbMxTg",
        "version": { "created": "8503000" }
      }
    }
  }
}

分かち書きのテスト

ユーザ辞書には「快感A」を「快感エアリー」で登録したので、 以下も「快感エアリー」と返して欲しかったのですが、 対処方法が不明の為、今回はここまで

$ curl --cacert config/certs/http_ca.crt -u elastic \
 "localhost:9200/test_index/_analyze?pretty" \
 -H 'Content-Type: application/json' \
 -d'{"tokenizer":"sudachi_tokenizer", "text" : "快感A"}'

{
  "tokens" : [
    {
      "token" : "快感",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "A",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "word",
      "position" : 1
    }
  ]
}