狠狠撸

狠狠撸Share a Scribd company logo
BTC主催 Solr勉強会
solr勉強会
株式会社ビッグツリーキャピタル
SI事業部
高安 厚思
1Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
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.
BTC主催 Solr勉強会
1 2 3 4 5自己紹介
高安 厚思
▌ 活動領域?キーワード
▌ 20年にわたり、ソフトウエアエンジニアリングを適用した
システム開発やコンサルティングに携わる。
▌ 最新技術を適切に利用した、柔軟なシステム構成の構築、
品質管理を中心として技術マネージメントなどを主要テーマとして活動。
▌ 開発方法論、アーキテクチャ設計コンサルティング、システム全体設計を
得意分野とする。
▌ 東京電機大学非常勤講師、SQuBOK設計開発領域 検討委員、
ITSS-DS検討委員
▌資格
▌ ネットワークスペシャリスト
▌ アプリケーションエンジニア(現 システムアーキテクト)
▌ プロジェクトマネージャ
▌ ITストラテジスト
▌ 情報セキュリティスペシャリスト
▌ MCSE
▌ MCSD
3Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
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.
BTC主催 Solr勉強会
1 2 3 4 5Solrに関する事例
▌Solrは2012年から案件で利用
5
マルチメディアコンテンツ販売会社向け
コンテンツの検索に利用
特徴として、複数単語による状況によるスコア操作
設定されているフィールドに対する順位付けの後、ページ内で並
べ替えをおこなう
公共図書館における書誌の検索
特徴として、複数単語による状況によるスコア操作
Hadoopによるインデックス作成
Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
BTC主催 Solr勉強会
1 全文検索とは
6Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
BTC主催 Solr勉強会
1 2 3 4 5全文検索とは
▌単語を検索キーとして、対象の文書を見つけ出す操作
▌DBでも単語をまとめたテーブルに対してLike検索をすることで
実現可能?
7Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
単語数が増えた場合の性能の問題
(前方一致ならインデックスが使われる場合あり)
DBMSに格納する処理、検索する処理を
アプリケーションで書く必要がある。
単語にはゆれがある
(スペースの有り無し、全角半角、変化など)
そのため、DBMSより専用の検索エンジンミドルウェアを利用すべき。
(OracleText、Groongaなどもその対象)
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
転置インデックスによって高速な検索を実現している。
一方で、単語の切り出し方が重要となる。
BTC主催 Solr勉強会
1 2 3 4 5検索の精度
▌単語を入力して検索した場合に検索される文書に対して、適切かどう
かという意味で精度が重要となる
9Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
正解集合検索結果
重なりあったところが
正しい検索結果の一部
本来検索されないと
いけないが検索結果
に含まれない
検索されてはいけな
い内容が検索された
(=ノイズ)
この2つの集合(円)が一致することが理想だが、難しい。
トレードオフになることが多いため、この2つのどちらを優先するかが重要
BTC主催 Solr勉強会
1 2 3 4 5再現率と適合率
▌前頁の内容は学問的に研究されており、検索の精度を表す指標として、
「再現率」と「適合率」がある
10Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
検索結果に含まれた正解集合(個数)
再現率=
正解集合全体(個数)
検索結果に含まれた正解集合(個数)
適合率=
検索結果全体(個数)
前頁と同様に再現率と適合率はトレードオフになることが多いため、
この2つのどちらを優先するかが重要
BTC主催 Solr勉強会
1 2 3 4 5日本語の取り扱い
▌日本語の検索は単語の区切りが明確ではなく、転置インデックスを作
成しにくい
▌単語の区切りによって、適合率?再現率が変わるためどのようにする
かが検索精度を決定する
11Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
形態素解析
辞書をもとに単語を分類し、単語を分割する
(例 東京都?東京、都)
Ngram
意味を意識せずに文字で分割する。
(Nの文字のパターンで作る)
(例 東京都?東京、京都)
BTC主催 Solr勉強会
1 2 3 4 5言葉のゆれへの対応
▌自然言語を取り扱うため、表現の揺れを意識しないと
再現率が低くなる
▌標準的な表現を決めて、インデックスに格納する
▌インデックス作成、検索時に標準的な表現に変換して利用する
12Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
? 旧字対応
? 音便対応
? 半角?全角
? 大文字?小文字
? かな?カタカナ
? 漢字(読み仮名)?送り仮名
? 略語
? 動詞変化
? 単数?複数
? 検索対象外(助詞等)
BTC主催 Solr勉強会
2 Apache Solrとは(30分クッキング)
13Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
BTC主催 Solr勉強会
1 2 3 4 5
Apache Solrの特徴
Apache Solrとは
▌ApacheのLucenceのサブプロジェクト
▌現状のバージョンは4.10.x
▌Full Javaで実装されており、Webコンテナで動作する
▌HTTPによるリクエストを実現しており、各言語から利用可能
▌容易に導入できる割にスケールしやすい
14Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
BTC主催 Solr勉強会
1 2 3 4 5
Apache Solrの特徴
ファセットによる絞り込み
▌検索対象の情報に対して、グループ化して検索条件を絞り込む方法を
「ファセット」と呼ぶ
▌Solrにおいて、ファセットを利用した絞り込みは重要な役割を持つ
15Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
Solrでは、
? フィールドの値
? 条件クエリー
? 範囲(数値、日付)
等を元に絞り込みの値及び対象件数を取得できる
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
BTC主催 Solr勉強会
1 2 3 4 5
Apache Solrの特徴
検索単位と分散検索
▌検索をおこなうスキーマは一つしかもてないが、一つのサーバに対し
て、複数の検索集合を作ることができる
▌この検索集合の単位をコアと呼ぶ
▌複数の検索集合を取り扱うサーバ構成をマルチコアと呼ぶ
▌同一のスキーマであれば複数コアに対して検索することが可能
(分散検索)
▌同時アクセス数に対応するために、同一のインデックスをリプリケー
ションできる
17Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
BTC主催 Solr勉強会
Apache Solr30分間クッキング
Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 18
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
BTC主催 Solr勉強会
1 2 3 4 5管理コンソールの利用方法
▌管理コンソールにアクセスする
20Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
http://localhost:8983/solr/ にブラウザでアクセスする。
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ディレクトリとなる。
BTC主催 Solr勉強会
1 2 3 4 5一つ目のデモ
▌Wikipediaからタイトルを取得( MediaWiki API)
▌タイトルから記事本文とカテゴリを取得
▌Solrインデックスを作成
22Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
タイトル
クローラ
Wikipedia
記事
クローラ
タイトル
ファイル
index
この方法は時間がかかるので、あらかじめ作成してある
インデックスを利用します。
BTC主催 Solr勉強会
1 2 3 4 5管理コンソールのデモ
▌対象のフォルダをコピーする(conf/dataともに)
▌Solrを再起動する
▌管理コンソールを起動してwikiがあることを確認する
▌Queryの例
▌Schema Browser
▌Analysis (形態素とNgramの違い)
23Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
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
をコピーする必要があります。
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.
BTC主催 Solr勉強会
3 Apache Solrの中身
Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 26
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 より引用?加工
クエリーパーサ
BTC主催 Solr勉強会
1 2 3 4 5クエリーパーサ
▌検索式を解釈するパーサ
▌パーサは3種類ある
▌デフォルトはLuceneパーサ
▌ DisMaxパーサ
▌ EDisMaxパーサ
▌パラメータdefTypeで指定できる
▌検索式の指定の仕方を選択できる
28Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
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" />
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文のようなもの
? 型定義や変換処理を定義できる
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"/>
~以下略
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" />
~以下略
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
BTC主催 Solr勉強会
4 Apache Solrを利用するための
プログラム(Java編)
Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 34
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();
}
コミットには一定コストがかかるので、
まとめて実施するのがセオリー
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>を継承している。
*:*は
検索対象フィールド:検索文字列
を表す。
BTC主催 Solr勉強会
1 2 3 4 5検索 複雑な場合
▌検索で複雑なことを考える場合、検索式がどのようになるかを考える
必要がある
▌いきなりプログラムを書くのではなく、管理コンソールを利用して検
索式を検討してから、その検索式をAPI(SolrQuery)で
マッピングする
▌検索語の処理については、単純な場合と同様
37Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
? 開始位置
? 取得件数
? ソート順
? 取得フィールド
? フィルタクエリー
? ファセット
? クエリーパーサ
? ハイライト
BTC主催 Solr勉強会
5 Apache Solr利用時のポイント
Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 38
BTC主催 Solr勉強会
1 2 3 4 5検索の精度を高める
▌検索の精度を高めるために、複数フィールドを組み合わせて
検索をおこなう
39Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
例)日本語の取り扱いとして、NGramと形態素の2つ
のフィールドを利用
例)タイトルと本文のフィールドを利用
例)漢字と読み仮名のフィールドを利用
これらのフィールドの組み合わせとブーストを組み合わせて
検索の精度を高める
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~)
BTC主催 Solr勉強会
1 2 3 4 5性能特性
▌転置インデックスがあるため、単語が含まれている文書を
見つける等に性能が良い
▌ツリーインデックスなどではないため、DBとは異なる性能特性を持つ
▌開始位置が深くなるにつれて、取得に時間がかかるようになる
(deep paging 問題)
▌分散検索をする場合は、分散検索を統合する検索サーバにメモリ上の
オーバヘッドかかり、deep paging問題は深刻。
(Googleにおいても深いページは表示できない)
41Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.

More Related Content

蝉辞濒谤勉强会资料

  • 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. BTC主催 Solr勉強会 1 2 3 4 5自己紹介 高安 厚思 ▌ 活動領域?キーワード ▌ 20年にわたり、ソフトウエアエンジニアリングを適用した システム開発やコンサルティングに携わる。 ▌ 最新技術を適切に利用した、柔軟なシステム構成の構築、 品質管理を中心として技術マネージメントなどを主要テーマとして活動。 ▌ 開発方法論、アーキテクチャ設計コンサルティング、システム全体設計を 得意分野とする。 ▌ 東京電機大学非常勤講師、SQuBOK設計開発領域 検討委員、 ITSS-DS検討委員 ▌資格 ▌ ネットワークスペシャリスト ▌ アプリケーションエンジニア(現 システムアーキテクト) ▌ プロジェクトマネージャ ▌ ITストラテジスト ▌ 情報セキュリティスペシャリスト ▌ MCSE ▌ MCSD 3Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  • 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. BTC主催 Solr勉強会 1 2 3 4 5Solrに関する事例 ▌Solrは2012年から案件で利用 5 マルチメディアコンテンツ販売会社向け コンテンツの検索に利用 特徴として、複数単語による状況によるスコア操作 設定されているフィールドに対する順位付けの後、ページ内で並 べ替えをおこなう 公共図書館における書誌の検索 特徴として、複数単語による状況によるスコア操作 Hadoopによるインデックス作成 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  • 6. BTC主催 Solr勉強会 1 全文検索とは 6Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  • 7. BTC主催 Solr勉強会 1 2 3 4 5全文検索とは ▌単語を検索キーとして、対象の文書を見つけ出す操作 ▌DBでも単語をまとめたテーブルに対してLike検索をすることで 実現可能? 7Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 単語数が増えた場合の性能の問題 (前方一致ならインデックスが使われる場合あり) DBMSに格納する処理、検索する処理を アプリケーションで書く必要がある。 単語にはゆれがある (スペースの有り無し、全角半角、変化など) そのため、DBMSより専用の検索エンジンミドルウェアを利用すべき。 (OracleText、Groongaなどもその対象)
  • 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. BTC主催 Solr勉強会 1 2 3 4 5検索の精度 ▌単語を入力して検索した場合に検索される文書に対して、適切かどう かという意味で精度が重要となる 9Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 正解集合検索結果 重なりあったところが 正しい検索結果の一部 本来検索されないと いけないが検索結果 に含まれない 検索されてはいけな い内容が検索された (=ノイズ) この2つの集合(円)が一致することが理想だが、難しい。 トレードオフになることが多いため、この2つのどちらを優先するかが重要
  • 10. BTC主催 Solr勉強会 1 2 3 4 5再現率と適合率 ▌前頁の内容は学問的に研究されており、検索の精度を表す指標として、 「再現率」と「適合率」がある 10Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 検索結果に含まれた正解集合(個数) 再現率= 正解集合全体(個数) 検索結果に含まれた正解集合(個数) 適合率= 検索結果全体(個数) 前頁と同様に再現率と適合率はトレードオフになることが多いため、 この2つのどちらを優先するかが重要
  • 11. BTC主催 Solr勉強会 1 2 3 4 5日本語の取り扱い ▌日本語の検索は単語の区切りが明確ではなく、転置インデックスを作 成しにくい ▌単語の区切りによって、適合率?再現率が変わるためどのようにする かが検索精度を決定する 11Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 形態素解析 辞書をもとに単語を分類し、単語を分割する (例 東京都?東京、都) Ngram 意味を意識せずに文字で分割する。 (Nの文字のパターンで作る) (例 東京都?東京、京都)
  • 12. BTC主催 Solr勉強会 1 2 3 4 5言葉のゆれへの対応 ▌自然言語を取り扱うため、表現の揺れを意識しないと 再現率が低くなる ▌標準的な表現を決めて、インデックスに格納する ▌インデックス作成、検索時に標準的な表現に変換して利用する 12Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. ? 旧字対応 ? 音便対応 ? 半角?全角 ? 大文字?小文字 ? かな?カタカナ ? 漢字(読み仮名)?送り仮名 ? 略語 ? 動詞変化 ? 単数?複数 ? 検索対象外(助詞等)
  • 13. BTC主催 Solr勉強会 2 Apache Solrとは(30分クッキング) 13Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  • 14. BTC主催 Solr勉強会 1 2 3 4 5 Apache Solrの特徴 Apache Solrとは ▌ApacheのLucenceのサブプロジェクト ▌現状のバージョンは4.10.x ▌Full Javaで実装されており、Webコンテナで動作する ▌HTTPによるリクエストを実現しており、各言語から利用可能 ▌容易に導入できる割にスケールしやすい 14Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  • 15. BTC主催 Solr勉強会 1 2 3 4 5 Apache Solrの特徴 ファセットによる絞り込み ▌検索対象の情報に対して、グループ化して検索条件を絞り込む方法を 「ファセット」と呼ぶ ▌Solrにおいて、ファセットを利用した絞り込みは重要な役割を持つ 15Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. Solrでは、 ? フィールドの値 ? 条件クエリー ? 範囲(数値、日付) 等を元に絞り込みの値及び対象件数を取得できる
  • 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. BTC主催 Solr勉強会 1 2 3 4 5 Apache Solrの特徴 検索単位と分散検索 ▌検索をおこなうスキーマは一つしかもてないが、一つのサーバに対し て、複数の検索集合を作ることができる ▌この検索集合の単位をコアと呼ぶ ▌複数の検索集合を取り扱うサーバ構成をマルチコアと呼ぶ ▌同一のスキーマであれば複数コアに対して検索することが可能 (分散検索) ▌同時アクセス数に対応するために、同一のインデックスをリプリケー ションできる 17Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  • 18. BTC主催 Solr勉強会 Apache Solr30分間クッキング Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 18
  • 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. BTC主催 Solr勉強会 1 2 3 4 5管理コンソールの利用方法 ▌管理コンソールにアクセスする 20Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. http://localhost:8983/solr/ にブラウザでアクセスする。
  • 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. BTC主催 Solr勉強会 1 2 3 4 5一つ目のデモ ▌Wikipediaからタイトルを取得( MediaWiki API) ▌タイトルから記事本文とカテゴリを取得 ▌Solrインデックスを作成 22Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. タイトル クローラ Wikipedia 記事 クローラ タイトル ファイル index この方法は時間がかかるので、あらかじめ作成してある インデックスを利用します。
  • 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. 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. 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. BTC主催 Solr勉強会 3 Apache Solrの中身 Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 26
  • 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. BTC主催 Solr勉強会 1 2 3 4 5クエリーパーサ ▌検索式を解釈するパーサ ▌パーサは3種類ある ▌デフォルトはLuceneパーサ ▌ DisMaxパーサ ▌ EDisMaxパーサ ▌パラメータdefTypeで指定できる ▌検索式の指定の仕方を選択できる 28Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.
  • 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. 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. 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. 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. 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. BTC主催 Solr勉強会 4 Apache Solrを利用するための プログラム(Java編) Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 34
  • 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. 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. BTC主催 Solr勉強会 1 2 3 4 5検索 複雑な場合 ▌検索で複雑なことを考える場合、検索式がどのようになるかを考える 必要がある ▌いきなりプログラムを書くのではなく、管理コンソールを利用して検 索式を検討してから、その検索式をAPI(SolrQuery)で マッピングする ▌検索語の処理については、単純な場合と同様 37Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. ? 開始位置 ? 取得件数 ? ソート順 ? 取得フィールド ? フィルタクエリー ? ファセット ? クエリーパーサ ? ハイライト
  • 38. BTC主催 Solr勉強会 5 Apache Solr利用時のポイント Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 38
  • 39. BTC主催 Solr勉強会 1 2 3 4 5検索の精度を高める ▌検索の精度を高めるために、複数フィールドを組み合わせて 検索をおこなう 39Copyright (C) 2015 Atsushi Takayasu All Rights Reserved. 例)日本語の取り扱いとして、NGramと形態素の2つ のフィールドを利用 例)タイトルと本文のフィールドを利用 例)漢字と読み仮名のフィールドを利用 これらのフィールドの組み合わせとブーストを組み合わせて 検索の精度を高める
  • 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. BTC主催 Solr勉強会 1 2 3 4 5性能特性 ▌転置インデックスがあるため、単語が含まれている文書を 見つける等に性能が良い ▌ツリーインデックスなどではないため、DBとは異なる性能特性を持つ ▌開始位置が深くなるにつれて、取得に時間がかかるようになる (deep paging 問題) ▌分散検索をする場合は、分散検索を統合する検索サーバにメモリ上の オーバヘッドかかり、deep paging問題は深刻。 (Googleにおいても深いページは表示できない) 41Copyright (C) 2015 Atsushi Takayasu All Rights Reserved.

Editor's Notes

  1. 関连ドキュメント取得(惭辞谤别尝颈办别罢丑颈蝉颁辞尘辫辞苍别苍迟)