程序开发

Lucene索引查询

时间:2013-10-25 11:12:25  作者:www.solgle.com  来源:说歌社区  查看:262  评论:0
内容摘要:项目描述: 一个很简单的新闻模块,只涉及到数据库中的 news表, 通过提交表单,可以往news表中添加数据, 也可以输入关键字搜索news表中的数据目标:以用户输入为关键字,查找相关的新闻帖子。(如果帖子的标题或标签与关键字相匹配)缺点:只支持单关键字,数据表:news 的字段...
项目描述: 一个很简单的新闻模块,只涉及到数据库中的 news表, 通过提交表单,可以往news表中添加数据, 也可以输入关键字搜索news表中的数据
目标:以用户输入为关键字,查找相关的新闻帖子。(如果帖子的标题或标签与关键字相匹配)
缺点:只支持单关键字,

数据表:news 的字段有 id, title(标题), tags(标签)...

按照我的理解和应用,把过程分为:(1)创建索引,和(2)搜索应用 两个步骤。
(1)创建索引:
    我的思路是,每往数据库里添加一条记录,就把该数据中的标题,id,及tags字段添加到索引记录中,以备查询,以下代码在添加新闻的类中:
/**往数据库中添加一条新闻记录**/
News n=new News();
n.setContent(content);
n.setTitle(title);
n.setTags(tags);
DAO.save(n);

/**以下是处理索引的代码**/
String indexDir="c:/lucene";//索引文件路径
Directory dir = FSDirectory.getDirectory(indexDir);
IndexReader.unlock(dir);
IndexWriter writer=new IndexWriter(indexDir,new StandardAnalyzer(),false);//是否重建索引?
//注意,这里的false状态意思可能是不重新建IndexWriter,如果为true,IndexWriter会重建索引,这样以前索引中已经索引的数据,将会丢失

/**以下代码将新闻记录加到索引中**/
Document doc=new Document();
doc.add(new Field("newsid",String.valueOf(n.getId()), Field.Store.YES, Field.Index.NO));
doc.add(new Field("title", n.getTitle(), Field.Store.YES, Field.Index.TOKENIZED));
doc.add(new Field("tags", n.getTags(), Field.Store.YES, Field.Index.TOKENIZED));
writer.addDocument(doc);

writer.optimize();//优化索引
writer.close();

(2)搜索应用:
    (只支持单个关键字,拆分词我还不会用,也不知道要注意什么)
    假设用户,输入了关键词 "上海" ,我们想把新闻标题(title)及 标签(tags)中包含"上海"的新闻都找出来,
以下是大致的思路:不查询数据库,而使用前面创建的索引,将索引的field字段与关键字匹配,得到能匹配得上的记录列表(Hits),然后把Hits中的每个记录(document),放入List中,并在页面显示:
/**索引位置,搜索类,分析器**/
String indexDir = "c:/lucene";
Searcher searcher = new IndexSearcher(indexDir);
Analyzer analyzer = new StandardAnalyzer();

/**索引中,想要查询的field**/
String[] fields = { "title", "tags"};//与索引中的"title"和"tags"相关联
String[] q = { "北京","北京"};//搜索关键字,因为上面有两个匹配的域,所以这里长度也是两个

/**下面就是查询的API吧**/
Query query = MultiFieldQueryParser.parse(q, fields, analyzer);
////我现在知道的query有两种构造方法,用于不同的匹配方案中,
//(1.)单关键字-单字段对应的TermQuery(这个最简单) 
//(2.)单关键字对应多字段查询的MultiFieldQueryParser
Hits hits = searcher.search(query); //查询的结果,结果的个数可用 hits.length来获得
List newslist=new ArrayList();
for (int i = 0; i < hits.length(); i++) {
    Document doc = hits.doc(i);
    News n=new News();
    n.setId(Integer.valueOf(doc.get("newsid")));
    n.setTags(doc.get("tags"));
    n.setTitle(doc.get("title"));
    newslist.add(n);
}
request.setAttribute("newslist",newslist)
然后在页面上就可以显示查到的记录了.

标签:Lucene索引查询 

solgle.com 版权所有,欢迎分享!!!

相关文章
    相关评论
       Copyright © 2013-2020 solgle.com,All rights reserved.[solgle.com] 公安机关备案号:51010802000219
    Email:solgle@solgle.com; weixin:cd1008610000 ICP:蜀ICP备14011070号-1