Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

技術勉強会(Solr入門編)

BTC主催 勉強会資料です。
前回挙げたものとほぼ同じですが、少しリバイズしたのでアップします。

  • Identifiez-vous pour voir les commentaires

技術勉強会(Solr入門編)

  1. 1. BTC主催 技術勉強会(Solr入門編) 技術勉強会(Solr入門編) 株式会社ビッグツリーテクノロジー&コンサルティング SI事業部 高安 厚思 1Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  2. 2. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5アジェンダ ▌自己紹介 ▌1 全文検索とは ▌2 Apache Solrとは(30分クッキング) ▌3 Apache Solrの中身 ▌4 Apache Solrを利用するためのプログラム(Java編) ▌5 Apache Solr利用時のポイント 2Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  3. 3. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5自己紹介 高安 厚思 ▌ 活動領域・キーワード ▌ 20年にわたり、ソフトウエアエンジニアリングを適用した システム開発やコンサルティングに携わる。 ▌ 最新技術を適切に利用した、柔軟なシステム構成の構築、 品質管理を中心として技術マネージメントなどを主要テーマとして活動。 ▌ 開発方法論、アーキテクチャ設計コンサルティング、システム全体設計を 得意分野とする。 ▌ 東京電機大学非常勤講師、SQuBOK設計開発領域 検討委員、 ITSS-DS検討委員 ▌資格 ▌ ネットワークスペシャリスト ▌ アプリケーションエンジニア(現 システムアーキテクト) ▌ プロジェクトマネージャ ▌ ITストラテジスト ▌ 情報セキュリティスペシャリスト ▌ MCSE ▌ MCSD 3Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  4. 4. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5対外活動 最近の著書、訳書 ▌ 「システム設計の謎を解く(ソフトバンク)」 ▌ 「StrutsによるWebアプリケーション スーパーサンプル(ソフトバンク)」 ▌ 「Seasar入門[(ソフトバンク)」 ▌ 「Javaルールブック(エクスメディア) ▌ 「ITアーキテクトのためのシステム設計実践ガイド アーキテクチャ編(日経 BP)」など。 連載記事執筆 ▌ 日経SYSTEMS誌「Webアーキテクチャ再入門」 講演 ▌ SODEC ミッションクリティカル開発 ▌ 日本テクノセンター セミナー講師 ▌ UML Forum講師 ▌ 日経BP社 ITアーキテクトのためのシステム設計フォーラム 特別講演 講師 ▌ Developers Summit 2013 Summer ▌ QCon 2014 ▌ ITpro Active製品選択支援セミナー 4Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  5. 5. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5Solrに関する事例 ▌Solrは2012年から案件で利用 5 マルチメディアコンテンツ販売会社向け コンテンツの検索に利用 特徴として、複数単語による状況によるスコア操作 設定されているフィールドに対する順位付けの後、ページ内で並 べ替えをおこなう 公共図書館における書誌の検索 特徴として、複数単語による状況によるスコア操作 Hadoopによるインデックス作成 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  6. 6. BTC主催 技術勉強会(Solr入門編) 1 全文検索とは 6Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  7. 7. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5全文検索とは ▌単語を検索キーとして、対象の文書を見つけ出す操作 ▌DBでも単語をまとめたテーブルに対してLike検索をすることで 実現可能? 7Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 単語数が増えた場合の性能の問題 (前方一致ならインデックスが使われる場合あり) DBMSに格納する処理、検索する処理を アプリケーションで書く必要がある。 単語にはゆれがある (スペースの有り無し、全角半角、変化など) そのため、DBMSより専用の検索エンジンミドルウェアを利用すべき。 (OracleText、Groongaなどもその対象)
  8. 8. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5転置インデックス ▌高速に検索するために、単語と文書IDを結びつけるインデックスを利 用する。このインデックスを「転置インデックス」と呼ぶ 8Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 単語 文書ID Solr 1,2,4 検索エンジン 2,6 Google 2,8 Yahoo 2,9 天気 12,13 転置インデックスによって高速な検索を実現している。 一方で、単語の切り出し方が重要となる。
  9. 9. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5検索の精度 ▌単語を入力して検索した場合に検索される文書に対して、適切かどう かという意味で精度が重要となる 9Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 正解集合検索結果 重なりあったところが 正しい検索結果の一部 本来検索されないと いけないが検索結果 に含まれない 検索されてはいけな い内容が検索された (=ノイズ) この2つの集合(円)が一致することが理想だが、難しい。 トレードオフになることが多いため、この2つのどちらを優先するかが重要
  10. 10. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5再現率と適合率 ▌前頁の内容は学問的に研究されており、検索の精度を表す指標として、 「再現率」と「適合率」がある 10Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 検索結果に含まれた正解集合(個数) 再現率= 正解集合全体(個数) 検索結果に含まれた正解集合(個数) 適合率= 検索結果全体(個数) 前頁と同様に再現率と適合率はトレードオフになることが多いため、 この2つのどちらを優先するかが重要
  11. 11. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5日本語の取り扱い ▌日本語の検索は単語の区切りが明確ではなく、転置インデックスを作 成しにくい ▌単語の区切りによって、適合率・再現率が変わるためどのようにする かが検索精度を決定する 11Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 形態素解析 辞書をもとに単語を分類し、単語を分割する (例 東京都⇒東京、都) Ngram 意味を意識せずに文字で分割する。 (Nの文字のパターンで作る) (例 東京都⇒東京、京都)
  12. 12. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5言葉のゆれへの対応 ▌自然言語を取り扱うため、表現の揺れを意識しないと 再現率が低くなる ▌標準的な表現を決めて、インデックスに格納する ▌インデックス作成、検索時に標準的な表現に変換して利用する 12Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.  旧字対応  音便対応  半角・全角  大文字・小文字  かな・カタカナ  漢字(読み仮名)・送り仮名  略語  動詞変化  単数・複数  検索対象外(助詞等)
  13. 13. BTC主催 技術勉強会(Solr入門編) 2 Apache Solrとは(30分クッキング) 13Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  14. 14. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5 Apache Solrの特徴 Apache Solrとは ▌ApacheのLucenceのサブプロジェクト ▌現状のバージョンは5.2.1 ▌Full Javaで実装されており、Webコンテナで動作する ▌HTTPによるリクエストを実現しており、各言語から利用可能 ▌容易に導入できる割にスケールしやすい 14Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  15. 15. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5 Apache Solrの特徴 ファセットによる絞り込み ▌検索対象の情報に対して、グループ化して検索条件を絞り込む方法を 「ファセット」と呼ぶ ▌Solrにおいて、ファセットを利用した絞り込みは重要な役割を持つ 15Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. Solrでは、  フィールドの値  条件クエリー  範囲(数値、日付) 等を元に絞り込みの値及び対象件数を取得できる
  16. 16. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5 Apache Solrの特徴 スコアリング ▌検索結果はLuceneが持つスコアリングロジックによってスコア化され た結果順に結果が戻される (sortオプションを使うと別の結果となる) ▌スコアリングは、TF-IDFに基づいて計算される ▌このスコアリングロジックに一部カスタマイズをすることが可能 16Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. TF(Term Frequency) 出現頻度を表す指標。「多くでてくる単語がその文書の特性を表 している」という考え方に基づく。 = 対象となる単語の出現回数/文書におけるすべての単語数 IDF(Inverse Document Frequency) 単語が共通で利用されていないかを表す指標。「共通ででてくる 単語は文書の特性を表していない」という考え方に基づく。 = log((全文書数/単語が含まれている文書数)) + 1
  17. 17. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5 Apache Solrの特徴 検索単位と分散検索 ▌検索をおこなうスキーマは一つしかもてないが、一つのサーバに対し て、複数の検索集合を作ることができる ▌この検索集合の単位をコアと呼ぶ ▌複数の検索集合を取り扱うサーバ構成をマルチコアと呼ぶ ▌同一のスキーマであれば複数コアに対して検索することが可能 (分散検索) ▌同時アクセス数に対応するために、同一のインデックスをリプリケー ションできる 17Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  18. 18. BTC主催 技術勉強会(Solr入門編) Apache Solr30分間クッキング Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 18
  19. 19. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5導入 ▌ダウンロードして、起動するまで 19Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 1. http://ftp.riken.jp/net/apache/lucene/solr/4.10.3/から solr-4.10.3.zip をダウンロードする 2. 何らかのツールで解凍する 3. 以下のコマンドを用いて、起動する cd example java -jar start.jar
  20. 20. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5管理コンソールの利用方法 ▌管理コンソールにアクセスする 20Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. http://localhost:8983/solr/ にブラウザでアクセスする。
  21. 21. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5デフォルトの動作とデモ環境 ▌先ほどのコマンド実行ではデフォルトの動作 21Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. SOLRHOMEはsolrディレクトリとなる。 cd example java -Dsolr.solr.home=multicore -jar start.jar デモでは、2つのコアを利用するため、マルチコアを 利用する。 SOLRHOMEはmulticoreディレクトリとなる。
  22. 22. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5一つ目のデモ ▌Wikipediaからタイトルを取得( MediaWiki API) ▌タイトルから記事本文とカテゴリを取得 ▌Solrインデックスを作成 22Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. タイトル クローラ Wikipedia 記事 クローラ タイトル ファイル index この方法は時間がかかるので、あらかじめ作成してある インデックスを利用します。
  23. 23. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5管理コンソールのデモ ▌対象のフォルダをコピーする(conf/dataともに) ▌Solrを再起動する ▌管理コンソールを起動してwikiがあることを確認する ▌Queryの例 ▌Schema Browser ▌Analysis (形態素とNgramの違い) 23Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  24. 24. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5二つ目のデモ ▌空間検索を利用するデモ ▌駅データ.jp(http://www.ekidata.jp/)のデータを加工して、 CSVを作成 ▌実際にインデックシングもデモします。 24Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. ※ 空間検索にはJTS Topology Suiteが必要となるためダウンロードし、 example/lib/extにjts-1.13.jar、jtsio-1.13.jar をコピーする必要があります。
  25. 25. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5インデックシング ▌station用の設定ファイルなどを配置し、Solrを再起動する (この状態ではデータは空) ▌管理コンソールから、対象のコアであるstationを選択する ▌DocumentTypeをCSVとする ▌DocumentsにCopy&Pasteする ▌Submit Documentボタンを押す 25Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  26. 26. BTC主催 技術勉強会(Solr入門編) 3 Apache Solrの中身 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 26
  27. 27. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5Apache Solr アーキテクチャ ▌Apache Solrのアーキテクチャは以下の通り 27Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. インタフェース層 SolrCore searchHandler updateHandler index レスポンスライタ solr-config.xml schema.xml リクエスト レスポンス Apache Solr入門 p017 より引用・加工 クエリーパーサ
  28. 28. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5クエリーパーサ ▌検索式を解釈するパーサ ▌パーサは3種類ある ▌デフォルトはLuceneパーサ ▌ DisMaxパーサ ▌ EDisMaxパーサ ▌パラメータdefTypeで指定できる ▌検索式の指定の仕方を選択できる 28Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  29. 29. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5SearchHandler ▌デフォルトでも設定されており、検索(select)・更新(update)などが ある。 ▌カスタマイズすることができる(solr-config.xmlにて設定) 29Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. <requestHandler name="/query" class="solr.SearchHandler"> パラメータ指定 </requestHandler> 例 サーチコンポーネント <searchComponent name="query" class="solr.QueryComponent" /> <searchComponent name="facet" class="solr.FacetComponent" /> <searchComponent name="mlt" class="solr.MoreLikeThisComponent" /> <searchComponent name="highlight" class="solr.HighlightComponent" /> <searchComponent name="stats" class="solr.StatsComponent" /> <searchComponent name="debug" class="solr.DebugComponent" />
  30. 30. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5設定ファイル ▌Solrコアの設定ファイルは2つ ▌ solr-config.xml ▌ schema.xml 30Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. solr-config.xml  Solrコアの設定ファイル  サンプルからコピーすると動作する  キャッシュの設定やリクエストハンドラの設定などを 変更したい場合に本ファイルを変更する schema.xml  検索対象の情報をどのように格納するかを定義する設定ファイル  Create table文のようなもの  型定義や変換処理を定義できる
  31. 31. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5デモのスキーマファイル(wiki) 31Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="title" type="text_ja" indexed="true" stored="true"/> <field name="description" type="text_ja_html" indexed="true" stored="true"/> <field name="category" type="string" indexed="true" stored="true" multiValued="true"/> <uniqueKey>id</uniqueKey> ~中略 <fieldType name="text_ja" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false"> <analyzer> <tokenizer class="solr.JapaneseTokenizerFactory" mode="search"/> <filter class="solr.JapaneseBaseFormFilterFactory"/> <filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="lang/stoptags_ja.txt" /> <filter class="solr.CJKWidthFilterFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ja.txt" /> <filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType> <fieldType name="text_ja_html" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="false"> <analyzer> <charFilter class="solr.HTMLStripCharFilterFactory"/> ~以下略
  32. 32. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5デモのスキーマファイル(station) 32Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. <field name="station_cd" type="string" indexed="true" stored="true" multiValued="false" required="true"/> <field name="station_g_cd" type="string" indexed="true" stored="true" multiValued="false" /> <field name="station_name" type="text_ja" indexed="true" stored="true" multiValued="false" /> <field name="line_cd" type="string" indexed="true" stored="true" multiValued="false" /> <field name="pref_cd" type="string" indexed="true" stored="true" multiValued="false" /> <field name="post" type="string" indexed="true" stored="true" multiValued="false" /> <field name="add" type="text_ja" indexed="true" stored="true" multiValued="false" /> <field name="point" type="location_rpt" indexed="true" stored="true" multiValued="false" /> ~中略 <fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType" spatialContextFactory="com.spatial4j.core.context.jts.JtsSpatialContextFactory" distErrPct="0.025" maxDistErr="0.000009" units="degrees" /> ~以下略
  33. 33. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5変換処理 ▌再現率を高めるために、インデックス作成時及び検索時に変換をおこ なう。 33Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 検索文字列 複数単語 CharFilter Tokenizer TokenFilter 検索文字列 複数単語 単語単位 文字単位で 変換する 単語に 区切る 単語単位で 変換する  MappingCharFilter  HTMLStripCharFitler  JapaneseTokenizer  WhitespaceTokenizer  NGramTokenizer  JapaneseBaseFormFilter  CJKWidthFilter  LowerCaseFilter
  34. 34. BTC主催 技術勉強会(Solr入門編) 4 Apache Solrを利用するための プログラム(Java編) Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 34
  35. 35. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5インデックス作成 ▌管理コンソールやCurlコマンドなどによってインデックスを作成する ことは可能だが、プログラム言語を用いて作成することも可能 35Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. SolrServer server = new HttpSolrServer("http://localhost:8983/solr/wiki/"); private static List<SolrInputDocument> list = new ArrayList<>(); SolrInputDocument input = new SolrInputDocument(); input.setField("title", model.getTitle()); input.setField("description", model.getHtml()); for (String category : model.getCategories()) { input.addField("category", category); } list.add(input); if (list.size() > COMMIT_COUNT) { server.add(list); server.commit(); list.clear(); } コミットには一定コストがかかるので、 まとめて実施するのがセオリー
  36. 36. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5検索 単純なパターン(全件) 36Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. HttpSolrServer server = new HttpSolrServer("http://localhost/solr/wiki/"); @Test public void test() { SolrQuery query = new SolrQuery(); query.setQuery("*:*"); try { QueryResponse res = server.query(query); SolrDocumentList list = res.getResults(); System.out.println("かかった時間(ms): "+res.getElapsedTime()); System.out.println("検索件数: "+list.getNumFound()); System.out.println("開始位置: "+list.getStart()); list.forEach(doc -> System.out.println("取得したタイトル: "+doc.getFieldValue("title"))); } catch (SolrServerException e) { e.printStackTrace(); } } かかった時間(ms): 131 検索件数: 94503 開始位置: 0 取得したタイトル: 反転幾何学 取得したタイトル: 地球の想い~ほし の想い~ 取得したタイトル: 富里スイカロード レース大会 取得したタイトル: 南富山駅 取得したタイトル: 長尾忠綱 取得したタイトル: 大島建彦 取得したタイトル: 有本義明 取得したタイトル: 平城・相楽ニュー タウン 取得したタイトル: 大路恵美 取得したタイトル: 相澤奈美 テストプログラム 実行結果 SolrDocumentListは ArrayList<SolrDocument>を継承している。 *:*は 検索対象フィールド:検索文字列 を表す。
  37. 37. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5検索 複雑な場合 ▌検索で複雑なことを考える場合、検索式がどのようになるかを考える 必要がある ▌いきなりプログラムを書くのではなく、管理コンソールを利用して検 索式を検討してから、その検索式をAPI(SolrQuery)で マッピングする ▌検索語の処理については、単純な場合と同様 37Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.  開始位置  取得件数  ソート順  取得フィールド  フィルタクエリー  ファセット  クエリーパーサ  ハイライト
  38. 38. BTC主催 技術勉強会(Solr入門編) 5 Apache Solr利用時のポイント Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 38
  39. 39. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5検索の精度を高める ▌検索の精度を高めるために、複数フィールドを組み合わせて 検索をおこなう 39Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 例)日本語の取り扱いとして、NGramと形態素の2つ のフィールドを利用 例)タイトルと本文のフィールドを利用 例)漢字と読み仮名のフィールドを利用 これらのフィールドの組み合わせとブーストを組み合わせて 検索の精度を高める
  40. 40. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5インデックス作成と検索 ▌インデックス作成と検索のサーバは規模が大きくなる場合、分けた方 が良い。 ▌データ件数が多い場合(1000万件が目安)、複数台数に分けて 分散検索を検討する 40Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. コア1 A コア1 S コア1 A コア2 A コア1 S コア2 A コア2 S コア2 S コア‐Z A 分散検索 振り分け 振り分け コアのswap コア1 作成 コア2 作成 検索 インデックス作成 上記構成をSolrの機能として拡張させたのが「Solr Cloud」(Solr4.0~)
  41. 41. BTC主催 技術勉強会(Solr入門編) 1 2 3 4 5性能特性 ▌転置インデックスがあるため、単語が含まれている文書を 見つける等に性能が良い ▌ツリーインデックスなどではないため、DBとは異なる性能特性を持つ ▌開始位置が深くなるにつれて、取得に時間がかかるようになる (deep paging 問題) ▌分散検索をする場合は、分散検索を統合する検索サーバにメモリ上の オーバヘッドかかり、deep paging問題は深刻。 (Googleにおいても深いページは表示できない) 41Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.

×