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

Solr勉強会2015

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 Solr勉強会2015

Avatar for takayasu

takayasu

June 01, 2023
Tweet

More Decks by takayasu

Other Decks in Technology

Transcript

  1. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 アジェンダ ▌⾃⼰紹介 ▌1

    全⽂検索とは ▌2 Apache Solrとは(30分クッキング) ▌3 Apache Solrの中⾝ ▌4 Apache Solrを利⽤するためのプログラム(Java編) ▌5 Apache Solr利⽤時のポイント 2 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  2. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 ⾃⼰紹介 ⾼安 厚思

    ▌ 活動領域・キーワード ▌20年にわたり、ソフトウエアエンジニアリングを適⽤した システム開発やコンサルティングに携わる。 ▌最新技術を適切に利⽤した、柔軟なシステム構成の構築、 品質管理を中⼼として技術マネージメントなどを主要テーマとして活動。 ▌開発⽅法論、アーキテクチャ設計コンサルティング、システム全体設計を 得意分野とする。 ▌東京電機⼤学⾮常勤講師、SQuBOK設計開発領域 検討委員、 ITSS-DS検討委員 ▌資格 ▌ネットワークスペシャリスト ▌アプリケーションエンジニア(現 システムアーキテクト) ▌プロジェクトマネージャ ▌ITストラテジスト ▌情報セキュリティスペシャリスト ▌MCSE ▌MCSD 3 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  3. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 対外活動 n最近の著書、訳書 ▌

    「システム設計の謎を解く(ソフトバンク)」 ▌ 「StrutsによるWebアプリケーション スーパーサンプル(ソフトバンク)」 ▌ 「Seasar⼊⾨[(ソフトバンク)」 ▌ 「Javaルールブック(エクスメディア) ▌ 「ITアーキテクトのためのシステム設計実践ガイド アーキテクチャ編(⽇経 BP)」など。 n連載記事執筆 ▌ ⽇経SYSTEMS誌「Webアーキテクチャ再⼊⾨」 n講演 ▌ SODEC ミッションクリティカル開発 ▌ ⽇本テクノセンター セミナー講師 ▌ UML Forum講師 ▌ ⽇経BP社 ITアーキテクトのためのシステム設計フォーラム 特別講演 講師 ▌ Developers Summit 2013 Summer ▌ QCon 2014 ▌ ITpro Active製品選択⽀援セミナー 4 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  4. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 Solrに関する事例 ▌Solrは2012年から案件で利⽤ 5

    マルチメディアコンテンツ販売会社向け コンテンツの検索に利⽤ 特徴として、複数単語による状況によるスコア操作 設定されているフィールドに対する順位付けの後、ページ内で並 べ替えをおこなう 公共図書館における書誌の検索 特徴として、複数単語による状況によるスコア操作 Hadoopによるインデックス作成 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  5. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 全⽂検索とは ▌単語を検索キーとして、対象の⽂書を⾒つけ出す操作 ▌DBでも単語をまとめたテーブルに対してLike検索をすることで

    実現可能︖ 7 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 単語数が増えた場合の性能の問題 (前⽅⼀致ならインデックスが使われる場合あり) DBMSに格納する処理、検索する処理を アプリケーションで書く必要がある。 単語にはゆれがある (スペースの有り無し、全⾓半⾓、変化など) そのため、DBMSより専⽤の検索エンジンミドルウェアを利⽤すべき。 (OracleText、Groongaなどもその対象)
  6. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 転置インデックス ▌⾼速に検索するために、単語と⽂書IDを結びつけるインデックスを利 ⽤する。このインデックスを「転置インデックス」と呼ぶ

    8 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 単語 ⽂書ID Solr 1,2,4 検索エンジン 2,6 Google 2,8 Yahoo 2,9 天気 12,13 転置インデックスによって⾼速な検索を実現している。 ⼀⽅で、単語の切り出し⽅が重要となる。
  7. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 検索の精度 ▌単語を⼊⼒して検索した場合に検索される⽂書に対して、適切かどう かという意味で精度が重要となる

    9 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 正解集合 検索結果 重なりあったところが 正しい検索結果の⼀部 本来検索されないと いけないが検索結果 に含まれない 検索されてはいけな い内容が検索された (=ノイズ) この2つの集合(円)が⼀致することが理想だが、難しい。 トレードオフになることが多いため、この2つのどちらを優先するかが重要
  8. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 再現率と適合率 ▌前⾴の内容は学問的に研究されており、検索の精度を表す指標として、 「再現率」と「適合率」がある

    10 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 検索結果に含まれた正解集合(個数) 再現率= 正解集合全体(個数) 検索結果に含まれた正解集合(個数) 適合率= 検索結果全体(個数) 前⾴と同様に再現率と適合率はトレードオフになることが多いため、 この2つのどちらを優先するかが重要
  9. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 ⽇本語の取り扱い ▌⽇本語の検索は単語の区切りが明確ではなく、転置インデックスを作 成しにくい

    ▌単語の区切りによって、適合率・再現率が変わるためどのようにする かが検索精度を決定する 11 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 形態素解析 辞書をもとに単語を分類し、単語を分割する (例 東京都⇒東京、都) Ngram 意味を意識せずに⽂字で分割する。 (Nの⽂字のパターンで作る) (例 東京都⇒東京、京都)
  10. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 ⾔葉のゆれへの対応 ▌⾃然⾔語を取り扱うため、表現の揺れを意識しないと 再現率が低くなる

    ▌標準的な表現を決めて、インデックスに格納する ▌インデックス作成、検索時に標準的な表現に変換して利⽤する 12 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. l 旧字対応 l ⾳便対応 l 半⾓・全⾓ l ⼤⽂字・⼩⽂字 l かな・カタカナ l 漢字(読み仮名)・送り仮名 l 略語 l 動詞変化 l 単数・複数 l 検索対象外(助詞等)
  11. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 Apache Solrの特徴 Apache

    Solrとは ▌ApacheのLucenceのサブプロジェクト ▌現状のバージョンは5.2.1 ▌Full Javaで実装されており、Webコンテナで動作する ▌HTTPによるリクエストを実現しており、各⾔語から利⽤可能 ▌容易に導⼊できる割にスケールしやすい 14 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  12. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 Apache Solrの特徴 ファセットによる絞り込み

    ▌検索対象の情報に対して、グループ化して検索条件を絞り込む⽅法を 「ファセット」と呼ぶ ▌Solrにおいて、ファセットを利⽤した絞り込みは重要な役割を持つ 15 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. Solrでは、 l フィールドの値 l 条件クエリー l 範囲(数値、⽇付) 等を元に絞り込みの値及び対象件数を取得できる
  13. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 Apache Solrの特徴 スコアリング

    ▌検索結果はLuceneが持つスコアリングロジックによってスコア化され た結果順に結果が戻される (sortオプションを使うと別の結果となる) ▌スコアリングは、TF-IDFに基づいて計算される ▌このスコアリングロジックに⼀部カスタマイズをすることが可能 16 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. TF(Term Frequency) 出現頻度を表す指標。「多くでてくる単語がその⽂書の特性を表 している」という考え⽅に基づく。 = 対象となる単語の出現回数/⽂書におけるすべての単語数 IDF(Inverse Document Frequency) 単語が共通で利⽤されていないかを表す指標。「共通ででてくる 単語は⽂書の特性を表していない」という考え⽅に基づく。 = log((全⽂書数/単語が含まれている⽂書数)) + 1
  14. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 Apache Solrの特徴 検索単位と分散検索

    ▌検索をおこなうスキーマは⼀つしかもてないが、⼀つのサーバに対し て、複数の検索集合を作ることができる ▌この検索集合の単位をコアと呼ぶ ▌複数の検索集合を取り扱うサーバ構成をマルチコアと呼ぶ ▌同⼀のスキーマであれば複数コアに対して検索することが可能 (分散検索) ▌同時アクセス数に対応するために、同⼀のインデックスをリプリケー ションできる 17 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  15. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 導⼊ ▌ダウンロードして、起動するまで 19

    Copyright (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
  16. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 管理コンソールの利⽤⽅法 ▌管理コンソールにアクセスする 20

    Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. http://localhost:8983/solr/ にブラウザでアクセスする。
  17. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 デフォルトの動作とデモ環境 ▌先ほどのコマンド実⾏ではデフォルトの動作 21

    Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. SOLRHOMEはsolrディレクトリとなる。 cd example java -Dsolr.solr.home=multicore -jar start.jar デモでは、2つのコアを利⽤するため、マルチコアを 利⽤する。 SOLRHOMEはmulticoreディレクトリとなる。
  18. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 ⼀つ⽬のデモ ▌Wikipediaからタイトルを取得( MediaWiki

    API) ▌タイトルから記事本⽂とカテゴリを取得 ▌Solrインデックスを作成 22 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. タイトル クローラ Wikipedia 記事 クローラ タイトル ファイル index この⽅法は時間がかかるので、あらかじめ作成してある インデックスを利⽤します。
  19. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 管理コンソールのデモ ▌対象のフォルダをコピーする(conf/dataともに) ▌Solrを再起動する

    ▌管理コンソールを起動してwikiがあることを確認する ▌Queryの例 ▌Schema Browser ▌Analysis (形態素とNgramの違い) 23 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  20. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 ⼆つ⽬のデモ ▌空間検索を利⽤するデモ ▌駅データ.jp(http://www.ekidata.jp/)のデータを加⼯して、

    CSVを作成 ▌実際にインデックシングもデモします。 24 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. ※ 空間検索にはJTS Topology Suiteが必要となるためダウンロードし、 example/lib/extにjts-1.13.jar、jtsio-1.13.jar をコピーする必要があります。
  21. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 インデックシング ▌station⽤の設定ファイルなどを配置し、Solrを再起動する (この状態ではデータは空)

    ▌管理コンソールから、対象のコアであるstationを選択する ▌DocumentTypeをCSVとする ▌DocumentsにCopy&Pasteする ▌Submit Documentボタンを押す 25 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  22. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 Apache Solr アーキテクチャ

    ▌Apache Solrのアーキテクチャは以下の通り 27 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. インタフェース層 SolrCore searchHandler updateHandler index レスポンスライタ solr-config.xml schema.xml リクエスト レスポンス Apache Solr⼊⾨ p017 より引⽤・加⼯ クエリーパーサ
  23. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 クエリーパーサ ▌検索式を解釈するパーサ ▌パーサは3種類ある

    ▌デフォルトはLuceneパーサ ▌DisMaxパーサ ▌EDisMaxパーサ ▌パラメータdefTypeで指定できる ▌検索式の指定の仕⽅を選択できる 28 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  24. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 SearchHandler ▌デフォルトでも設定されており、検索(select)・更新(update)などが ある。

    ▌カスタマイズすることができる(solr-config.xmlにて設定) 29 Copyright (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" />
  25. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 設定ファイル ▌Solrコアの設定ファイルは2つ ▌solr-config.xml

    ▌schema.xml 30 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. solr-config.xml p Solrコアの設定ファイル p サンプルからコピーすると動作する p キャッシュの設定やリクエストハンドラの設定などを 変更したい場合に本ファイルを変更する schema.xml p 検索対象の情報をどのように格納するかを定義する設定ファイル p Create table⽂のようなもの p 型定義や変換処理を定義できる
  26. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 デモのスキーマファイル(wiki) 31 Copyright

    (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"/> 〜以下略
  27. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 デモのスキーマファイル(station) 32 Copyright

    (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" /> 〜以下略
  28. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 変換処理 ▌再現率を⾼めるために、インデックス作成時及び検索時に変換をおこ なう。

    33 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 検索⽂字列 複数単語 CharFilter Tokenizer TokenFilter 検索⽂字列 複数単語 単語単位 ⽂字単位で 変換する 単語に 区切る 単語単位で 変換する n MappingCharFilter n HTMLStripCharFitler n JapaneseTokenizer n WhitespaceTokenizer n NGramTokenizer n JapaneseBaseFormFilter n CJKWidthFilter n LowerCaseFilter
  29. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 インデックス作成 ▌管理コンソールやCurlコマンドなどによってインデックスを作成する ことは可能だが、プログラム⾔語を⽤いて作成することも可能

    35 Copyright (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(); } コミットには⼀定コストがかかるので、 まとめて実施するのがセオリー
  30. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 検索 単純なパターン(全件) 36

    Copyright (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>を継承している。 *:*は 検索対象フィールド:検索⽂字列 を表す。
  31. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 検索 複雑な場合 ▌検索で複雑なことを考える場合、検索式がどのようになるかを考える

    必要がある ▌いきなりプログラムを書くのではなく、管理コンソールを利⽤して検 索式を検討してから、その検索式をAPI(SolrQuery)で マッピングする ▌検索語の処理については、単純な場合と同様 37 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. l 開始位置 l 取得件数 l ソート順 l 取得フィールド l フィルタクエリー l ファセット l クエリーパーサ l ハイライト
  32. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 検索の精度を⾼める ▌検索の精度を⾼めるために、複数フィールドを組み合わせて 検索をおこなう

    39 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 例)⽇本語の取り扱いとして、NGramと形態素の2つ のフィールドを利⽤ 例)タイトルと本⽂のフィールドを利⽤ 例)漢字と読み仮名のフィールドを利⽤ これらのフィールドの組み合わせとブーストを組み合わせて 検索の精度を⾼める
  33. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 インデックス作成と検索 ▌インデックス作成と検索のサーバは規模が⼤きくなる場合、分けた⽅ が良い。

    ▌データ件数が多い場合(1000万件が⽬安)、複数台数に分けて 分散検索を検討する 40 Copyright (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〜)
  34. BTC主催 技術勉強会(Solr⼊⾨編) 1 2 3 4 5 性能特性 ▌転置インデックスがあるため、単語が含まれている⽂書を ⾒つける等に性能が良い

    ▌ツリーインデックスなどではないため、DBとは異なる性能特性を持つ ▌開始位置が深くなるにつれて、取得に時間がかかるようになる (deep paging 問題) ▌分散検索をする場合は、分散検索を統合する検索サーバにメモリ上の オーバヘッドかかり、deep paging問題は深刻。 (Googleにおいても深いページは表⽰できない) 41 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.