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

Solr勉強会2015

 Solr勉強会2015

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.