LuceneはJavaインターフェイスなのに対して、SolrはJSON over HTTP
ドキュメントの重みづけはLucene/Solr V6からOkapi BM25
スキーマは、フィールドとフィールドタイプ(数値、文字列、日付)を指定する。フィールドは非テキスト系とテキスト系に分かれる。非テキスト系には、製品名、ジャンルなど単語分割が必要ない文字列が含まれる。テキスト系はAnalyzerの指定が必要。
Analyserは、文字フィルタ、トークナイザ、トークンフィルタを指定する。
文字フィルター:例えば、文字フィルタで半角カタカナを全角カタカナに変換してからトークナイザに渡す。MappingCharFilterFactory, ICUNormalizer2CharFilterFactory, PatternReplaceCharFilterFactory, HTMLStripCharFilterFactory
トークナイザ:JapaneseTokeniserFactoryは、kuromojiを利用する。kuromojiは20万語の辞書をもつ。ユーザ辞書の定義も可能。トークナイザの出力であるトークンには位置情報(文字が隣接しているかなど)、文書内オフセット情報も持つ。タームは文字列情報のみで、転置インデックスを参照する単位である。出力されるトークンはトークナイザ依存。他にWhiteSpaceTokunizerFactory, StandardTokunizerFactory(日本語以外), NGramTokunizerFactoryがある。
トークンフィルター:日本語のトークンフィルターには、JapaneseBaseFormFilterFactory(活用する品詞を語幹形にする)、JapanesePartOfSpeechStopFilterFactory(助詞や記号を除去する)、StopFilterFactory(日本語では、「です」「ます」「あの」「その」など)、CJKWidthFilterFactory(半角カタカナを全角に)、JapaneseKatakanaStemFilterFactory(長音記号の表記揺れを吸収する)、LowerCaseFilterFactory(ASCII大文字を小文字に)、SynonymFilterFactory(シノニム辞書を使う)
検索結果の処理:ソート(スコアによる、特定フィールドによる)、ハイライト、絞り込み、ファセット(フィールド毎のグルーピング)
ドキュメントの追加、削除、コミットあるいはオプティマイズをJSONコマンドによるバッチ処理、XMLデータによるバッチ処理の両方でできる。コミットはインデックスの更新を確定して検索結果に反映する操作。
インデクシング前処理:正規表現による文字列置換、スクリプト(JavaScriptなど)で記述した前処理をする、デフォルト値の設定、時間に「NOW」を設定、UUID、フィールドの追加、sourceからdestへのコピー、multivalueの値の連結、同件数カウント、文字列長カウント、言語判定と言語別フィールドへの切分け、値が最大のフィールド値、同最小フィールド値、HTMLタグを取り除く、指定のパターン無視、空文字削除、値の両端をトリム、最大文字列でカット、ハッシュ計算で同一ハッシュ値を登録しない、フィールドの重複値を除く、URLの特徴を抽出
PDF、Word文書などバイナリ形式のデータを登録する。Apache TikaからApache PDFbox、Apache POIを呼び出す。
クエリパーサはユーザが入力した検索キーワードの文字列をSolrが解釈できる構造に変換する。
Lucentクエリパーサ(標準クエリ):論理演算(AND,OR,NOT)、フレーズ検索(複数の単語の出現順序を保証する)、ワイルドカード検索、あいまい検索(検索語に距離が近い語を検索する)、近傍検索(指定した複数の単語が近くに出現するドキュメントを検索する)、正規表現による検索、範囲検索、単語の重み付け、定数スコア
語の距離:Levenshtein距離アルゴリズム
複数のフィールドをまたがるクエリ、日付型演算
ハイライト:スニペットと検索語の強調を行うハイライタ
ファセット:フィールドの値でグループ化して、グループ別の件数などを検索する。
サーチハンドラに、サーチコンポーネントが登録される。solarconfig.xmlに設定。
空間検索:地図情報は持っていない。ドキュメントで経度・緯度を登録する。境界ボックスや円で検索とフィルタリングする、経度・緯度などの形状情報、地点間・矩形間の距離でソートまたはブースト。地球を完全な球体として距離を計算する。
ファンクションクエリ:フィールドの値を検索結果のスコアに反映する
検索するとき、トークナイズされたトークンをフレーズとして扱うかどうか(オプション)。例:検索エンジンで検索するとき、「検索」と「エンジン」にトークナイズする。フレーズとして扱わないときは「検索」または「エンジン」でヒットした文書を返す。フレーズとして扱うときは、「検索」の次に「エンジン」が来る文書を返す。
検索精度
適合率=(検索された文書中の適合文書数)/(検索された文書数)
再現率=(検索された文書中の適合文書数)/(適合文書数)
適合率と再現率はトレードオフなので、F値=両者の調和平均を見る。
ランキング
キーワードと文書の類似度:TFIDFSimilarity, BM25Similarity