`
zhchx0827
  • 浏览: 193493 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

lucene学习(一)-------索引的创建,修改,删除,查询

 
阅读更多
public abstract class BaseIndexingTestCase {
 protected String[] keywords = {"1", "2"};
 protected String[] unindexed = {"Netherlands", "Itely"};
 protected String[] unstored = {"Amsterdam has lots of bridges", "Venice has lots of canals"};
 protected String[] text = {"Amsterdam", "Venice"};
 protected Directory dir;
 
 public void init() throws IOException {
  String indexDir = "D:/test";
  dir = FSDirectory.open(new File(indexDir));
 }
 
 public BaseIndexingTestCase() {
  try {
   init();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 
 //===================创建文档=====================
 protected void setUp() throws IOException {
  addDocuments(dir);
 }

 protected void addDocuments(Directory dir2) throws CorruptIndexException, LockObtainFailedException, IOException {
  IndexWriter writer = getIndexWriter(dir2);
  for (int i = 0; i < keywords.length; i++) {
   Document doc = new Document();
   doc.add(new Field("id",keywords[i], Store.YES, Index.ANALYZED));
   doc.add(new Field("city",text[i], Store.NO, Index.ANALYZED));
   doc.add(new Field("contents",unstored[i], Store.YES, Index.ANALYZED));
   doc.add(new Field("unindexed",keywords[i], Store.YES, Index.NO));
   writer.addDocument(doc);
  }
  writer.close();
 }
 
 //===============================搜索=======================
 protected void search(String field, String value) throws CorruptIndexException, IOException, ParseException {
  IndexSearcher search = getIndexSearcher();
  
  QueryParser parser = new QueryParser(Version.LUCENE_36, field, getAnalyzer());
  Query query = parser.parse(value);
  
  TopDocs topDocs = search.search(query, 10);
  ScoreDoc[] docs = topDocs.scoreDocs;
  
  for (ScoreDoc scoreDoc : docs) {
   int docID = scoreDoc.doc;
   Document document = search.doc(docID);
   
   List<Fieldable> list = document.getFields();
   for (Fieldable fieldable : list) {
    System.out.println(fieldable.name() + " : " + fieldable.stringValue());
   }
  }
  search.close();
 }
 
 //=============================删除文档=========================
 protected void delete(Term term) throws CorruptIndexException, IOException {
  IndexWriter writer = getIndexWriter(dir);
  writer.deleteDocuments(term);
  //老版本中,通过IndexReader删除,且在IndexReader关闭时提交
  writer.forceMergeDeletes();
  writer.close();
 }
 protected void delete(Query query) throws CorruptIndexException, IOException {
  IndexWriter writer = getIndexWriter(dir);
  writer.deleteDocuments(query);
  writer.forceMergeDeletes();
  writer.close();
 }
 protected void delete(String name, String value) throws CorruptIndexException, IOException, ParseException {
  Query query = getQuery(name, value);
  IndexWriter writer = getIndexWriter(dir);
  writer.deleteDocuments(query);
  writer.forceMergeDeletes();
  writer.close();
 }
 protected void deleteAll() throws ParseException, CorruptIndexException, IOException {
  Query query = getQuery("*","*");
  delete(query);
 }
 
 //=======================更新索引=====================
 protected void update(String field, String value, Document doc) throws CorruptIndexException, LockObtainFailedException, IOException {
  IndexWriter writer = getIndexWriter(dir);
  Term term = new Term(field, value);
  //先删除原来的索引,后添加新的索引
  writer.updateDocument(term, doc);
 }
 
 
 //======================恢复删除================================
 protected void undelete() throws CorruptIndexException, IOException {
  //老版本通过IndexReader的undeleteAll恢复(在执行物理删除前才行)
  
 }
 

 //========================命中数===================
 protected int getHitCount(String field, String value) throws IOException, ParseException {
  IndexSearcher search = getIndexSearcher();
  Query query = getQuery(field, value);
  TopDocs topDocs = search.search(query,10);
  return topDocs.totalHits;
 }
 
 
 //========================索引中总文档数(包括删除未提交的文档)======================
 protected int maxDocs() throws CorruptIndexException, LockObtainFailedException, IOException {
  IndexWriter writer = getIndexWriter(dir);
  IndexReader reader = getIndexSearcher().getIndexReader();
  System.out.println(writer.maxDoc() + "-" + reader.maxDoc());
  
  writer.close();
  reader.close();
  
  return 0;
 }
 
 //=======================索引中可用的文档数(不包括删除未提交的文档)=====================
 protected int numDocs() throws CorruptIndexException, LockObtainFailedException, IOException {
  IndexWriter writer = getIndexWriter(dir);
  IndexReader reader = getIndexSearcher().getIndexReader();
  System.out.println(writer.numDocs() + "-" + reader.numDocs());
  
  writer.close();
  reader.close();
  
  return 0;
 }
 
 
 //=================================================================
 private Query getQuery(String name, String value) throws ParseException {
  QueryParser parser = new QueryParser(Version.LUCENE_36, name, getAnalyzer());
  Query query = parser.parse(value);
  return query;
 }
 
 private IndexSearcher getIndexSearcher() throws CorruptIndexException, IOException {
  IndexReader reader = IndexReader.open(dir);
  IndexSearcher search = new IndexSearcher(reader);
  return search;
 }
 
 private IndexWriter getIndexWriter(Directory dir2) throws CorruptIndexException, LockObtainFailedException, IOException {
  IndexWriter writer = new IndexWriter(dir2, getIndexWriterConfig());
  return writer;
 }
 
 private IndexWriterConfig getIndexWriterConfig() {
  IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36, getAnalyzer());
  
  LogMergePolicy policy = new LogDocMergePolicy();
  policy.setUseCompoundFile(true);
  config.setMergePolicy(policy);
  
  return config; 
 }

 private Analyzer getAnalyzer() {
  return new SimpleAnalyzer(Version.LUCENE_36);
 }
}

 

分享到:
评论

相关推荐

    lucene-core-2.9.2.jar

    4. 更新与优化:Lucene允许动态更新索引,即添加、删除或修改文档。此外,定期的索引优化(Merge)可以合并多个段,提高搜索效率。 三、lucene-1.4.3.jar.license.txt 这个文件通常包含了关于Apache Lucene早期...

    lucene-memory-3.0.1.jar

    通过这些API,开发者可以方便地进行文档添加、删除、修改以及执行复杂的查询操作。 在实际应用中,开发人员通常会结合其他Lucene模块,如QueryParser、Analyzer等,来构建完整的搜索解决方案。例如,使用`...

    lucene-4.2.1-src.tgz

    6. **更新和删除**:`IndexWriter`不仅用于创建新索引,还可以用于对现有索引进行更新(添加、修改文档)和删除操作。 7. **高级功能**:Lucene还包括多线程支持、近实时搜索、自定义排序、过滤器(`Filter`)和...

    Lucene 索引的简单使用

    以上就是关于“Lucene索引的简单使用”的详细介绍,包括其核心概念、创建和查询索引的步骤以及一些高级特性。希望对你理解和应用Lucene有所帮助。在实际开发中,可以根据需求选择合适的Analyzer,优化索引策略,以...

    lucene-3.0.2-dev-src

    段合并是Lucene索引维护的重要部分,涉及`MergePolicy`和`MergeScheduler`两个关键组件。 9. **文档字段与存储** `Document`类是Lucene的基本数据结构,包含多个`Field`。`Field`有三种类型:存储(Stored)、索引...

    lucene-2.3.0-src

    3. **IndexWriter**:用于创建和更新索引,如添加、删除和修改文档。 4. **IndexReader**:用于读取已建立的索引,获取文档信息,支持批量操作。 5. **Searcher**:执行搜索任务,如`IndexSearcher`,可以基于给定...

    lucene-core-2.4.0的源码

    2. **IndexWriter**:负责创建和更新索引,它处理文档的添加、删除和修改。在Lucene 2.4.0中,IndexWriter采用了段(Segment)的概念,每次写操作都会生成新的段,然后通过合并操作优化索引。 三、查询与搜索 1. *...

    lucene-4.6.1全套jar包

    Lucene 的核心功能之一是创建高效的索引。索引过程将文档内容转化为便于搜索的数据结构。在4.6.1版本中,Lucene 支持分词、分析和标准化,这使得搜索时能够进行模糊匹配和同义词查询。同时,它支持倒排索引,这是一...

    lucene-3.0.3-src.zip

    它处理文档的添加、删除和修改,并确保索引的一致性。 5. **Searcher**:搜索器执行查询并返回匹配结果。它可以是IndexSearcher,用于在线搜索,也可以是MultiSearcher,用于同时在多个索引上执行查询。 二、...

    Lucene5学习之创建索引入门示例

    下面是一个简单的Lucene5索引创建流程: 1. **创建Analyzer**: 首先,你需要选择或自定义一个Analyzer,以处理输入文本。例如,可以使用StandardAnalyzer来处理英文文本。 ```java Analyzer analyzer = new ...

    lucene-4.7.0官方文档

    同时,Lucene也支持增量索引更新,允许在不重建整个索引的情况下添加、删除或修改文档。 6. **高级特性**:如多字段搜索、高亮显示搜索结果、地理位置搜索、近实时搜索(NRT,Near Real Time)等,这些在4.7.0版本...

    lucene.net 2.9.2 实现索引生成,修改,查询,删除实例

    在这个实例中,我们将深入探讨如何使用Lucene.NET 2.9.2来实现索引的生成、修改、查询和删除。 **一、索引生成** 首先,我们需要创建一个索引,这是全文检索的基础。在Lucene.NET中,我们通常会定义一个文档类,...

    基于lucene技术的增量索引

    - **处理新增数据**:对于新插入的数据,我们创建一个新的Lucene文档,并添加到索引writer中。确保每个文档都关联有唯一标识符,以便后续更新和删除操作。 - **处理更新数据**:如果数据被修改,我们需要找到索引中...

    自己写的一个基于词库的lucene分词程序--ThesaurusAnalyzer

    在实际应用中,开发者可以集成ThesaurusAnalyzer到他们的Lucene索引流程中,替换默认的Analyzer,从而优化搜索性能和结果的相关性。此外,该程序也可以用作独立工具,用于预处理文本数据,如文本清洗、分析和统计。 ...

    lucene创建修改删除组合条件查询

    以上就是关于“lucene创建修改删除组合条件查询”的主要知识点。通过熟练掌握这些操作,开发者可以构建出强大的全文搜索系统,满足各种复杂的查询需求。在实际应用中,还需要注意性能优化,如合理使用索引,以及根据...

    Lucene.Net-search

    6. **索引写入器(IndexWriter)**:用于创建和更新索引,支持批量添加、删除和修改文档。 **二、集成到 MVC 或 WebForms 网站** 在 MVC 或 WebForms 应用中集成 Lucene.Net,通常涉及以下步骤: 1. **配置分析器...

    lucene 4.7.2 Demo

    本文将深入探讨Lucene 4.7.2的特性,包括创建、删除和修改索引,以及高级搜索功能如通用对象搜索、范围搜索、排序和高亮显示。 首先,让我们了解如何利用Lucene 4.7.2创建索引。创建索引是全文检索的基础,它涉及将...

    lucene-3.5.0.jar

    - **IndexWriter**:用于创建和更新索引,它管理索引的生命周期,包括添加、删除和修改文档。 - **IndexReader**:用于读取索引,提供搜索操作。 - **IndexSearcher**:执行搜索查询,并返回匹配的Document结果。...

    Lucene索引的基本操作

    Lucene索引存储在文件系统中,因此需要创建一个目录来保存索引。可以使用`FSDirectory`类来实现: ```java File indexLocation = new File("index"); Directory directory = FSDirectory.open(indexLocation.toPath...

    最新版linux lucene-8.10.0.tgz

    - **IndexWriter**:用于创建和更新索引,你可以通过它来添加、删除和修改Documents。 - **Searcher**:负责查询执行和结果返回,包括Query解析、评分和排序。 - **Query**:表示用户的搜索请求,可以是简单的...

Global site tag (gtag.js) - Google Analytics