`
yingruochen
  • 浏览: 75124 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Lucene学习入门2

阅读更多

一、lucene简单的增删改查,如果是新项目,在做完对数据库的DAO操作时,紧跟着做对索引库的增删改查,在维护以前的项目时,再不允许修改源代码的情况下,只能做定时创建索引

 

 

package com.lucene.luceneutil;

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.document.Field.Index;

import org.apache.lucene.document.Field.Store;

import com.lucene.entity.ArticleEntity;

public class ArticleDocumentUtils {

/**

* 把ArticleEntity转换成Document对象

* @param article ArticleEntity对象

* @return  转换后的doc对象

*/

public static Document Article2Document(ArticleEntity article){

String strId = article.getId().toString();

Document doc = new Document();

doc.add(new Field("id",strId,Store.YES,Index.NOT_ANALYZED));

doc.add(new Field("title",article.getTitle(),Store.YES,Index.ANALYZED));

doc.add(new Field("content",article.getContent(),Store.YES,Index.ANALYZED));

return doc ;

}

public static ArticleEntity Document2Article(Document doc){

ArticleEntity article = new ArticleEntity();

Integer id  = Integer.parseInt(doc.get("id")) ;

article.setId(id);

article.setTitle(doc.get("title"));

article.setContent(doc.get("content"));

return article ;

}

}
package com.lucene.luceneutil;
import java.io.File;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Configuration {
private static Directory directory ;
private static Analyzer analyzer ;
static {
try {
directory = FSDirectory.open(new File("./filepath"));
analyzer = new StandardAnalyzer(Version.LUCENE_30 );
} catch (Exception e) {
new RuntimeException(e);
}
}
public static Directory getDirectory() {
return directory;
}
public static Analyzer getAnalyzer() {
return analyzer;
}
}
package com.lucene.entity;
import java.util.List;
public class QueryResult<T> {
private int count ;
private List<T> list ;
public QueryResult(int count, List<T> list) {
this.count = count;
this.list = list;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
}
package com.lucene.indexdao;
import com.lucene.entity.ArticleEntity;
import com.lucene.entity.QueryResult;
public interface ArticleEntityIndexDao {
/**
* 建立索引(保存到索引库)
* 
* @param article
*/
public void save(ArticleEntity article);
/**
* 删除索引
* @param id
*/
public void delete(Integer id);
/**
* 更新文章
* @param article 要更新的文章
*/
public void update(ArticleEntity article) ;
/**
* 
* @param query        查询条件
* @param firstResult  每页开始的条数
* @param number       每页显示的条数
* @return             返回符合条件的结果
*/
public QueryResult<ArticleEntity> search(String query,int firstResult ,int number);
}
package com.lucene.indexdao.impl;
import java.util.ArrayList;
import java.util.List;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.util.Version;
import com.lucene.entity.ArticleEntity;
import com.lucene.entity.QueryResult;
import com.lucene.indexdao.ArticleEntityIndexDao;
import com.lucene.luceneutil.ArticleDocumentUtils;
import com.lucene.luceneutil.Configuration;
public class ArticleEntityIndexDaoImpl implements ArticleEntityIndexDao {
@Override
public void save(ArticleEntity article) {
// 1,把Article转为Document
Document doc = ArticleDocumentUtils.Article2Document(article);
// 2,把Document存到索引库中
IndexWriter indexWrite = null ;
try {
indexWrite = new IndexWriter(Configuration.getDirectory(), Configuration.getAnalyzer(), MaxFieldLength.LIMITED);
indexWrite.addDocument(doc);// 建立索引
} catch (Exception e) {
throw new RuntimeException(e);
}finally{
try {
indexWrite.close();
} catch (Exception e) {
throw new RuntimeException();
} 
}
}
/**
* Term:就是某Field中的某个关键词。
*/
@Override
public void delete(Integer id) {
IndexWriter indexWrite = null ;
try {
Term term = new Term("id",id.toString());
indexWrite = new IndexWriter(Configuration.getDirectory(), Configuration.getAnalyzer(), MaxFieldLength.LIMITED);
indexWrite.deleteDocuments(term);
} catch (Exception e) {
throw new RuntimeException(e);
}finally{
try {
indexWrite.close();
} catch (Exception e) {
throw new RuntimeException();
} 
}
}
/**
* 更新就是先删除再添加
*/
@Override
public void update(ArticleEntity article) {
IndexWriter indexWrite = null ;
try {
Term term = new Term("id",article.toString());
Document doc = ArticleDocumentUtils.Article2Document(article);
indexWrite = new IndexWriter(Configuration.getDirectory(), Configuration.getAnalyzer(), MaxFieldLength.LIMITED);
indexWrite.updateDocument(term, doc);
//indexWrite.deleteDocuments(term);
//indexWrite.addDocument(doc);
} catch (Exception e) {
throw new RuntimeException(e);
}finally{
try {
indexWrite.close();
} catch (Exception e) {
throw new RuntimeException();
} 
}
}
@Override
public QueryResult<ArticleEntity> search(String query, int firstResult,int number) {
        IndexSearcher searchQuery = null ;
        QueryParser queryParser = null;
        Query queryStr;
        try {
            //queryParser = new QueryParser(Version.LUCENE_30, "title", Configuration.getAnalyzer());这是默认在title里搜索
            queryParser = new MultiFieldQueryParser(Version.LUCENE_30,new String[]{"title","content"}, Configuration.getAnalyzer());//多字段中搜索
            queryStr = queryParser.parse(query);
            searchQuery = new IndexSearcher(Configuration.getDirectory());
            TopDocs topDocs = searchQuery.search(queryStr, 1000);
            int totalNum = topDocs.totalHits ;//符合条件的总记录数
            ScoreDoc[] scoredoc = topDocs.scoreDocs ;//符合条件的前n条信息
            //处理结果
            List<ArticleEntity> list = new ArrayList();
            int endLenght = Math.max(firstResult+number, scoredoc.length);
            for(int i = firstResult ; i < endLenght ; i++){
                Document doc = searchQuery.doc(scoredoc[i].doc) ; //得到Document对象
                ArticleEntity e =ArticleDocumentUtils.Document2Article(doc); //得到ArticleEntity对象
                list.add(e);
            }
            return new QueryResult(totalNum,list);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally{
            try {
                searchQuery.close();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
       
    }
}
 
二、对简单的增删改查做完了,单个的测试是没有问题,但是同时有多个IndexWriter在运行的时候就会出现org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: NativeFSLock@E:\indexDir\write.lock的一场,所以对于一个索引库,只能有一个打开IndexWtriter操作他,如果打开了多个,就会有上面的异常。


分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    lucene学习pdf2

    "lucene学习pdf2" 提供的文档,无疑是对Lucene深入理解的一把钥匙,它涵盖了Lucene的核心概念、操作流程以及高级特性。 首先,Lucene的基础知识是必不可少的。Lucene的核心在于索引和搜索,它将非结构化的文本数据...

    lucene学习

    Lucene的基础知识 1、案例分析:什么是全文检索,如何实现全文检索 2、Lucene实现全文检索的流程 a) 创建索引 b) 查询索引 3、配置开发环境 4、创建索引库 5、查询索引库 6、分析器的分析过程 a) 测试分析器的分词...

    lucene学习入门程序

    **Lucene学习入门程序** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。它是Java编写,可以被集成到各种应用中,提供强大的文本检索功能。本程序是针对初学者设计的,旨在帮助开发者快速理解并...

    lucene学习资料收集

    【标题】:“Lucene学习资料收集” 【描述】:Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。这个资料集可能包含了关于如何理解和使用Lucene的各种资源,特别是通过博主huanglz19871030在iteye上的...

    Lucene的的学习资料及案例

    **Lucene学习指南** Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护,是Java编程语言中广泛使用的搜索引擎库。它提供了一个简单的API,使得开发者能够方便地在应用中实现全文检索功能。本篇文章将...

    Lucene学习源码.rar

    本文将主要围绕Java Lucene进行深入探讨,并基于提供的“Lucene学习源码.rar”文件中的“Lucene视频教程_讲解部分源码”展开讨论。 一、Lucene核心概念 1. 文档(Document):Lucene中的基本单位,用于存储待检索...

    lucene3.6的入门案例

    通过对这个案例的学习,你可以掌握 Lucene 的基本操作,为进一步深入学习和应用打下基础。 在实际项目中,你可能需要考虑更多细节,如错误处理、多线程索引、优化索引性能、处理大量数据等。此外,随着 Lucene 版本...

    Lucene入门学习文档

    **Lucene入门学习文档** **一、什么是Lucene** Lucene是Apache软件基金会下的一个开源全文检索库,它提供了一个高...通过阅读"Lucene学习文档",你可以一步步了解并掌握这些知识,逐步成为一个熟练的Lucene开发者。

    【大搜集:lucene学习资料】---<下载不扣分,回帖加1分,欢迎下载,童叟无欺>

    lucene学习笔记 2.txt lucene学习笔记 3 .txt lucene入门实战.txt Lucene 的学习 .txt Lucene-2.0学习文档 .txt Lucene入门与使用 .txt lucene性能.txt 大富翁全文索引和查询的例子程序.txt 关于lucene2.0...

    Lucene-2.0学习文档

    本篇文章将围绕"Lucene-2.0学习文档"的主题,结合Indexer.java、MyScoreDocComparator.java和MySortComparatorSource.java这三个关键文件,深入探讨Lucene的核心概念和实际应用。 首先,我们来看`Indexer.java`。这...

    lucene 入门

    以上就是Lucene的基础知识和使用方法,通过这个入门资料,你可以快速上手并构建自己的全文搜索引擎。在实际应用中,还可以深入学习更高级的主题,如多字段搜索、评分策略、倒排索引优化等,以满足更复杂的需求。

    Lucene3.3.0学习Demo

    **Lucene 3.3.0 学习Demo** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发。在3.3.0版本中,Lucene提供了强大的文本搜索功能,包括分词、索引创建、查询解析和结果排序等。这个"Lucene3.3.0学习Demo...

    Lucene5.2.1 入门学习例子

    Lucene5.2.1 入门学习例子. 这是别人的例子源码。可以参考。内有使用说明。

    Lucene-入门

    **标题:“Lucene-入门”** Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发并维护。它是Java编写的一个开源项目,被广泛应用于构建搜索引擎或者在大型数据集上进行全文检索。Lucene提供了丰富的搜索...

    lucene学习资料

    **Lucene学习资料** Lucene是一个高性能、可扩展的信息检索库,由Apache软件基金会开发,是Java编程语言中广泛使用的全文检索引擎库。它提供了文本分析、索引和搜索的基本功能,同时也支持高级搜索语法和查询操作。...

    Lucene.net学习帮助文档

    **一、Lucene.net基础** Lucene.net提供了对文本数据的索引和搜索功能,它通过分词、建立倒排索引等技术,使得文本数据可以被快速检索。在.NET环境中,开发者可以通过Lucene.net API创建索引,添加、删除和更新文档...

    Lucene 3.6 学习笔记

    以上就是Lucene 3.6的学习笔记,涵盖了从基础到高级的各种搜索和索引操作,以及相关的分词和扩展功能。通过学习这些内容,可以深入理解Lucene的工作机制,并利用其强大的搜索能力构建高效的应用。

    lucene4.8学习资料和案例

    2. 代码示例:通过分析提供的"lucene4.8学习资料和案例"压缩包,可以深入了解Lucene的实践操作,如创建索引、执行查询、处理结果等。 3. 在线教程:网络上有许多优秀的Lucene教程,如《Lucene in Action》一书的在线...

    搜索引擎lucene学习资料

    通过这些学习资料,读者可以系统地学习搜索引擎的理论基础,掌握Lucene的核心功能,同时也能了解到如何在实际项目中应用这些技术,提升搜索系统的性能和用户体验。这些知识对于从事信息检索、网站开发、大数据分析等...

    Lucene in Action 2nd Edition

    《Lucene in Action 2nd Edition MEAP.pdf》这个PDF文件很可能是书中的早期访问版章节,提供了书中的部分内容,读者可以从中了解Lucene的基本概念和实际操作,为后续深入学习和应用打下坚实基础。通过学习这本书,...

Global site tag (gtag.js) - Google Analytics