Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Elasticsearch第2回報告会資料 #elasticsearch

sakura818uuu
September 28, 2017

Elasticsearch第2回報告会資料 #elasticsearch

Elasticsearch 5.6.1
- 検索する手順を追う
- セキュリティ
- 速度計測

sakura818uuu

September 28, 2017
Tweet

More Decks by sakura818uuu

Other Decks in Technology

Transcript

  1. 検索する手順を追う 例えばこんな表データがあったとします。 id name text created_at (登録日時) 1 東京スカイツリーにいって隅田川の花火を みよう!

    毎年7月に行われる隅田川花火大 会。東京スカイツリーでは … 2017-07-25 2 鎌倉・江ノ島でおいしいものをたくさん食べ るツアー 神奈川県を代表する観光スポット 鎌倉・江ノ島。特にしらす丼が有名 ですが、鎌倉野菜や … 2017-05-08 3 湯島のおいしいお魚ランチ 今年の夏に湯島に移転した「旬菜 なんてん」。ランチには煮魚定食や ミックスフライ定食… 2017-09-01 4
  2. データをJSONファイルに加工する Elasticsearchのデータ登録はJSONファイル形式で行うため、先程の表データをJSON ファイルに加工する。 { "id" : "1", "name" : "東京スカイツリーにいって隅田川の花火をみよう!",

    "text" : "毎年7月に行われる隅田川花火大会。東京スカイツリーでは…", "created_at" : "2017-07-25" } 9 id name text created_at(登録日時) 1 東京スカイツリーにいって隅田川の花火をみよう! 毎年7月に行われる隅田川花火大 会。東京スカイツリーでは … 2017-07-25
  3. Elasticsearchに先程のJSONファイルを登録 今回はわかりやすいように1件ずつ登録していきます。 $ curl -X PUT http://localhost:9200/tokyotravel/recommendpage/1?pretty -d ' {

    "id" : "1", "name" : "東京スカイツリーにいって隅田川の花火をみよう!", "text" : "毎年7月に行われる隅田川花火大会。東京スカイツリーでは…", "created_at" : "2017-07-25" }' テンプレート: $ curl -X PUT {HOST}:{PORT}/{index}/{type}/{id}?pretty -d 'JSONデー タ' 参考 {HOST}:{PORT}/{index}/{type}/{id} 10
  4. 2件目のデータを登録 $ curl -X PUT http://localhost:9200/tokyotravel/recommendpage/2?pretty -d ' { "id"

    : "2", "name" : "鎌倉・江ノ島でおいしいものをたくさん食べるツアー", "text" : "神奈川県を代表する観光スポット鎌倉・江ノ島。特にしらす丼が有名ですが、鎌倉野菜 や…", "created_at" : "2017-05-08"} ' 13
  5. 3件目のデータを登録 $ curl -X PUT http://localhost:9200/tokyotravel/recommendpage/3?pretty -d ' { "id"

    : "3", "name" : "湯島のおいしいお魚ランチ", "text" : "今年の夏に湯島に移転し た「旬菜なんてん」。ランチには煮魚定食やミックスフライ定食…", "created_at" : "2017-09-01"} ' 14
  6. nameとtextのフィールドどちらにも「隅田川」が入ってい るデータを検索する $ curl -X GET http://localhost:9200/tokyotravel/recommendpage/_search?pretty -d ' {

    "query": { "bool": { "must": [ { "match": { "name": "隅田川" } }, { "match": { "text": "隅田川" } } ] } } }' 参考: mustはAND条件, shouldはOR条件となる 18
  7. nameまたはtextのフィールドに「隅田川」が入っている データを検索する $ curl -X GET http://localhost:9200/tokyotravel/recommendpage/_search?pretty -d ' {

    "query": { "bool": { "should": [ { "match": { "name": "隅田川" } }, { "match": { "text": "隅田川" } } ] } } }' 参考: mustはAND条件, shouldはOR条件となる 20
  8. ところで、キーワード検索を関連度ではなく、ただキー ワードが一致するものだけをヒットさせたい場合はどうし たらいいのか 答え:queryではなくfilterを使用する。 $ curl -X GET http://localhost:9200/tokyotravel/recommendpage/_search?pretty -d

    ' { "query": { "bool": { "should": [ { "match": { "name": "隅田川" } }, { "match": { "text": "隅田川" } } ] } } }' 28 ←これは先程の「nameまたはtextの フィールドに「隅田川」が入っている データを検索する」を検索してなぜか 2件目もヒットしたときのクエリ これ
  9. 実際にfilterを使って検索してみよう シンプルにqureyをfilterにおきかえてみる $ curl -X GET http://localhost:9200/tokyotravel/recommendpage/_search?pretty -d ' {

    "filter": { "bool": { "should": [ { "match": { "name": "隅田川" } }, { "match": { "text": "隅田川" } } ] } } }' 30 ここをqueryからfilterにおきかえた
  10. こうか? queryの下の階層にfilterをかいてみる $ curl -X GET http://localhost:9200/tokyotravel/recommendpage/_search?pretty -d ' {

    "query": { "filter": { "should": [ { "match": { "name": "隅田川" } }, { "match": { "text": "隅田川" } } ] } } }' 32 queryの下の階層にfilterを置いてみた
  11. 失敗3 [filter] query malformed, no start_object after query name というエラーが出ました。

    むむ… filterの使い方は今回の発表ま でにわかりませんでした。 今度別の資料としてfilterの使い 方を発表します: & 35
  12. このブログが最も詳しい ・elasticsearchをランサムウェアから守るには #elastic - ( https://www.creationline.com/blog/15761 ) - 日本語・elasticsearch.ymlの設定などが書かれている ・Securing

    Your Elasticsearch Cluster By Alex Brasetvik - ( https://www.elastic.co/blog/found-elasticsearch-security) - 英語・elastic社公式のドキュメント 40
  13. 結論からいうと正確なデータがとれていません まとめ • ElasticsearchとMySQLの検索結果速度の比較検証をしよう考えた。 • 検証目的は、検索結果速度は Elasticsearch>MySQL と個人的に思っていて、 そ れを実証したかったから。

    • 有効なデータを得るにはElasticsearchとMySQLを同等な検証環境にする必要が ある。それが想定していたよりもものすごく難しい。 • そもそもこの2つを比べることは公正なのか? *この章は文字が多いです。 42
  14. ElasticsearchとMySQLの検索結果速度の比較検証を しよう考えた。 検索ははやいほうがいい、当たり前のことである。 前回MySQL InnoDB FTS Ngram(n=2) IN BOOLEAN MODEを調査した時、検索結

    果速度がめちゃくちゃ遅かったことがネックだった。 今回調査しているElasticsearchは様々なブログをみても遅いということをあまり見たこと がないし、ざっくりとした仕組みから考えても少なくともMySQL InnoDB FTS Ngram(n=2) IN BOOLEAN MODEははやいだろう。 →だとしたら検索結果速度の比較検証をしてみよう 43
  15. 1.MySQLのCSVファイルをJSONファイルに変換し、 Elasticsearchに適用する方法 ElasticsearchはJSONが基本であり、CSVファイルをJSONファイルに変換する必要が ある。ここで2つ方法がある。 1. CSVファイルをJSONファイルに変換させるブラウザ上にあるツールを使用する方 法→変換するのは簡単、しかしidの問題がある 2. 前回紹介したElastic stackのLog

    stash(Fluentdみたいなデータの集約・転送をす るツール、データをインプット→変換→アウトプットするもの)を使い、CSVファイルを JSONファイルに変換し、そのままElasticsearchと連携させる方法→Log stashに 関してはまだ試せていない 46