小桥

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
     Field的几种接口:

Name

Stored

Indexed

Tokenized

use

Keyword(String name,

        String value)

Y

Y

N

date,url

Text(String name, Reader value)

N

Y

Y

short text fields:

title,subject

Text(String name, String value)

Y

Y

Y

longer text fields,

like “body”

UnIndexed(String name,

String value)

Y

N

N

UnStored(String name,

         String value)

N

Y

Y

 


5. 利用Lucene进行检索


5.1 一段简单的检索代码

 

    //需要捕捉IOException,ParseException异常
    //处理检索条件
    Query query = QueryParser.parse("入门", "text", analyzer);

    //检索
    Searcher searcher = new IndexSearcher("./index");//"index"指定索引文件位置
    Hits hits = searcher.search(query);

    //打印结果值集
    for (int i = 0; i < hits.length(); i++) {
      Document doc = hits.doc(i);
      String id = doc.get("id");
      System.out.println("found " + "入门" + " on the id:" + id);
    }

 

5.2 利用Lucene的检索接口


5.2.1 Query与QueryParser


        主要使用方法:
QueryParser .parse(String query, String field, Analyzer analyzer),例如:
Query query = QueryParser.parse("入门", "text", analyzer);
"入门"为检索词, "text"为检索的字段名, analyzer为分析器


5.2.2 Hits与Searcher


       Hits的主要使用接口:
 

接口名

备注

Doc(int n)

返回第n个的文档的所有字段

length()

返回这个集中的可用个数

 


6. Lucene的其他使用


6.1 Lucene 的索引修改


        下面给出一段修改索引的代码,请根据Lucene的API解读:


  /**
   * 对已有的索引添加新的一条索引
   * @param idStr String:要修改的id
   * @param doc Document:要修改的值
   */
  public void addIndex(String idStr, String valueStr) {
    StandardAnalyzer analyzer = new StandardAnalyzer();
    IndexWriter writer = null;
    try {
      writer = new IndexWriter(indexPath, analyzer, false);
      writer.mergeFactor = 2; //修正lucene 1.4.2 bug,否则不能正确反映修改

      Document doc = new Document();
      doc.add(Field.UnIndexed("id", idStr));//“id”为字段名,“1”为字段值
      doc.add(Field.Text("text", valueStr));
      writer.addDocument(doc);

      writer.optimize();
      writer.close();
    }
    catch (IOException ioe) {
      ioe.printStackTrace();
    }
  }

  /**
   * 删除索引
   *
   * @param idStr String
   */
  public void deleteIndex(String idStr) {
    try {
      Directory dirt = FSDirectory.getDirectory(indexPath, false);
      IndexReader reader = IndexReader.open(dirt);
      Term term = new Term("text", idStr);
      reader.delete(term);
      reader.close();
      dirt.close();
    }
    catch (IOException ioe) {
      ioe.printStackTrace();
    }
  }


6.2 Lucene 的检索结果排序


        Lucene的排序主要是对org.apache.lucene.search.Sort的使用。Sort可以直接根据字段Field生成,也可以根据标准的SortField生成,但是作为Sort的字段,必须符合以下的条件:唯一值以及Indexed。可以对Integers, Floats, Strings三种类型排序。
        对整数型的ID检索结果排序只要进行以下的简单操作:

 Sort sort = new Sort("id");
 Hits hits = searcher.search(query, sort);

       用户还可以根据自己定义更加复杂的排序,详细请参考API。


7 总结


        Lucene给java的全文索引检索带来了非常强大的力量,以上仅对Lucene进行简单的入门说明。

posted on 2005-05-12 19:31  小桥  阅读(1029)  评论(0编辑  收藏  举报