関口宏司のLuceneブログ

OSS検索ライブラリのLuceneおよびそのサブプロジェクト(Solr/Tika/Mahoutなど)について
<< NGramTokenizerとEdgeNGramTokenFilter | main | QueryParserでMatchAllDocsQueryを使う >>
WildcardTermEnumを使う
Luceneのインデックスにはフィールドごとに整理された単語帳がある。単語帳の単語はソートされた状態で格納されており、TermEnumを使ってその中の単語を列挙することができる。

次のプログラムは「通」という単語から開始してTermを列挙する例である:



private static void testTermEnum( IndexReader reader ) throws IOException{
TermEnum terms = reader.terms( new Term( F, "通" ) );
do {
Term term = terms.term();
if( !term.field().equals( F ) ) break;
System.out.print( "[" + term.text() + "] " );
}while( terms.next() );
terms.close();
}



TermEnumはTerm(=フィールド名+フィールド値)を列挙するものであるから、ループをまわしていくとTermがいつの間にか目的外のフィールドを指していることがありえるので、赤字の判定行が必要となる。

このプログラムをあるインデックスに対して実行すると、次のような出力が得られる:



[通] [通じる] [通す] [通ずる] [通り] [通り抜ける] [通り越す] [通る] [通れる] [通
代] [通例] [通信] [通則] [通力] [通勤] [通告] [通商] [通学] [通帳] [通常] [通気]
[通産省] [通用] [通知] [通称] [通算] [通訳] [通話] [通販] [通販生活] [通過] [通
達] [通関] [通電] [逝く] [逞しい] [速] [速い] [速める] [速やか] [速度] [速達]
...
...



上記のように「通」から始まり、単語帳の指定フィールドの単語が尽きるまでTermが列挙されるのがわかる。

ここでTermEnumの代わりにWildcardTermEnumを使うと「通」で開始する単語だけを列挙することが可能となる。

WildcardTermEnumは、次のように使う:



TermEnum terms = new WildcardTermEnum( reader, new Term( F, "通*" ) );



このときの出力は、次のようになる:



[通] [通じる] [通す] [通ずる] [通り] [通り抜ける] [通り越す] [通る] [通れる] [通
代] [通例] [通信] [通則] [通力] [通勤] [通告] [通商] [通学] [通帳] [通常] [通気]
[通産省] [通用] [通知] [通称] [通算] [通訳] [通話] [通販] [通販生活] [通過] [通
達] [通関] [通電]



「前方一致」だけでなく、「後方一致」も指定可能だ:



TermEnum terms = new WildcardTermEnum( reader, new Term( F, "*しい" ) );



このときの出力は、次のようになる:



[あしい] [あたらしい] [いやしい] [うれしい] [おいしい] [おかしい] [おしい] [おと
なしい] [お忙しい] [かわいらしい] [きびしい] [くわしい] [すばらしい] [ただしい]
[なつかしい] [なまめかしい] [ばかばかしい] [ふさわしい] [ほしい] [みずみずしい]
[むずかしい] [もどかしい] [やさしい] [ややこしい] [よろしい] [らしい] [わざとら
しい] [わずらわしい] [久しい] [乏しい] [優しい] [危なっかしい] [厳しい] [古めか
しい] [可愛らしい] [嘆かわしい] [好ましい] [妖しい] [嬉しい] [宜しい] [寂しい] [
心苦しい] [忙しい] [思しい] [怪しい] [恐ろしい] [恥ずかしい] [悔しい] [悪しい] [
悲しい] [惜しい] [愉しい] [愛らしい] [慌ただしい] [懐かしい] [新しい] [望ましい]
[楽しい] [欲しい] [正しい] [気難しい] [淋しい] [清々しい] [激しい] [煩わしい] [
珍しい] [瑞々しい] [生々しい] [生生しい] [痛々しい] [目覚しい] [相応しい] [等し
い] [紛らわしい] [素晴らしい] [美しい] [美味しい] [芳しい] [苦しい] [荒々しい] [
著しい] [見苦しい] [規則正しい] [詳しい] [輝かしい] [逞しい] [重々しい] [難しい]
[頼もしい] [馬鹿らしい] [騒々しい] [騒がしい]


| 関口宏司 | Lucene自由自在 | 12:20 | comments(0) | trackbacks(0) |









http://lucene.jugem.jp/trackback/139
+ Solrによるブログ内検索
+ PROFILE
  12345
6789101112
13141516171819
20212223242526
2728293031  
<< May 2018 >>
+ 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