Lucene简单的使用配置详解

简要流程图:

这里写图片描述

1.导入相应的jar包

这里写图片描述
lucene-analyzers-3.0.1.jar 分割器jar包
lucene-core-3.0.1.jar 核心jar包
lucene-highlighter-3.0.1.jar 高亮显示jar包
lucene-memory-3.0.1.jar 记忆jar包

2.先建一个实体类用来模拟一片文章

这里写图片描述

import java.io.Serializable;


public class Article implements Serializable{
     /**
     * 
     */
    private static final long serialVersionUID = 1L;
     private Long aid;
     private String title;
     private String content;
    public Long getAid() {
        return aid;
    }
    public void setAid(Long aid) {
        this.aid = aid;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    @Override
    public String toString() {
        return "Article [aid=" + aid + ", title=" + title + ", content="
                + content + "]";
    }

}
3.模拟 把文章放到索引库(一般索引库提前建好了)

这里是做个例子有兴趣可以研究一下

@Test
     public void testCreateIndex() throws Exception{
         Article article=new Article();
         article.setAid(1L);
         article.setTitle("java是世界上最好的语言");
         article.setContent("java牛逼!牛逼!牛逼!牛逼!牛逼!");
        //创建IndexWriter
        /**
         * 第一个参数
         *      索引库的位置
         */
         Directory directory = FSDirectory.open(new File("./Dirindex"));
        /*
         * 第二个参数
         *       分词器
         */
        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
        /**
         * 第三个参数
         *       限制索引库中字段的大小
         */
        IndexWriter indexWriter = new IndexWriter(directory, analyzer, MaxFieldLength.LIMITED);
        //把article转化成document
        Document document = new Document();
        /**
         * 参数
         *     name  存储在索引库的名字
         *     value 存储在索引库中的值
         *     //Store.YES 保存 可以查询 可以打印内容
         *     //Store.NO 不保存 可以查询 不可打印内容 由于不保存内容所以节省空间
         *     Index.NOT_ANALYZED : 不分词直接索引
         *     Index.ANALYZED :分词后索引
         *     Index.NO : 根本不索引,所以不会被检索到    
         *     Index.NOT_ANALYZED_NO_NORMS : 类似Index.NOT_ANALYZED,但不存储NORM TERMS,节约内存但不支持Boost,非常常用 
         *     Index.ANALYZED_NO_NORMS : 类似Index.ANALYZED,但不存储NORM TERMS,节约内存但不支持Boost
         */
        Field idField =  new Field("aid", article.getAid().toString(), Store.YES, Index.NOT_ANALYZED);
        Field titleField =  new Field("title", article.getTitle(), Store.YES, Index.NO);
        Field contentField =  new Field("content", article.getContent(), Store.YES, Index.ANALYZED);
        //把上面的field放入到document中
        document.add(idField);
        document.add(titleField);
        document.add(contentField);

        indexWriter.addDocument(document);

        indexWriter.close();
    }
4.从索引库中根据关键字把信息检索出来

这个测试可以成为controller层用来接收请求
返回搜索结构
例:

@Contrnller
public class hello{
@RequestMapping(value = “/queryUserById.do/{userid}”,method = RequestMethod.GET)
@ResponseBody
public String testSearchIndex(@PathVariable(“userid”) int userid) throws Exception{
……搜索的方法体
}
}



“形参”可以是前端请求传过来的“关键字”

使用Test方法测试搜索
@Test
public void testSearchIndex() throws Exception{
/**
* 创建一个IndexSearch对象
*/
Directory directory = FSDirectory.open(new File(“./Dirindex”));//找到索引库的位置
IndexSearcher indexSearcher = new IndexSearcher(directory);//在directory索引库进行搜索
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);//进行分词器的切分 取分词器要和上面放的分词器版本一样(Version.LUCENE_30)
/**
* 第一个参数为版本号
* 第二个参数为在哪个字段中进行检索
*/
QueryParser queryParser = new QueryParser(Version.LUCENE_30,”content”,analyzer);
// QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30,new String[]{“title”,”content”},analyzer);
/**
* 关键词
*/
Query query = queryParser.parse(“java”);//前台传过来的关键词 我这里直接写死方便测试
/**
* 第二个参数
* 查找前多少个
* TopDocs–>Top Documents
*/
TopDocs topDocs = indexSearcher.search(query, 1);
int count = topDocs.totalHits;//根据关键词计算出来的总的记录数
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
List

articles = new ArrayList
();
for (ScoreDoc scoreDoc : scoreDocs) {
/**
* 关键词的索引
*/
int index = scoreDoc.doc;
/**
* 根据关键词的索引查找到document
*/
Document document = indexSearcher.doc(index);
//把document转化成article
Article article = new Article();
article.setAid(Long.parseLong(document.get(“aid”)));
article.setTitle(document.get(“title”));
article.setContent(document.get(“content”));
articles.add(article);
}

    for (Article article : articles) {
        System.out.println(article.getAid());//打印id
        System.out.println(article.getTitle());//打印标题
        System.out.println(article.getContent());//打印内容
    }
} 

“`

测试结果:
这里写图片描述

索引库的位置
这里写图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值