関口宏司のLuceneブログ

OSS検索ライブラリのLuceneおよびそのサブプロジェクト(Solr/Tika/Mahoutなど)について
(メモ)コーパス
Luceneのメーリングリストに流れていたので、メモ。

http://www.findbestopensource.com/article-detail/free-large-data-corpus
| 関口宏司 | その他(分類不能) | 20:39 | comments(0) | trackbacks(0) |
KeywordAttribute について
近くの人に質問されたのでそれをネタに簡単に解説。

KeywordAttributeはトークンが「キーワードである」ということを下流のフィルターチェインに伝達するために使われる。

上流のTokenFilterなりTokenizerが任意のトークンのKeywordAttributeのsetKeyword(true)を呼んで「キーワードである」ことの印をつけ、下流のTokenFilterが処理しようとするトークンが「キーワードかどうか」を判断して自分の処理をすべきかどうかをisKeyword()を呼んで決める。

大抵は、lucene-gosenなどのJapaneseKatakanaStemFilterなどのstemmerでisKeyword()が呼ばれ、キーワードでない場合にステミング処理をしよう、という具合に使われる。

たとえば英語のstemmerはある条件下で末尾の"s"を削除するが、これを今は亡きsolrjs(SolrのJavaScriptクライアントAPI)に適用すると、末尾の"s"がとれてsolrjとなってしまい、これは今も健在のSolrのJavaクライアントAPIというまったく別物に変換されてしまう。これではまずいので、「solrjsはキーワードである」と印をつけておけば(setKeyword(true))、これは英語のstemmerで処理されなくなる。

Solrでは、schema.xmlにてKeywordMarkerFilterFactoryを使ってprotectedに「キーワード一覧」を記したファイル名を指定することができる。

なお、通常solrjsはキーワードであると印がつけられていたりするわけではないので、(Luceneが使われている)Apacheのバグチケット管理システムJIRAなどでsolrjsを検索すると、意図しないステミング処理がされてsolrjが多数ヒットしてしまう。これを避けるには、末尾に"*"をつけて"solrjs*"とする。するとLuceneのクエリパーサーの仕様により、ワイルドカード記号がつけられた文字列はAnalyzerをスキップするので、うまく"solrjs"を検索できる。

早くもSolr 3.5に対応したロンウイットのSolrトレーニング・・・Solr 3.5 1月 トレーニング受講者募集中

| 関口宏司 | Luceneクラス解説 | 10:27 | comments(0) | trackbacks(0) |
IndexSearcher.close() の削除(4.0)
Lucene 4.0 でNo-op(空実装)であったIndexSearcherクラスのclose()メソッドが削除された。

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

Lucene 3.5の時点で、IndexSearcherは自らIndexReaderインスタンスを作成して検索する方法がdeprecatedとなっており、プログラマが別途作成したIndexReaderをIndexSearcherのコンストラクタに渡す方法が推奨されていた。同時にこのときの修正でtrunk(4.0)のIndexSearcherから、IndexReaderを引数に取らないコンストラクタが完全に削除された。

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

今回はこれをさらに推し進めた形となった。

早くもSolr 3.5に対応したロンウイットのSolrトレーニング・・・Solr 3.5 1月 トレーニング受講者募集中

| 関口宏司 | Luceneクラス解説 | 11:04 | comments(0) | trackbacks(0) |
FieldValueFilter (3.6)
とにかくそのフィールドに値が入っていたら(インデックスされていたら)OK、というFilterクラス、FieldValueFilterがLucene 3.6/4.0に追加された:

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

使い方は、FieldValueFilterのコンストラクタに調べたい対象フィールド名を渡してFilterオブジェクトを作成し、IndexSearcherのsearch()メソッドに渡せばよい。

プログラム例
public final class TestFieldValueFilter {

  static final String INDEX = "index";
  static final String F_ID = "id";
  static final String F_VALUE = "value";
  static Analyzer analyzer = new WhitespaceAnalyzer(Version.LUCENE_36);
  static Directory dir;

  public static void main(String[] args) throws Exception {
    dir = FSDirectory.open(new File(INDEX));
    makeIndex();
    searchIndex(false);
    searchIndex(true);
  }

  static void makeIndex() throws IOException {
    IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36, analyzer);
    IndexWriter writer = new IndexWriter(dir, config);
    writer.addDocument(doc("one", "value 1"));
    writer.addDocument(doc("zero"));
    writer.addDocument(doc("two", "value 1", "value 2"));
    writer.close();
  }
  
  static Document doc(String id, String... values){
    Document doc = new Document();
    doc.add(new Field(F_ID, id, Store.YES, Index.ANALYZED));
    if(values != null){
      for(String value : values){
        doc.add(new Field(F_VALUE, value, Store.YES, Index.ANALYZED));
      }
    }
    return doc;
  }
  
  static void searchIndex(boolean negate) throws IOException {
    System.out.println("¥n=== negate=" + negate);
    IndexReader reader = IndexReader.open(dir);
    IndexSearcher searcher = new IndexSearcher(reader);
    Filter filter = new FieldValueFilter(F_VALUE, negate);
    TopDocs docs = searcher.search(new MatchAllDocsQuery(), filter, 10);
    for(ScoreDoc scoreDoc : docs.scoreDocs){
      Document doc = searcher.doc(scoreDoc.doc);
      System.out.printf("¥tid=%s¥n", doc.get(F_ID));
    }
    searcher.close();
    reader.close();
  }
}


実行結果
=== negate=false
	id=one
	id=two

=== negate=true
	id=zero


FieldValueFilterのコンストラクタにはboolean型の2つめの引数negateを取るものがあり、上記プログラムではそれを用いている。negateがfalseの場合は値がひとつでもあるものをフィルターを通過させるが、negate=trueの場合は逆の意味となる。



早くもSolr 3.5に対応したロンウイットのSolrトレーニング・・・Solr 3.5 1月 トレーニング受講者募集中

Solr トレーニングコースパンフレットダウンロードはこちら
| 関口宏司 | Luceneクラス解説 | 10:29 | comments(0) | trackbacks(0) |
SOLR-2911
Packt社より書籍 Apache Solr 3 Enterprise Search Server が出版され、著者が現在Solrのホームページに掲載されている以前同社より出版された同じ著者の1.4の本のリンクを新しくして欲しいと、チケットSOLR-2911をオープンした。

それによると、「リンクを新しくしてくれたら、Packt社は売り上げの5%をApache Software Foundationへ寄付する」と書かれており、面白い提案だなあと感心した。
| 関口宏司 | Solr | 08:52 | comments(1) | trackbacks(0) |
Java 7u1 / Java 6u29 の不具合改修の件
先日お知らせしたJava 7の不具合が改修され、Lucene/Solrの動作確認が取れたため、アナウンスメールが流された。ロンウイットのホームページにも掲載したが、前回同様、こちらにも拙訳を掲載する。

Apache Lucene CoreおよびApache Solrユーザーの皆様こんにちは

オラクルは10月19日にJava 7u1 [1]をリリースしました。リリースノートおよびLuceneコミッターによるテスト結果から、7月28日に報告されたすべての不具合は本リリースにより改修されたことを確認しました。したがいまして、Porter StemmerはSIGSEGVによるクラッシュを発生させなくなりました。また、インデックス破壊も検出されませんので、Lucene CoreおよびSolrをJava 7u1上で安全に実行可能です。

同日、オラクルはJava 6u29[2]もリリースしました。Java 6において-XX:+AggressiveOptsまたは-XX:+OptimizeStringConcatのJVMスイッチを使用した際に同じ不具合起こしていたものですが、こちらも改修されました。もちろん、-XX:+AggressiveOptsのような"experimental"なJVMオプションを本番環境で使うべきではありませんけれども!私たちは、すべての人にこの最新バージョン6u29にアップグレードすることをお奨めいたします。

なお、Java 7にアップグレードする際は、インデックスを再作成するようにお願いします。Java 7でリリースされるユニコードのバージョンが変わるため、トークナイズの振る舞いが異なるためです(小文字など)。詳しくは各リリースパッケージのJRE_VERSION_MIGRATION.txtファイルを参照してください!

Apache Lucene/Solr コミッターを代表して、
Uwe Schindler




Solr 3.4なのにSolr 3.5の新機能までわかってしまう、最新情報満載のロンウイットのSolrトレーニング・・・Solr 3.4 11月 トレーニング受講者募集まもなく締め切り!

| 関口宏司 | 不具合関連 | 06:29 | comments(0) | trackbacks(0) |
言語判別機能の追加 (Solr 3.5)
次期Solrバージョン3.5には、言語判別機能が追加される予定である。言語判別機能は、インデックス作成時に呼び出され、あるフィールドが何語で書かれているかを自動判別する機能である。

https://issues.apache.org/jira/browse/SOLR-1979

これにより各ドキュメント/フィールド毎に最適なテキスト解析が行えるようになる。日本語以外のドキュメントを多く扱う企業、たとえばグローバルに事業展開を行っている企業の社内検索等に威力を発揮するだろう。

上記のSOLR-1979では言語判別機能としてApache Tikaの機能を使用している。これよりもサポートしている言語数と判別精度がよさそうな、サイボウズshuyoさん作の言語判別をとりこもうという提案がすでに追加でなされている。

language-detection
http://code.google.com/p/language-detection/

add alternative language detection impl
https://issues.apache.org/jira/browse/SOLR-2839

こちらもSolr 3.5におそらく入るのではないかと思われる。
| 関口宏司 | Solr | 12:26 | comments(1) | trackbacks(0) |
Lucene 10周年記念に向けて
Luceneプロジェクト管理委員会では、10周年記念のプレスリリースを準備中。ついてはユーザーからのtestimonialを募集中である。感謝の意を表明したいユーザー企業からのコメント(短めの(2文程度)英語で)を、コメント者のタイトルとともにロンウイットのお問い合わせページを使ってお寄せいただきたい。締め切りは日本時間で9月22日(木)11時まで。

ランチが付いてますます充実のロンウイットのSolrトレーニング・・・Solr 3.3 10月 トレーニング受講者募集中

| 関口宏司 | Lucene/Solrコミュニティ | 11:16 | comments(0) | trackbacks(0) |
N-gramに最適化されたPhraseQuery (3.5)
NGramPhraseQueryという、n-gram用に最適化されたPhraseQueryの拡張クラスがまもなく追加される。最適化のアイディアはHyper Estraierの平林さんの論文から拝借したものである。

たとえば、2-gramの場合、「ファイル」を検索するとき、PhraseQueryでは「ファ/0」「ァイ/1」「イル/2」を検索するが、次のように作成したNGramPhraseQueryは:

PhraseQuery query = new NGramPhraseQuery(2);
query.add("ファ");
query.add("ァイ");
query.add("イル");


検索するときに自動的に冗長単語を削除する最適化がなされ、「ファ/0」「イル/2」を検索する。これにより、最大50%の検索速度向上が可能となる。なお、NGramPhraseQueryのコンストラクタに渡された引数は、n-gramのn(サイズ)である。

参考:https://issues.apache.org/jira/browse/LUCENE-3426

ランチが付いてますます充実のロンウイットのSolrトレーニング・・・Solr 3.3 10月 トレーニング受講者募集中

| 関口宏司 | Luceneクラス解説 | 09:36 | comments(0) | trackbacks(0) |
第6回Solr勉強会の資料公開
Lucene/Solr 3.2-3.4

Apache ManifoldCF



ランチが付いてますます充実のロンウイットのSolrトレーニング・・・Solr 3.3 10月 トレーニング受講者募集中

Solr トレーニングコースパンフレットダウンロードはこちら
| 関口宏司 | Luceneとは? | 02:41 | comments(1) | trackbacks(0) |
+ Solrによるブログ内検索
+ PROFILE
1234567
891011121314
15161718192021
22232425262728
293031    
<< January 2012 >>
+ LINKS
検索エンジン製品 - 比較のポイント
商用検索エンジンを購入した企業担当者は読まないでください。ショックを受けますから・・・
>>製品比較 10のポイント
+ Lucene&Solrデモ
+ ThinkIT記事
+ RECOMMEND
Apache Solr入門 ―オープンソース全文検索エンジン
Apache Solr入門 ―オープンソース全文検索エンジン (JUGEMレビュー »)
関口 宏司,三部 靖夫,武田 光平,中野 猛,大谷 純
+ RECOMMEND
Lucene in Action
Lucene in Action (JUGEMレビュー »)
Erik Hatcher,Otis Gospodnetic,Mike McCandless
FastVectorHighlighterについて解説記事を寄稿しました。
+ RECOMMEND
+ SELECTED ENTRIES
+ RECENT COMMENTS
+ RECENT TRACKBACK
+ CATEGORIES
+ ARCHIVES
+ MOBILE
qrcode
+ SPONSORED LINKS