関口宏司のLuceneブログ

OSS検索ライブラリのLuceneおよびそのサブプロジェクト(Solr/Tika/Mahoutなど)について
<< SOLR-2911 | main | IndexSearcher.close() の削除(4.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) |









http://lucene.jugem.jp/trackback/458
+ Solrによるブログ内検索
+ PROFILE
    123
45678910
11121314151617
18192021222324
252627282930 
<< June 2017 >>
+ 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