ジョギング
- 香椎浜 x 2 周
- 昨日とは打って変わって軽快に走れた
日課
- (腕立て x 30 + 腹筋 x 30) x 3
体調
- イマイチ
夕飯
- 久しぶりの鍋
- 鶏で出汁を取った
Lucene をちょっと触る機会を得たので、Lucene を生で触るよりも Solr を試してみることにしたのでメモ。
ホントにメモ。そして「Solr とは」とかには触れない。
$ sw_vers ProductName: Mac OS X ProductVersion: 10.11.6 BuildVersion: 15G17023 $ java -version java version "1.8.0_144" Java(TM) SE Runtime Environment (build 1.8.0_144-b01) Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode) $ ./bin/solr -version 5.5.5
こちら から zip ファイルを取得して適当なディレクトリに展開して以下のように Solr を起動する。
./bin/solr start
以下のように出力される。
$ ./bin/solr start Waiting up to 30 seconds to see Solr running on port 8983 [|] Started Solr server on port 8983 (pid=51921). Happy searching!
ブラウザで http://localhost:8983 にアクセスすると下図のように表示される。
Solr では Core と呼ばれる RDB 言うところのスキーマを作成する必要がある。Core 毎にスキーマ定義やクエリ設定を行うことが出来る。
Core は以下のように実行して作成する。
bin/solr create -c collection1
以下のように出力される。
$ bin/solr create -c collection1 Copying configuration to new core instance directory: /Path/To/solr-5.5.5/server/solr/collection1 Creating new core 'collection1' using command: http://localhost:8983/solr/admin/cores?action=CREATE&name=collection1&instanceDir=collection1 { "responseHeader":{ "status":0, "QTime":2088}, "core":"collection1"}
Core にドキュメントを登録する場合、XML と JSON そして CSV で登録することが出来るが、今回は以下のように JSON で登録する。
curl -X POST -H 'Content-Type: application/json' \ 'http://localhost:8983/solr/collection1/update?wt=json&indent=on' --data-binary ' [ { "id": "1", "title": "Doc 1" }, { "id": "2", "title": "Doc 2" }, { "id": "3", "title": "Doc 3" }, { "id": "4", "title": "Doc 4" }, { "id": "5", "title": "Doc 5" }, { "id": "6", "title": "Doc 6" }, { "id": "7", "title": "Doc 7" }, { "id": "8", "title": "Doc 8" }, { "id": "9", "title": "Doc 9" }, { "id": "10", "title": "Doc 10" }, { "id": "11", "title": "Doc 11" } ]'
以下のように出力される。
$ curl -X POST -H 'Content-Type: application/json' \ 'http://localhost:8983/solr/collection1/update?wt=json&indent=on' --data-binary ' [ { "id": "1", "title": "Doc 1" }, ... (略) ... { "responseHeader":{ "status":0, "QTime":222}}
curl -X GET 'http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=on'
以下のように出力されるだけ。
$ curl -X GET 'http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=on' { "responseHeader":{ "status":0, "QTime":19, "params":{ "q":"*:*", "indent":"on", "wt":"json"}}, "response":{"numFound":0,"start":0,"docs":[] }}
Solr では登録したドキュメントを検索出来るようにするには commit
処理が必要になる。
ということで Commit する。
curl -X GET 'http://localhost:8983/solr/collection1/update?commit=true&wt=json&indent=on'
以下のように出力される。
$ curl -X GET 'http://localhost:8983/solr/collection1/update?commit=true&wt=json&indent=on' { "responseHeader":{ "status":0, "QTime":5}}
curl -X GET 'http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=on'
以下のように出力される。
$ curl -X GET 'http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=on' { "responseHeader":{ "status":0, "QTime":3, "params":{ "q":"*:*", "indent":"on", "wt":"json"}}, "response":{"numFound":11,"start":0,"docs":[ { "id":"1", "title":["Doc 1"], "_version_":1583237681930829824}, ... (略) ... { "id":"10", "title":["Doc 10"], "_version_":1583237682111184896}] }}
以下のように ID を指定してドキュメントを削除する。
curl -X POST -H 'Content-Type: application/json' \ 'http://localhost:8983/solr/collection1/update' --data-binary ' { "delete": "10" }'
以下のように出力さる。
$ curl -X POST -H 'Content-Type: application/json' \ > 'http://localhost:8983/solr/collection1/update' --data-binary ' > { > "delete": "10" }'> }' {"responseHeader":{"status":0,"QTime":6}}
削除の場合にも Commit を行う。
curl -X GET 'http://localhost:8983/solr/collection1/update?commit=true&wt=json&indent=on'
以下のように出力される。
$ curl -X GET 'http://localhost:8983/solr/collection1/update?commit=true&wt=json&indent=on' { "responseHeader":{ "status":0, "QTime":4}}
curl -X GET 'http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=on'
以下のように ID: 10 のドキュメントは削除され、検索結果に出力されない。
$ curl -X GET 'http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=on' { "responseHeader":{ "status":0, "QTime":6, "params":{ "q":"*:*", "indent":"on", "wt":"json"}}, "response":{"numFound":10,"start":0,"docs":[ { "id":"1", "title":["Doc 1"], "_version_":1583237681930829824}, { ... (略) ... { "id":"9", "title":["Doc 9"], "_version_":1583237682110136320}, { "id":"11", "title":["Doc 11"], "_version_":1583237682111184897}] }}
但し、ここでの「削除」はマージ処理が行われていないので、完全な削除にはなっていないので、Solr ダッシュボード → Core → Dashboard では以下のように出力されている。
Deleted Document は 1 にカウントアップされていて、Optimized が実施可能な状態になっている。
ということで、最適化を行う。
curl -X GET 'http://localhost:8983/solr/collection1/update?optimize=true&wt=json&indent=on'
以下のように出力される。
$ curl -X GET 'http://localhost:8983/solr/collection1/update?optimize=true&wt=json&indent=on' { "responseHeader":{ "status":0, "QTime":106}}
メモでした。
Elasticsearch と言うか、Elasticsearch や Solr の基盤となっている Lucene の話になると思います。
上記のブログ記事を自分なりに整理してみましたが、内容には誤りや古い情報が含まれている可能性があるので、誤りがあればご指摘頂けると嬉しいです。
Elasticsearch インデックスと Lucene インデックスについて、こちらの記事の下図が解り易かったので転載させて頂きました。
cd /tmp/
wget http://ftp.jaist.ac.jp/pub/apache/lucene/java/7.1.0/lucene-7.1.0.zip
unzip lucene-7.1.0.zip export CLASSPATH=lucene-7.1.0/core/lucene-core-7.1.0.jar:lucene-7.1.0/queryparser/lucene-queryparser-7.1.0.jar:lucene-7.1.0/analysis/common/lucene-analyzers-common-7.1.0.jar:lucene-7.1.0/demo/lucene-demo-7.1.0.jar
java org.apache.lucene.demo.IndexFiles -docs lucene-7.1.0/docs
インデックスの作成が終わると、カレントディレクトリに index
というディレクトリが作成されます。
$ tree index index ├── _0.cfe ├── _0.cfs ├── _0.si ├── _1.cfe ├── _1.cfs ├── _1.si ├── segments_1 └── write.lock 0 directories, 8 files
各ファイルの概要については、以下のドキュメントに記載されています。
ほうほう、これが Lucene のインデックスなんですな...位のレベルの理解に留めておきます。(とても奥深そうなので)
以下のように lucene
というキーワードで検索してみると以下のように出力されました。
$ java org.apache.lucene.demo.SearchFiles Enter query: lucene Searching for: lucene 6221 total matching documents 1. lucene-7.1.0/docs/core/allclasses-noframe.html 2. lucene-7.1.0/docs/test-framework/allclasses-noframe.html 3. lucene-7.1.0/docs/analyzers-common/allclasses-noframe.html 4. lucene-7.1.0/docs/core/allclasses-frame.html 5. lucene-7.1.0/docs/analyzers-common/allclasses-frame.html 6. lucene-7.1.0/docs/spatial3d/overview-tree.html 7. lucene-7.1.0/docs/test-framework/allclasses-frame.html 8. lucene-7.1.0/docs/queryparser/allclasses-noframe.html 9. lucene-7.1.0/docs/changes/Changes.html 10. lucene-7.1.0/docs/benchmark/allclasses-noframe.html Press (n)ext page, (q)uit or enter number to jump to a page.
Lucene のドキュメントから lucene
というキーワードが含まれているドキュメントの HTML 一覧が出力されるようです。
以下、こちらのブログについて、個人的な解釈をまとめていきます。
あくまでも個人的な解釈の為、誤り等が散見されると思いますが、その際はコメント等でご指摘頂けると幸いです。
index.merge.policy.reclaim_deletes_weight
はマージを制御する設定項目
only_expunge_deletes
は Lucene の IndexWriter.expungeDeletes
メソッドを呼び出すonly_expunge_deletes
が付与された場合にはセグメント全体の 10 % を超える削除があるセグメントのマージが行われる(という理解)only_expunge_deletes
フラグの説明は以下の通り記載されている
only_expunge_deletes
フラグが立っていると、削除されたセグメントのみマージ処理が行われるfalse
になっているExpunge Deletes の挙動について、以下の記事がとても参考になりました。
有難うございます。
only_expunge_deletes
フラグが立っていると、削除されたセグメントのみマージ処理が行われるGoogle 翻訳しながら読んだので半分も理解出来ていない可能性がありますが、Lucene のレベルまで切り込んで Elasticsearch について考えたことが無かったのでとても良い経験になりました。
既に MacBook Pro と iMac が手元で稼働していることが前提。
基本的には以下の 2 台を Thunderbolt ケーブルで繋ぐだけ。
以下の記事を参考に Karabiner をインストールして Brightness Adjust を F2 に割り当てた。
有難うございました。
Spotify で音楽流すことが出来たりするのが嬉しい。
接続している MacBook Pro 側で操作出来たりする。凄いなあ。
パッと見で違和感無し。
Apple の純正品だと何にも苦労しないのは素敵だなと思った次第。高いけど。
奥さんオススメする博多のマッサージ屋さんで全身マッサージを受ける。施術してくれたのは台湾出身のケケさん。ケケさん、無駄な営業トークも無く淡々と台湾仕込みのマッサージでかなり癒やされた。有難う、ケケさん。
博多のヨドバシで Thunderbolt ケーブルを購入。iMac を外付けモニタで利用する予定。ポイント使ってちょっとだけ安く買うことが出来た。
ついでに iPhone X をちょろっと触ってみたけど、従来の iPhone との差がイマイチ判らなかった。
ちょっと早い誕生日を奥さんに祝ってもらった。
42 歳でこんな感じでござる。
夜釣りで「セイゴ」(スズキの進化前の名前)を上げた。
ウキを使わない仕掛けを使って、竿先に意識を集中して手に伝わってくる感覚だけで釣るので、仕事の事とか忘れてとにかく釣りに没頭することが出来た。
本当に楽しかった。
誘ってくださった正三おじさん、本当に有難うございました。