目标:以用户输入为关键字,查找相关新闻帖子(如果帖子标题或标签和关键字相匹配)
缺点:只支持单关键字,
数据表:s 字段有 id, title(标题), tags(标签)...
按照我理解和应用把过程分为:(1)创建索引和(2)搜索应用 两个步骤
(1)创建索引:
我思路是每往数据库里添加条记录就把该数据中标题id及tags字段添加到索引记录中以备查询,以下代码在添加新闻类中:
/**往数据库中添加条新闻记录**/
News n= News;
n.Content(content);
n.Title(title);
n.Tags(tags);
DAO.save(n);
/**以下是处理索引代码**/
String indexDir="c:/lucene";//索引文件路径
Directory dir = FSDirectory.getDirectory(indexDir);
IndexReader.unlock(dir);
IndexWriter writer= IndexWriter(indexDir, StandardAnalyzer,false);//是否重建索引?
//注意这里false状态意思可能是不重新建IndexWriter如果为true,IndexWriter会重建索引这样以前索引中已经索引数据将会丢失
/**以下代码将新闻记录加到索引中**/
Document doc= Document;
doc.add( Field("sid",String.valueOf(n.getId), Field.Store.YES, Field.Index.NO));
doc.add( Field("title", n.getTitle, Field.Store.YES, Field.Index.TOKENIZED));
doc.add( 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 = IndexSearcher(indexDir);
Analyzer analyzer = 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 slist= ArrayList;
for ( i = 0; i < hits.length; i) {
Document doc = hits.doc(i);
News n= News;
n.Id(Integer.valueOf(doc.get("sid")));
n.Tags(doc.get("tags"));
n.Title(doc.get("title"));
slist.add(n);
}
request.Attribute("slist",slist)
然后在页面上就可以显示查到记录了.
如果你有好思路完成同样功能请告诉我谢谢
最新评论