FastVectorHighlighterとSynonymFilter

Solrで、SynonymFilterを使ってクエリ時にキーワード展開を試してみた。
ところが、検索結果のスニペットがSolrから空っぽでかえってくる。


調査してみると、以下の条件で問題が起こる。

  • CJKTokenizerなどのN-Gramトークンを使っている
  • SynonymFilterの設定でexpand属性をtrueにしている
  • SynonymFilterをクエリ時に指定している
  • 双方向展開( => ではなくて カンマで区切って互いに展開する)を指定しているキーワードで検索する
  • 旧HighliterではなくFastVectorHighlighterを利用している


solr-userで質問したところ、以下が原因ではないかと教えていただいた。

  • クエリ時にキーワード展開を行うと、MultiPhraseQueryが生成される
  • MultiPhraseQueryにFastVectorHighlighterは対応していない

これを受けて、これで解決した。

  • SynonymFilterのキーワード展開をクエリ時ではなくインデックス時に行うように設定

本当はシノニムの設定を変更したらすぐに反映したかったので、
クエリ時にしたかったのだが、仕方がない。

MultiPhraseQueryにFVHが対応していない件は以下のissueでopenされている。

https://issues.apache.org/jira/browse/LUCENE-1889


あとで、MultiPhraseQueryでFVHしようとしたらwarningするようにpatchを書こう。

第77回東京優駿

ダノンシャンティの取り消しで5連勝の皐月賞馬に東京コース向きの末脚を見せ続けてきたペルーサの一騎打ちムード。ここから穴を探すなら東京向きの適性を隠し持っている組。

それならレーヴドリアンはまさに東京コースが生きる馬。きさらぎ賞と前走京都新聞杯はスローで脚を余した結果、皐月賞は後方待機からおもいきり外を回して大きなコースロス。ゆっくり捌ける東京コースなら坂上で末を爆発させて食い込み可能だ。展開はコスモファントムハンソデバンドがスローには落としたくないはずで、脚を余すことも無いだろう。

相手はペルーサが本線。青葉賞の時計云々よりも、坂から飛んで行ってしまいそうなフットワークが良い。速い流れも若葉ステークスで経験し、全体の時計勝負になっても問題ない。

皐月賞ヴィクトワールピサ皐月賞がうまくいった競馬で、あれ以上の競馬をできる可能性よりはできない可能性に賭ける馬券。

レーヴドリアン
ペルーサ
▲リルダヴァル
ルーラーシップ
アリゼオ
ハンソデバンド
ヒルノダムール
×ヴィクトワールピサ
×ローズキングダム
×ゲシュタルト
×トゥザグローリー

レーヴドリアンの単複に馬連馬単が勝負馬券。ヴィクトワールピサが飛んだときのための◎○▲ー◎○▲ーそれ以外の3連複あたり。

Apache Solrのログをlogback経由で出力する

SolrのログはTomcatにデプロイするとcatalina.outに出てくるんだけど、それがJDK logging経由なのでえらくフォーマットやローテーションが難しい。Solrは1.4からslf4jをloggingのinterfaceに利用しているので、logbackに実装を変更することも簡単のはずなのでやってみた

  • Solrをダウンロードして展開する
$ tar xvzf apache-solr-1.4.0.tgz
  • logback,slf4jもダウンロードして展開する
$ wget http://logback.qos.ch/dist/logback-0.9.20.tar.gz
$ tar xvzf logback-0.9.20.tar.gz

$ rm -rf slf4j-1.5.11
$ wget http://www.slf4j.org/dist/slf4j-1.5.11.tar.gz
$ tar xvzf slf4j-1.5.11.tar.gz
  • 必要なライブラリをSolrにコピー
$ rm apache-solr-1.4.0/lib/slf4j-api-1.5.5.jar
$ rm apache-solr-1.4.0/lib/slf4j-jdk14-1.5.5.jar
$ cp -p slf4j-1.5.11/slf4j-api-1.5.11.jar apache-solr-1.4.0/lib/
$ cp -p slf4j-1.5.11/slf4j-jdk14-1.5.11.jar apache-solr-1.4.0/lib/
$ cp -p logback-0.9.20/logback-classic-0.9.20.jar apache-solr-1.4.0/lib/
$ cp -p logback-0.9.20/logback-core-0.9.20.jar apache-solr-1.4.0/lib/
$ mkdir apache-solr-1.4.0/src/webapp/web/WEB-INF/classes
$ cat > apache-solr-1.4.0/src/webapp/web/WEB-INF/classes/logback.xml <<_EOF_
 <configuration>
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>/var/logs/solr.log</file>
    <append>true</append>
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
  </appender>
 
  <root level="debug">
    <appender-ref ref="FILE" />
  </root>
 </configuration>
_EOF_
  • solrをビルド
$ cd apache-solr-1.4.0
$ ant dist     #jarのダウンロードにproxyが必要な場合は "-Dproxy.host=... -Dproxy.port=..."を設定する
  • できたwarをTomcatにデプロイ

これでsolrを動かしてみると、/var/logs/solr.logにログが出るはず。

webを支える技術

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

広く使われている技術なんだけど、基礎部分が理解されていない技術の一つがhttpなんだなあと思った。
あと、基礎技術を教科書教科書しない感じで説明しているのがこの本なんだなあと思った。

技術の勉強方法として

  1. 原典
  2. 実装

っていう順番はあると思うのだけど、現実的にその順番だと原典の時点で疲れちゃう。だいたい長くて重い感じだから。

だからといって実装ばかりで理論的裏付けがなにもないのはきっとまずい。httpもRDBMSもそうなっている感じがする。httpが何かはわからないけどAjaxは書けますよとか、301の意味が分からないけどリダイレクトはいつも実装しているとか、ちょっと違うけどそんな感じ。

原典の代替、もしくは原典へのポインタを見つけるための入り口みたいな、大きな役割を果たせる本だと思う。

データベーススペシャリスト受験

必ず皐月賞と日程が被る春の情報処理技術者試験。この日に試験を受けることはないだろうと昔は思っていたけど、今年は受けました。科目はデータベーススペシャリスト。しばらくblogを書いてなかったのは育児に加えてこの試験の勉強をしてたのが理由でした。

色々おもしろかったけど、以下がきちんと理解できたのは収穫かな。

  • 正規化とは何か
  • 正規化が崩れたときにどんな問題がおきるのか
  • 第4、第5、BC正規化の必要なとき

設計した根拠を人に説明するときにこれ理解してないと困る。説明できないってことは自分でも設計の妥当性を理解できてないってことでもある。

自分的にはこの後RDBMSが廃れることはないと思う(実装は色々変わるだろうけど)ので、RDBMS扱う人はみんな受けるといいと思うよ。すくなくともOracleMaster受ける前にこれ受けた方がいいと思うよ!そうでないとむちゃくちゃなテーブル設計をチューニングで逃げる状況は変わらないし、バックアップとかリカバリとかは詳しいのにテーブルがSQLが打てないとかそういう人ばっかりになっちゃうよ!