Lucene入门与使用(2)
2008-04-07 17:35
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++) {
      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);
      IndexXML.deleteIndex(idStr, reader);
      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进行简单的入门说明。

参考资料:
1. Overview (Lucene 1.4-final API)
2. 车东 《在应用中加入全文检索功能--基于JAVA的全文索引引擎Lucene简介》

posted on 2008-04-17 21:42  goooto  阅读(305)  评论(0编辑  收藏  举报