<< 3月 2011 | Home | 5月 2011 >>

プレビュー.appのデフォルトの表示方法を設定する方法

MacでPDFを開く際、いつからかデフォルトで2ページ分が横にならんで表示されるようになってしまいました。いつも右クリックして「単一ページ(連続)」に直しているんだけど面倒!


前はデフォルトで「単一ページ」で表示されていたような・・。しかしプレビュー.appの設定画面には表示方法のデフォルトを設定する項目が見つかりません。

そこで、~/Library/Preferences/com.apple.Preview.plist を開いて見たところ、PVPDFDisplayModeというそれっぽいプロパティがありました。
2と設定されているのを何となく1に設定したらビンゴ!


デフォルトで「単一ページ(連続)」になりました

PVPDFDisplayModeは0〜3まで設定できて、その意味は以下のように対応しているようです。
単一ページ: 0
単一ページ(連続): 1
2ページ: 2
2ページ(連続): 3

タグ :
このエントリーをはてなブックマークに追加   

ATOK2011 ベータ版インストール

ジャストシステムからATOK2011ベータ版の案内が来たのでインストールしてみました。
JustSystems | 次期ATOK for Mac 試用ベータ版テスト

Share photos on twitter with Twitpic

変換精度とかどれくらい違いがあるのか分かりませんが、変換候補の表示がちょっとモダン(Twitter for Macっぽい)になってます。
Share photos on twitter with Twitpic

タグ :
このエントリーをはてなブックマークに追加   

追突事故を起こしました - その2

今日はアサイチで先方の保険会社より電話。
「100%こちらの過失なので修理費用は全額負担します。」とのこと。
過失割合で揉めることがなくなったので一安心。
ただ、こちらの過失割合が0の場合は示談交渉を自分でしなければなりません。直すべきところはしっかり主張して気持ちよく修理してもらいたいと思います。


そして夕方、ディーラーによる代車の手配ができたとのことで車を預けにいきました。代車は・・・青のウイングロード。自分の車と同じ車種、同じ色、同じグレード!


気を遣って同じのを手配してくれたのかな???むしろ修理中、別の車を楽しめると期待していたのでちょっとがっかり。

あとはディーラーと保険屋さんの間で修理箇所の調整などしてくれるそうで、修理費をこちらで立て替えたり、保険屋さんに請求したりする必要もないそうです。
楽ですね。

乗り放題!?ヒャッホーと期待していた代車は満タン納車、満タン返しだそうで。まぁ落ち着いて考えればそうですよね・・・

タグ :
このエントリーをはてなブックマークに追加   

追突事故を起こしました

まず、自分、家族ともに怪我は(今のところ)ありません。

車と気分がちょっと凹んだだけです。

凹んだバックドア

舞台は昼下がりの環八。突然自分の車線に割り込んで来た車との衝突を回避するため急ブレーキ、衝突は免れました。
しかし自分のすぐ後ろについていた車がぶつかってしまいました。

幸い衝突の勢いは弱く、乗員がむちうちになることもなく後部バンパーがへこんだだけで済みました。
過失の割合が気になるところですが、追突事故では基本的に後部の車が100%の過失になるとのこと。私は急ブレーキを踏みましたが危険回避のためやむを得ない状況だったので問題なさそうです。
追突事故と過失 | 自動車 交通事故 示談までの道

110番してお巡りさんに来てもらい、お互い連絡先を交換をしてお別れ。保険会社に電話したところ月曜日には担当が決まって折り返し連絡してくれるとのこと。
しかし過失割合が0の場合示談交渉はしてくれないそうです。
示談交渉はやってもらえるのですか? - 自動車保険の見積もりはSBI損保

きっと「アナタは悪くないので先方の保険会社と後はやりとりしてください」となるんでしょうね。

ディーラーに持って行ったところ「詳しく調べないとわからないけど外装の交換だけで済みそう、フレームに歪みは来ていないんじゃないか」とのこと。良かった良かった


膨らんだバンパー


1つ気になるのは先日タイヤ交換に伴いアライメントを調整したばかりなこと。
追突の衝撃でずれてしまったかもしれません。また見て貰わないと・・・。

まぁ、軽微な事故で良かったです。今後の運転はより安全に、気が引き締まることでしょう!


今後万が一のもらい事故に備えてドライブレコーダーを導入ようかと思います。

タグ :
このエントリーをはてなブックマークに追加   

Lucene3.1 メモその7 - 形態素解析をして日本語のドキュメントを検索する

基本その7,形態素解析をして日本語のドキュメントを検索する

基本その6ではCJKAnalyzerを使って検索をしました。CJKAnalyzerはbi-gramと呼ばれるもので、文章を文脈、品詞とは関係なく2文字ずつのトークンに分けてインデックス化するものです。辞書が必要なく、解析が高速な反面インデックスサイズが大きくなってしまうという欠点があります。

辞書を使って品詞を解析するSenという製品があり、それをLuceneで使えるようにしたJapanezeAnalyzerというものがあるのですが、Senがしばらくメンテナンスされていないためなのか、Senがmaven central repositoryに入っていないためかLucene3.1にはJapanezeAnalyzerが含まれていないようです。

そこでちょっと調べてみたところ、Lucene3.0にJapanezeAnalyzerを対応させたプロジェクトが見つかりました。
manabu/Lucene-Japanese-Analyzer - GitHub
このプロジェクトではsenの後継版(?)のGoSenというものを使っているようです。
GoSenではSenで辞書作成にperlを使っていたりした部分を全てpure javaで出来るようにしたりと進化を遂げているようです。残念ながらGoSenはmavenizeされていません。

1. GoSenのダウンロード、ビルド
http://itadaki.svn.sourceforge.net/viewvc/itadaki/GoSen/ より GoSenをダウンロード

$ ant
Buildfile: /Users/yusukey/Downloads/GoSen/build.xml

prepare-directories:

compile:
[javac] /Users/yusukey/Downloads/GoSen/build.xml:39: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
[javac] Compiling 48 source files to /Users/yusukey/Downloads/GoSen/bin

jar:
[jar] Building jar: /Users/yusukey/Downloads/GoSen/gosen-1.0beta.jar


2. GoSenをローカルリポジトリに登録
$ mvn install:install-file -DgroupId=gosen -DartifactId=gosen -Dversion=1.0beta -Dpackaging=jar -Dfile=/Users/yusukey/Downloads/GoSen/gosen-1.0beta.jar 
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'install'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Unnamed - com.github.lucenejapaneseanalyzer:japaneseanalyzer:jar:0.0.1-SNAPSHOT
[INFO] task-segment: [install:install-file] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [install:install-file {execution: default-cli}]
[INFO] Installing /Users/yusukey/Downloads/GoSen/gosen-1.0beta.jar to /Users/yusukey/.m2/repository/gosen/gosen/1.0beta/gosen-1.0beta.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: < 1 second
[INFO] Finished at: Wed Apr 06 13:14:02 JST 2011
[INFO] Final Memory: 4M/81M
[INFO] ------------------------------------------------------------------------


3. 辞書を作成して lucene-examples プロジェクトにコピー
$ cd testdata/dictionary/
$ ant
Buildfile: /Users/yusukey/Downloads/GoSen/testdata/dictionary/build.xml

prepare-proxy:

check-build-status:

download:
[get] Getting: http://chasen.aist-nara.ac.jp/stable/ipadic/ipadic-2.6.0.tar.gz
[get] To: /Users/yusukey/Downloads/GoSen/testdata/dictionary/ipadic-2.6.0.tar.gz

unpack:
[gunzip] Expanding /Users/yusukey/Downloads/GoSen/testdata/dictionary/ipadic-2.6.0.tar.gz to /Users/yusukey/Downloads/GoSen/testdata/dictionary/ipadic-2.6.0.tar
[untar] Expanding: /Users/yusukey/Downloads/GoSen/testdata/dictionary/ipadic-2.6.0.tar into /Users/yusukey/Downloads/GoSen/testdata/dictionary
[delete] Deleting: /Users/yusukey/Downloads/GoSen/testdata/dictionary/ipadic-2.6.0.tar

preprocess:

compile:

BUILD SUCCESSFUL
Total time: 23 seconds

$ cd ..
$ cp dictionary ~/lucene-examples


4. Lucene-Japanese-Analyzer をダウンロードしてビルド、インストール
$ git clone git@github.com:yusuke/Lucene-Japanese-Analyzer.git
$ cd Lucene-Japanese-Analyzer
$ mvn clean install -Dmaven.test.skip=true


ちょっと難しいですがこれでJapaneseAnalyzerを使う準備ができました。
「記者」をちゃんと検索できることが以下のテストケースで確認できます。

    @Test
public void index() throws Exception {
System.setProperty("org.apache.lucene.ja.config.file","japanese-gosen-analyzer.xml");
System.setProperty("sen.home","dictionary");

Directory directory = new RAMDirectory();
// Directory directory = FSDirectory.open(new File("gosenindex"));
Analyzer analyzer = new GoSenAnalyzer();

IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_31, analyzer);
IndexWriter writer = new IndexWriter(directory, iwc);

Document doc = new Document();
doc.add(new Field("str_field", "quick brown fox jumped over the lazy dog.",
Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
Document doc2 = new Document();
doc2.add(new Field("str_field", "貴社の記者が汽車で帰社した",
Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc2);
writer.close();
IndexSearcher searcher = new IndexSearcher(directory, true);
QueryParser parser = new QueryParser(Version.LUCENE_31, "str_field", analyzer);
TopDocs td = searcher.search(parser.parse("記者"), 1000);
assertThat(td.totalHits, is(1));
searcher.close();
directory.close();
}


すぐ試せるmavenベースのソースコードはここに置いてあります。
Lucene3.1、JUnit4.8を使っています。

実行結果はメモその6と変わりませんが、形態素解析をしている分インデックスのサイズがコンパクトになっているはずです。インデックスの中身はLukeというツールを使って確認できるのですが、LukeがまだLucene3.1に対応していないようで、インデックスファイルを開けなかったので今回は見送りです。
Issue 35 - luke - Lucene 3.1 compatible luke version out of the box - Luke - Lucene Index Toolbox - Google Project Hosting

FSDirectoryを使ってファイルにインデックスを書き出した際のサイズをCJKAnalyzerとJapaneseAnalyzerで比べたところ、若干JapanezeAnalyzerの方が小さいことが確認できました。



ちなみに形態素解析ライブラリは商用の製品もあって、Basis Technologyという会社からLucene対応のモジュールが販売されています。一般にあまり聞かない会社かもしれませんが、言語処理ソフトウェアでは恐らく業界シェアNo.1です。
Lucene用Rosette言語処理プラットフォーム

また、JapanezeAnalyzerと同じくMeCab(Senのベースとなっているソフト)ベースのkuromojiというプロジェクトもあります。こちらはmavenizeされているようなのでJapanezeAnalyzerよりも簡単に使えるかもしれません。

関連記事:
Basis Technology: テキスト解析ソフトウェアとデジタルフォレンジック
CJKAnalyzerクラス | 関口宏司のLuceneブログ
Lucene/Solr 3.1 リリース | 関口宏司のLuceneブログ
Lucene用Rosette言語処理プラットフォーム
ATILIKA - Applied Search Innovation
Lucene3.1 メモその1 - ドキュメントのインデックスを作成して検索する - 侍ズム
Lucene3.1 メモその2 - ドキュメントを追加する - 侍ズム
Lucene3.1 メモその3 - ドキュメントを更新する - 侍ズム
Lucene3.1 メモその4 - 検索結果をソートする - 侍ズム
Lucene3.1 メモその5 - 数値型のフィールドを設定する - 侍ズム
Lucene3.1 メモその6 - 日本語のドキュメントを検索する - 侍ズム


タグ :
このエントリーをはてなブックマークに追加   

Lucene3.1 メモその6 - 日本語のドキュメントを検索する

基本その6,日本語の検索

Luceneで日本語を検索するにはsenのJapaneseAnalyzerを使えば良い、という情報を良く見かけます。
が、JapaneseAnalyzerは最近メンテナンスされていないようで、mavenizeもLucene3.1対応も行われていないみたいです。
最後のコミットは2006年でした。

日本語にはとりあえずCJKAnalyzerを使うと良いみたい。CJKAnalyzerはlucene-coreには入っていなくて、lucene-analyzers artifactに入っています。

試してみたらStandardAnalyzerでも一応検索はできました。
本当に「一応」みたい↓
2006年02月22日の記事 | 関口宏司のLuceneブログ

インデックスのサイズは大きくなりそうだけどNGramTokenizerというのを使うとより柔軟に検索できるようになるみたいです。
NGramTokenizerとEdgeNGramTokenFilter | 関口宏司のLuceneブログ

    @Test
public void index() throws Exception {
RAMDirectory directory = new RAMDirectory();
Analyzer analyzer = new CJKAnalyzer(Version.LUCENE_31);

IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_31, analyzer);
IndexWriter writer = new IndexWriter(directory, iwc);

Document doc = new Document();
doc.add(new Field("str_field", "quick brown fox jumped over the lazy dog.",
Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
Document doc2 = new Document();
doc2.add(new Field("str_field", "貴社の記者が汽車で帰社した",
Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc2);
writer.close();
IndexSearcher searcher = new IndexSearcher(directory, true);
QueryParser parser = new QueryParser(Version.LUCENE_31, "str_field", analyzer);
TopDocs td = searcher.search(parser.parse("記者"), 1000);
assertThat(td.totalHits, is(1));
searcher.close();
directory.close();
}


すぐ試せるmavenベースのソースコードはここに置いてあります。
Lucene3.1、JUnit4.8を使っています。

関連記事:
NGramTokenizerとEdgeNGramTokenFilter | 関口宏司のLuceneブログ
Lucene/Solr 3.1 リリース | 関口宏司のLuceneブログ
Lucene3.1 メモその1 - ドキュメントのインデックスを作成して検索する - 侍ズム
Lucene3.1 メモその2 - ドキュメントを追加する - 侍ズム
Lucene3.1 メモその3 - ドキュメントを更新する - 侍ズム
Lucene3.1 メモその4 - 検索結果をソートする - 侍ズム
Lucene3.1 メモその5 - 数値型のフィールドを設定する - 侍ズム
Lucene3.1 メモその7 - 形態素解析をして日本語のドキュメントを検索する - 侍ズム


タグ :
このエントリーをはてなブックマークに追加   

Lucene3.1 メモその5 - 数値型のフィールドを設定する

基本その5,数値型フィールドの保存

Luceneのインデックスは基本的にStringかbyte[]のみを保存するようになっているようです。数値型を保存する場合、String.valueOf(number)で文字列に変換して保存してもいいですが、辞書順にソートすると 1,10,11,2,3,4...などと人間味のない順番になってしまう可能性があります。
そこで数値型を保存する場合はNumericFieldというクラス(Lucene2.9より導入)を使います。

サンプルプログラムでは以下のことをやっています
・メモリ上(RAMDirectory)にインデックスを格納
・それぞれ8,9,10,11の値をもつドキュメントを4つ追加
・ソートキーとなるフィールドを指定して検索
・自然な順番でソートされていることを確認

NumericUtilsというユーティリティクラスを使って数値を文字列、またはその逆に変換しても良いみたいです(NumericFieldの内部でNumericUtilsを使っている)。

    @Test
public void index() throws Exception {
RAMDirectory directory = new RAMDirectory();
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_31);
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_31, analyzer);
IndexWriter writer = new IndexWriter(directory, iwc);

for (int i = 8; i < 12; i++) {
Document doc = new Document();
doc.add(new NumericField("int_field", Field.Store.YES, true).setIntValue(i));
System.out.println(doc);
writer.addDocument(doc);
}
writer.commit();

IndexReader reader = IndexReader.open(writer, true);
IndexSearcher searcher = new IndexSearcher(reader);
TopDocs td = searcher.search(new MatchAllDocsQuery()
, 1000, new Sort(new SortField("int_field", SortField.INT)));
assertThat(td.totalHits, is(4));
assertThat(searcher.doc(td.scoreDocs[0].doc).get("int_field"), equalTo("8"));
assertThat(searcher.doc(td.scoreDocs[1].doc).get("int_field"), equalTo("9"));
assertThat(searcher.doc(td.scoreDocs[2].doc).get("int_field"), equalTo("10"));
assertThat(searcher.doc(td.scoreDocs[3].doc).get("int_field"), equalTo("11"));

reader.close();
writer.close();
searcher.close();
directory.close();
}


すぐ試せるmavenベースのソースコードはここに置いてあります。
Lucene3.1、JUnit4.8を使っています。

関連記事:
Lucene/Solr 3.1 リリース | 関口宏司のLuceneブログ
Lucene3.1 メモその1 - ドキュメントのインデックスを作成して検索する - 侍ズム
Lucene3.1 メモその2 - ドキュメントを追加する - 侍ズム
Lucene3.1 メモその3 - ドキュメントを更新する - 侍ズム
Lucene3.1 メモその4 - 検索結果をソートする - 侍ズム
Lucene3.1 メモその6 - 日本語のドキュメントを検索する - 侍ズム
Lucene3.1 メモその7 - 形態素解析をして日本語のドキュメントを検索する - 侍ズム


タグ :
このエントリーをはてなブックマークに追加   

Lucene3.1 メモその4 - 検索結果をソートする

基本その4,検索結果のソート

以下のことをやります
・メモリ上(RAMDirectory)にインデックスを格納
・ドキュメントを3つ追加
・ソートキーとなるフィールドを指定して検索
・ソートキーとなるフィールドを降順で指定して検索

IndexSearcher#searchにSortFieldを渡すことで検索結果をソートできます。
デフォルトでは昇順のソートになりますが、SortFieldのコンストラクタにbooleanでtrueを渡すことで降順のソートもできます。
今回はインデックスにあるドキュメント全てを取得したかったのでMatchAllDocsQueryというクラスを使いました。特に検索条件を指定しなくてもドキュメントを取り出せるので場合によっては便利です。

    @Test
public void index() throws Exception {
RAMDirectory directory = new RAMDirectory();
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_31);
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_31, analyzer);
IndexWriter writer = new IndexWriter(directory, iwc);

Document doc = new Document();
doc.add(new Field("str_field", "abc",
Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
Document doc2 = new Document();
doc2.add(new Field("str_field", "def",
Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc2);
Document doc3 = new Document();
doc3.add(new Field("str_field", "hij",
Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc3);
writer.commit();

IndexReader reader = IndexReader.open(writer, true);
IndexSearcher searcher = new IndexSearcher(reader);
TopDocs td = searcher.search(new MatchAllDocsQuery()
, 1000, new Sort(new SortField("str_field", SortField.STRING)));
assertThat(td.totalHits, is(3));
System.out.println(searcher.doc(td.scoreDocs[0].doc));
assertThat(searcher.doc(td.scoreDocs[0].doc).get("str_field"), equalTo("abc"));
assertThat(searcher.doc(td.scoreDocs[1].doc).get("str_field"), equalTo("def"));
assertThat(searcher.doc(td.scoreDocs[2].doc).get("str_field"), equalTo("hij"));

td = searcher.search(new MatchAllDocsQuery()
, 1000, new Sort(new SortField("str_field", SortField.STRING, true)));
assertThat(td.totalHits, is(3));
assertThat(searcher.doc(td.scoreDocs[0].doc).get("str_field"), equalTo("hij"));
assertThat(searcher.doc(td.scoreDocs[1].doc).get("str_field"), equalTo("def"));
assertThat(searcher.doc(td.scoreDocs[2].doc).get("str_field"), equalTo("abc"));

reader.close();
writer.close();
searcher.close();
directory.close();
}


すぐ試せるmavenベースのソースコードはここに置いてあります。
Lucene3.1、JUnit4.8を使っています。

関連記事:
Lucene/Solr 3.1 リリース | 関口宏司のLuceneブログ
Lucene3.1 メモその1 - ドキュメントのインデックスを作成して検索する - 侍ズム
Lucene3.1 メモその2 - ドキュメントを追加する - 侍ズム
Lucene3.1 メモその3 - ドキュメントを更新する - 侍ズム
Lucene3.1 メモその5 - 数値型のフィールドを設定する - 侍ズム
Lucene3.1 メモその6 - 日本語のドキュメントを検索する - 侍ズム
Lucene3.1 メモその7 - 形態素解析をして日本語のドキュメントを検索する - 侍ズム



タグ :
このエントリーをはてなブックマークに追加   

Lucene3.1 メモその3 - ドキュメントを更新する

基本その3,ドキュメントの更新

ドキュメントを「更新」というメソッドはなく、「削除→追加」という手順を追うことになります。
ドキュメントを更新するにはupdateDocumentというメソッドを使います。

ただ、一意性制約を付けて同じIDのドキュメントの追加を防ぐようなことはできないので、アプリケーション側で気をつけてドキュメントを更新してあげる必要があります。
今回は"ID"というフィールドを作って、IDフィールドをキーに更新してみました。

サンプルプログラムでは下のことをやっています
・メモリ上(RAMDirectory)にインデックスを格納
・英語ドキュメントを1つ追加
・IDを指定してドキュメントを更新
・当初のドキュメントがヒットしないことを確認
・更新した方のドキュメントがヒットすることを確認

    @Test
public void index() throws Exception {
RAMDirectory directory = new RAMDirectory();
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_31);
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_31, analyzer);
IndexWriter writer = new IndexWriter(directory, iwc);

Document doc = new Document();
doc.add(new Field("id", "001",
Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.add(new Field("str_field", "quick brown fox jumped over the lazy dog.",
Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
writer.commit();
IndexReader reader = IndexReader.open(writer, true);
IndexSearcher searcher = new IndexSearcher(reader);
QueryParser parser = new QueryParser(Version.LUCENE_31, "str_field", analyzer);
TopDocs td = searcher.search(parser.parse("fox"), 1000);
assertThat(td.totalHits, is(1));

Document doc2 = new Document();
doc.add(new Field("id", "001",
Field.Store.YES, Field.Index.NOT_ANALYZED));
doc2.add(new Field("str_field", "quick brown fox jumped over the lazy whale.",
Field.Store.YES, Field.Index.ANALYZED));
writer.updateDocument(new Term("id", "001"),doc2);
writer.commit();

searcher.close();
reader = reader.reopen();
searcher = new IndexSearcher(reader);

td = searcher.search(parser.parse("dog"), 1000);
assertThat(td.totalHits, is(0));
td = searcher.search(parser.parse("whale"), 1000);
assertThat(td.totalHits, is(1));

writer.close();
searcher.close();
directory.close();
}


すぐ試せるmavenベースのソースコードはここに置いてあります。
Lucene3.1、JUnit4.8を使っています。

関連記事:
Lucene/Solr 3.1 リリース | 関口宏司のLuceneブログ
Lucene3.1 メモその1 - ドキュメントのインデックスを作成して検索する - 侍ズム
Lucene3.1 メモその2 - ドキュメントを追加する - 侍ズム
Lucene3.1 メモその4 - 検索結果をソートする - 侍ズム
Lucene3.1 メモその5 - 数値型のフィールドを設定する - 侍ズム
Lucene3.1 メモその6 - 日本語のドキュメントを検索する - 侍ズム
Lucene3.1 メモその7 - 形態素解析をして日本語のドキュメントを検索する - 侍ズム


タグ :
このエントリーをはてなブックマークに追加   

Lucene3.1 メモその2 - ドキュメントを追加する

基本その2,ドキュメントの追加

以下のことをやります
・メモリ上(RAMDirectory)にインデックスを格納
・英語ドキュメントを1つ追加
・検索すると1件ヒットすることを確認
・もう1つドキュメントを追加
・検索すると1件しかヒットしないことを確認
・IndexReaderをリオープンし、再度検索し、ドキュメントが2件ヒットすることを確認

つまり、IndexWriter.addDocument()/commit()してもすぐには検索可能になりません。IndexReaderを作り直すか、リオープンしてIndexSearcherを作り直すことで検索可能になります。

    @Test
public void index() throws Exception {
RAMDirectory directory = new RAMDirectory();
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_31);
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_31, analyzer);
IndexWriter writer = new IndexWriter(directory, iwc);

Document doc = new Document();
doc.add(new Field("str_field", "quick brown fox jumped over the lazy dog.",
Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
writer.commit();
IndexReader reader = IndexReader.open(writer, true);
IndexSearcher searcher = new IndexSearcher(reader);
QueryParser parser = new QueryParser(Version.LUCENE_31, "str_field", analyzer);
TopDocs td = searcher.search(parser.parse("fox"), 1000);
assertThat(td.totalHits, is(1));

Document doc2 = new Document();
doc2.add(new Field("str_field", "quick brown dog jumped over the lazy fox.",
Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc2);
writer.commit();

td = searcher.search(parser.parse("fox"), 1000);
assertThat(td.totalHits, is(1));

searcher.close();
reader = reader.reopen();
searcher = new IndexSearcher(reader);

td = searcher.search(parser.parse("fox"), 1000);
assertThat(td.totalHits, is(2));

writer.close();
searcher.close();
directory.close();
}


すぐ試せるmavenベースのソースコードはここに置いてあります。
Lucene3.1、JUnit4.8を使っています。

関連記事:
Lucene/Solr 3.1 リリース | 関口宏司のLuceneブログ
Lucene3.1 メモその1 - ドキュメントのインデックスを作成して検索する - 侍ズム
Lucene3.1 メモその3 - ドキュメントを更新する - 侍ズム
Lucene3.1 メモその4 - 検索結果をソートする - 侍ズム
Lucene3.1 メモその5 - 数値型のフィールドを設定する - 侍ズム
Lucene3.1 メモその6 - 日本語のドキュメントを検索する - 侍ズム
Lucene3.1 メモその7 - 形態素解析をして日本語のドキュメントを検索する - 侍ズム


タグ :
このエントリーをはてなブックマークに追加   

Lucene3.1 メモその1 - ドキュメントのインデックスを作成して検索する

最近Luceneを触っています。
Luceneについて大抵のことはLucene入門に書いてあるけれども非推奨になっているAPIも結構あります。
そこで最新のLucene3.1で警告なしにコンパイルが通るサンプルプログラムをちょこちょこ掲載していきたいと思います。

まず最初は基本中の基本、インデックス作成と検索。
以下のことをやるプログラムです。
・メモリ上(RAMDirectory)にインデックスを格納
・英語と日本語のドキュメント2つ分のインデックスを作成
→ Document オブジェクトにaddメソッドで検索対象のフィールドを追加していく
→ Luceneにインデックスだけでなく値を保存しておきたいときはFieldのコンストラクタにField.Store.YESを指定する
→ フィールドを解析(トークナイズ)しておきたい場合はField.Index.ANALYZEDを指定する
・英単語で検索、1件ヒットする
→ IndexSearcherのsearchメソッドで検索、TopDocsオブジェクトが返る
→ TopDocsオブジェクトにはヒットしたドキュメントの件数や、ドキュメントのIDが格納されている
→ ドキュメント自体を取り出すにはIndexSearcher.doc(int)を使う

    @Test
public void index() throws Exception {
RAMDirectory directory = new RAMDirectory();
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_31);
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_31, analyzer);
IndexWriter writer = new IndexWriter(directory, iwc);

Document doc = new Document();
doc.add(new Field("str_field", "quick brown fox jumped over the lazy dog.",
Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
Document doc2 = new Document();
doc2.add(new Field("str_field", "貴社の記者が汽車で帰社した",
Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc2);
writer.close();
IndexSearcher searcher = new IndexSearcher(directory, true);
QueryParser parser = new QueryParser(Version.LUCENE_31, "str_field", analyzer);
TopDocs td = searcher.search(parser.parse("fox"), 1000);
assertThat(td.totalHits, is(1));
Document doc3 = searcher.doc(td.scoreDocs[0].doc);
assertEquals("quick brown fox jumped over the lazy dog.", doc3.get("str_field"));
searcher.close();
directory.close();
}


すぐ試せるmavenベースになってるソースコードはここに置いてあります。
Lucene3.1、JUnit4.8を使っています。

関連記事:
Lucene/Solr 3.1 リリース | 関口宏司のLuceneブログ
Lucene3.1 メモその2 - ドキュメントを追加する - 侍ズム
Lucene3.1 メモその3 - ドキュメントを更新する - 侍ズム
Lucene3.1 メモその4 - 検索結果をソートする - 侍ズム
Lucene3.1 メモその5 - 数値型のフィールドを設定する - 侍ズム
Lucene3.1 メモその6 - 日本語のドキュメントを検索する - 侍ズム
Lucene3.1 メモその7 - 形態素解析をして日本語のドキュメントを検索する - 侍ズム


タグ :
このエントリーをはてなブックマークに追加