`

lucene 3.0.0 简单入门

阅读更多
官方例子:http://lucene.apache.org/java/3_0_0/api/demo/index.html
官方网站:http://lucene.apache.org
概念理解:http://www.ibm.com/developerworks/cn/java/j-lo-lucene1/ 这里更多的是概念,一些接口对于3.0.0已经不适用了。
老外的一个网站,英文基本比较浅显易懂:http://www.lucenetutorial.com

需要的jar包:
lucene-core-3.0.0.jar   --lucene核心包
lucene-smartcn-3.0.0.jar  ---中文分词库,你也可以选择其他的分词jar包

实际例子:TxtFileIndexer .java,这里懒得再写个搜索类了,索引的生成和搜索都放在同一个地方了。

 /**
 *
 */
package com.spell;

import java.io.File;
import java.io.FileReader;
import java.io.Reader;
import java.util.Date;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;

public class TxtFileIndexer {
 public static void main(String[] args) throws Exception {
  // 这里先执行索引的建立,当然生产环境下是有自己的索引生成策略的
  createIndexes();

  // 执行搜索
  search("修改");
 }

 public static void createIndexes() throws Exception {
  // 索引文件的存放文件夹
  String index_path = "E:" + File.separator + "lucene" + File.separator
    + "index";

  // 要索引文件的文件夹
  String doc_path = "E:" + File.separator + "lucene" + File.separator
    + "doc";

  File INDEX_DIR = new File(index_path);
  // 保存在硬盘,也可以选择存放在内存中的
  Directory dir = new SimpleFSDirectory(INDEX_DIR);
  File doc_dir = new File(doc_path);
  // 用智能的中文词库分析器
  Analyzer luceneAnalyzer = new SmartChineseAnalyzer(
    Version.LUCENE_CURRENT);
  File[] dataFiles = doc_dir.listFiles();
  // 索引writer
  IndexWriter indexWriter = new IndexWriter(dir, luceneAnalyzer, true,
    IndexWriter.MaxFieldLength.UNLIMITED);
  long startTime = new Date().getTime();
  for (int i = 0; i < dataFiles.length; i++) {
   if (dataFiles[i].isFile()
     && dataFiles[i].getName().endsWith(".txt")) {
    System.out.println("Indexing file "
      + dataFiles[i].getCanonicalPath());
    Document document = new Document();
    Reader txtReader = new FileReader(dataFiles[i]);
    // Field .Text("path", dataFiles[i].getCanonicalPath())
    document.add(new Field("path", dataFiles[i].getCanonicalPath(),
      Field.Store.YES, Field.Index.NOT_ANALYZED));
    document.add(new Field("contents", txtReader));
    // 索引添加Document
    indexWriter.addDocument(document);
   }
  }
  indexWriter.optimize();
  indexWriter.close();
  long endTime = new Date().getTime();

  System.out.println("It takes " + (endTime - startTime)
    + " milliseconds to create index for the files in directory "
    + doc_dir.getPath());
 }

 public static void search(String searchStr) throws Exception {
  System.out.println("=====搜索的关键字是:" + searchStr);
  // 索引文件的存放路径
  String index_path = "E:" + File.separator + "lucene" + File.separator
    + "index";
  File INDEX_DIR = new File(index_path);
  // 打开文件夹
  FSDirectory directory = FSDirectory.open(INDEX_DIR);
  // 索引搜苏器
  IndexSearcher searcher = new IndexSearcher(directory);
  if (!INDEX_DIR.exists()) {
   System.out.println("The Lucene index is not exist");
   return;
  }
  QueryParser parser = new QueryParser(Version.LUCENE_CURRENT,
    "contents", new SmartChineseAnalyzer(Version.LUCENE_CURRENT));
  Query query = parser.parse(searchStr);
  TopDocs topDocs = searcher.search(query, 1000);// 一般来说,只取得前面的1000条,我们认为是最有用的
  System.out.println("tatol:" + topDocs.totalHits);

  for (int i = 3; i < 6; i++) {// 这个思路扩展下可以做分页了
   // for (ScoreDoc scordoc : topDocs.scoreDocs) {
   // 根据索引的ID找文档
   Document tempDoc = searcher.doc(topDocs.scoreDocs[i].doc);
   System.out.println(topDocs.scoreDocs[i].doc + ":--"
     + tempDoc.getField("path").stringValue());
  }
  //关闭文件夹
  directory.close();
  //关闭搜索器
  searcher.close();
 }
}


这个只是初步的例子,比如我们的新闻系统中,不可能每添加一次新闻,就要做全部的索引那样太不明智了,
正确的做法是只添加跟这篇文章相关的索引,更新、删除文章的时候也同步更新、删除索引。

我们看下
IndexWriter 的API

 void	addDocument(Document doc) 
Adds a document to this index.
 void	addDocument(Document doc, Analyzer analyzer) 
Adds a document to this index, using the provided analyzer instead of the value of getAnalyzer().
 void	deleteAll() 
Delete all documents in the index.
 void	deleteDocuments(Query... queries) 
Deletes the document(s) matching any of the provided queries.
 void	deleteDocuments(Query query) 
Deletes the document(s) matching the provided query.
 void	deleteDocuments(Term... terms) 
Deletes the document(s) containing any of the terms.
 void	deleteDocuments(Term term) 
Deletes the document(s) containing term.
 void	updateDocument(Term term, Document doc) 
Updates a document by first deleting the document(s) containing term and then adding the new document.
 void	updateDocument(Term term, Document doc, Analyzer analyzer) 
Updates a document by first deleting the document(s) containing term and then adding the new document.

看了这个,估计就有思路了。
0
0
分享到:
评论

相关推荐

    lucene3.0.0 入门DEMO

    总的来说,Lucene 3.0.0入门DEMO是一个很好的起点,它可以帮助新手快速了解和实践Lucene的基本用法。通过实际操作,你可以更好地掌握Lucene的索引构建和搜索机制,从而在自己的项目中灵活运用。

    lucene-3.0.0

    《Apache Lucene 3.0.0:全文检索与索引库详解》 Apache Lucene 是一个开源的全文检索库,由Java编写,为开发者提供了强大的文本搜索功能。作为一款高度可扩展的搜索引擎框架,Lucene 3.0.0 版本在当时代表着其最新...

    Lucene3.0.0 jar包

    The new version is mostly a cleanup release without any new features. All deprecations targeted to be removed in version 3.0 were removed.

    lucene3.0.0jar及IKAnalyzer

    而 `lucene3.0.0` jar 包则是 Lucene 的一个重要版本,发布于2009年,它提供了丰富的文本分析、索引构建和搜索功能。此版本引入了一些新的特性,优化了性能,并修复了一些已知问题。 在 Lucene 3.0.0 中,主要包含...

    lucene3.0.0的学习资料

    lucene3.0.0的学习资料,里边有lucene的jar包,具体的入门讲解:http://blog.csdn.net/lengyuhong/archive/2010/11/17/6014597.aspx

    lucene-3.0.0-src.zip

    《Apache Lucene 3.0.0 源码解析》 Apache Lucene 是一个开源全文搜索引擎库,它为开发者提供了强大的文本搜索功能。在这个版本3.0.0的源码中,我们可以深入理解Lucene的核心机制和设计原理,这对于开发、优化以及...

    lucene 3.0.0 api

    最新的lucene api手册, 感觉看这个比一堆html方便。。。 支持开源

    java全文搜索lucene-3.0.0-src+lib.zip

    《Java全文搜索引擎Lucene 3.0.0源码及库文件详解》 Java全文搜索引擎Lucene是一款开源的、高性能的文本分析和检索库,它为开发者提供了在Java应用程序中实现全文搜索功能的能力。本篇将深入探讨Lucene 3.0.0版本的...

    lucene-core-3.0.0.rar_lucene_lucene-core3

    《深入剖析Lucene 3.0.0:Java搜索引擎的核心技术》 在Java开发领域,Lucene是一个不可或缺的全文搜索引擎库,它为开发者提供了强大的文本分析、索引和搜索功能。这里我们关注的是Lucene 3.0.0版本,它是Lucene历史...

    lucene3.6的入门案例

    **Lucene 3.6 入门案例** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它提供了完整的搜索功能,包括索引、查询、评分等,广泛应用于各种项目和产品中。在这个入门案例中,我们将深入理解如何...

    lucene.net 完全入门教程

    lucene.net 完全入门教程,包括 lucene.net 介绍, lucene.net工作模式, lucene.net分词方法和中文分词方法, lucene.net索引的建立详解, lucene.net搜索详解, lucene.net的下载方法, lucene.net搜索结果实现...

    Lucene3.4开发入门.pdf

    Lucene3.4开发入门.pdf

    lucene.net+完全入门教程

    通过学习这个“lucene.net+完全入门教程”,开发者可以了解如何在.NET环境中设置Lucene.Net项目,创建和管理索引,编写查询,优化搜索性能,并掌握如何处理搜索结果。教程可能涵盖从安装步骤、基本概念介绍,到实战...

    全文检索 lucene-5.2.1 入门Eclipse工程实例

    Eclipse工程文件,全文检索 lucene-5.2.1 入门Eclipse工程实例,福利放送,与lucene3结果比对

    Lucene 3.0完成入门

    本篇文章将围绕 Lucene 3.0 版本,详细介绍其入门知识,并通过提供的文档列表,帮助你深入了解并实现简单的搜索功能。 1. **Lucene 3.0 的基础概念** - **索引**:Lucene 的核心是索引,它是一种预处理步骤,将...

    最新全文检索 lucene-5.2.1 入门经典实例

    《最新全文检索 Lucene-5.2.1 入门经典实例》 Lucene是一个开源的全文检索库,由Apache软件基金会开发,广泛应用于各种信息检索系统。在5.2.1版本中,Lucene提供了更为高效和强大的搜索功能,为开发者提供了构建...

    [Lucene] Lucene入门心得

    【Lucene】Lucene入门心得 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个简单的API,使得开发者可以方便地在自己的应用程序中集成全文检索功能。...

Global site tag (gtag.js) - Google Analytics