はてなの日記データを全文検索

Solr のテストを兼ねて、はてなの日記データからインデックスを作成してみる。

http://d.hatena.ne.jp/knaka20blue/20080813/1218615351
を参考にしてみる。

Solr で使うフィールドは、

  • URL
  • 日付
  • 本文

あたりかな?

schema.xml を用意。

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="okinaka" varsion="1.1">
  <types>
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
    <fieldType name="date" class="solr.DateField" sortMissingLast="true" omitNorms="true"/>
    <fieldType name="text_cjk" class="solr.TextField">
      <analyzer>
        <tokenizer class="solr.CJKTokenizerFactory"/>
      </analyzer>
    </fieldType>
  </types>

  <fields>
    <field name="url" type="string" indexed="true" sorted="true" />
    <field name="date" type="date"/>
    <field name="body" type="text_cjk" indexed="true" sorted="true" />
  </fields>

  <uniqueKey>url</uniqueKey>

  <defaultSearchField>body</defaultSearchField>

  <solrQueryParser defaultOperator="OR" />
</schema>

Ruby で、日記を solr 用のデータに変換してみる。

require "rexml/document"

filename='okinaka.xml'
base_url = 'http://d.hatena.ne.jp/okinaka/'

src = nil
File.open(filename) { |fp|
    src = REXML::Document.new fp
}
out = REXML::Document.new
out << REXML::XMLDecl.new('1.0', 'UTF-8')


add = out.add_element('add');
src.elements['diary'].each {|e|
    next unless e.kind_of? REXML::Element
    doc = add.add_element('doc');
    doc.add_element('field', {'name' => 'url'}).add_text base_url + e.attributes['date'].tr('-', '')
    doc.add_element('field', {'name' => 'date'}).add_text e.attributes['date'] + 'T09:00:00Z'
    doc.add_element('field', {'name' => 'body'}).add_text e.elements['body'].text
}

out.write STDOUT

一応動いたけど・・・。日本語で検索がうまくいかない・・・。