lucene(全文搜索)_根据内容建立索引_源码下载

在我们的开发过程中,会遇到这样的情况:

给出下面的信息,让我们进行建立索引,并且进行搜索信息

这个时候,我们应该怎样处理呢?

要实现这样的功能,其实使用lucene会变得简单很多!!

========================================

项目结构:

运行

1 @Test
2     public void testIndex(){
3         LuceneUtil util = new LuceneUtil();
4         util.index();
5     }

效果:

运行

1 @Test
2     public void testQuery(){
3         LuceneUtil util = new LuceneUtil();
4         util.query();
5     }

效果:

=========================================================

代码部分:

=========================================================

/lucene_0200_index/src/com/b510/lucene/util/LuceneUtil.java

  1 /**
  2  * 
  3  */
  4 package com.b510.lucene.util;
  5 
  6 import java.io.File;
  7 import java.io.IOException;
  8 
  9 import org.apache.lucene.analysis.standard.StandardAnalyzer;
 10 import org.apache.lucene.document.Document;
 11 import org.apache.lucene.document.Field;
 12 import org.apache.lucene.index.CorruptIndexException;
 13 import org.apache.lucene.index.IndexReader;
 14 import org.apache.lucene.index.IndexWriter;
 15 import org.apache.lucene.index.IndexWriterConfig;
 16 import org.apache.lucene.store.Directory;
 17 import org.apache.lucene.store.FSDirectory;
 18 import org.apache.lucene.store.LockObtainFailedException;
 19 import org.apache.lucene.util.Version;
 20 
 21 /**
 22  * @author Hongten <br />
 23  * @date 2013-1-31
 24  */
 25 public class LuceneUtil {
 26 
 27     /**
 28      * 邮件id
 29      */
 30     private String[] ids = { "1", "2", "3", "4", "5", "6" };
 31     /**
 32      * 邮箱
 33      */
 34     private String[] emails = { "aa@sina.com", "bb@foxmail.com", "cc@qq.com",
 35             "dd@163.com", "ee@gmail.com", "ff@sina.com" };
 36     /**
 37      * 邮件内容
 38      */
 39     private String[] contents = { "hello,aa", "hello,bb", "hello,cc",
 40             "hello,dd", "hello,ee", "hello,ff" };
 41     /**
 42      * 邮件的附件
 43      */
 44     private int[] attachs = { 1, 5, 3, 4, 2, 6 };
 45     /**
 46      * 收件人的名称
 47      */
 48     private String[] names = { "hongten", "hanyuan", "Devide", "Tom", "Steven",
 49             "Shala" };
 50 
 51     private Directory directory = null;
 52 
 53     public LuceneUtil() {
 54         try {
 55             directory = FSDirectory.open(new File(
 56                     "D:/WordPlace/lucene/lucene_0200_index/lucene/index"));
 57         } catch (IOException e) {
 58             e.printStackTrace();
 59         }
 60     }
 61 
 62     /**
 63      * 创建索引
 64      */
 65     public void index() {
 66         IndexWriter writer = null;
 67         try {
 68             writer = new IndexWriter(directory, new IndexWriterConfig(
 69                     Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35)));
 70             // 创建文档
 71             Document document = null;
 72             for (int i = 0; i < ids.length; i++) {
 73                 // Field.Store.YES:将会存储域值,原始字符串的值会保存在索引,以此可以进行相应的回复操作,对于主键,标题可以是这种方式存储
 74                 // Field.Store.NO:不会存储域值,通常与Index.ANAYLIZED和起来使用,索引一些如文章正文等不需要恢复的文档
 75                 // ==============================
 76                 // Field.Index.ANALYZED:进行分词和索引,适用于标题,内容等
 77                 // Field.Index.NOT_ANALYZED:进行索引,但是不进行分词,如身份证号码,姓名,ID等,适用于精确搜索
 78                 // Field.Index.ANALYZED_NOT_NORMS:进行分词,但是不进行存储norms信息,这个norms中包括了创建索引的时间和权值等信息
 79                 // Field.Index.NOT_ANALYZED_NOT_NORMS:不进行分词也不进行存储norms信息(不推荐)
 80                 // Field.Index.NO:不进行分词
 81                 document = new Document();
 82                 document.add(new Field("id", ids[i], Field.Store.YES,
 83                         Field.Index.NOT_ANALYZED_NO_NORMS));
 84                 document.add(new Field("email", emails[i], Field.Store.YES,
 85                         Field.Index.NOT_ANALYZED));
 86                 document.add(new Field("content", contents[i], Field.Store.YES,
 87                         Field.Index.ANALYZED));
 88                 // document.add(new
 89                 // Field("attach",attachs[i],Field.Store.YES,Field.Index.NOT_ANALYZED_NO_NORMS));
 90                 document.add(new Field("name", names[i], Field.Store.YES,
 91                         Field.Index.NOT_ANALYZED_NO_NORMS));
 92                 writer.addDocument(document);
 93             }
 94         } catch (CorruptIndexException e) {
 95             e.printStackTrace();
 96         } catch (LockObtainFailedException e) {
 97             e.printStackTrace();
 98         } catch (IOException e) {
 99             e.printStackTrace();
100         } finally {
101             if (writer != null) {
102                 try {
103                     writer.close();
104                 } catch (CorruptIndexException e) {
105                     e.printStackTrace();
106                 } catch (IOException e) {
107                     e.printStackTrace();
108                 }
109             }
110         }
111     }
112 
113     /**
114      * 查询索引
115      */
116     public void query() {
117         try {
118             IndexReader reader = IndexReader.open(directory);
119             System.out.println("文档数目:" + reader.numDocs());
120             System.out.println("文档总数:" + reader.maxDoc());
121         } catch (CorruptIndexException e) {
122             e.printStackTrace();
123         } catch (IOException e) {
124             e.printStackTrace();
125         }
126     }
127 }

/lucene_0200_index/src/com/b510/lucene/test/IndexTest.java

/**
 * 
 */
package com.b510.lucene.test;

import org.junit.Test;

import com.b510.lucene.util.LuceneUtil;

/**
 * @author Hongten <br />
 * @date 2013-1-31
 */
public class IndexTest {

    @Test
    public void testIndex(){
        LuceneUtil util = new LuceneUtil();
        util.index();
    }
    
    @Test
    public void testQuery(){
        LuceneUtil util = new LuceneUtil();
        util.query();
    }
}

 项目源码:http://files.cnblogs.com/hongten/lucene_0200_index.zip

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据结构与算法

P1216 [USACO1.5]数字三角形 Number Triangles

题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 ...

408120
来自专栏我有一个梦想

QT Creator 快速入门教程 读书笔记(三)

一   信号和槽   GUI 程序除了要绘制控件,还要响应系统和用户事件,例如重绘、绘制完成、点击鼠标、敲击键盘等。当事件发生时,UI 会产生相应的变化,让用户...

30980
来自专栏cloudskyme

一步一步学lucene——(第二步:示例篇)

在上面的篇幅中我们已经了解到了lucene,及lucene到底是做什么的,什么情况下才能够使用lucene,下面我们就结合一个例子来详细说明一下lucene的A...

35650
来自专栏difcareer的技术笔记

Android Linker学习笔记[转]

Linker是Android系统动态库so的加载器/链接器,要想轻松地理解Android linker的运行机制,我们需要先熟悉ELF的文件结构,再了解ELF文...

34440
来自专栏腾讯云API

腾讯云API:让你的代码更加稳定(Python版)

之前发了两个文章,是关于腾讯云API的使用的文章,主要是小Demo的展示,用来帮助初学者,或者最初使用者作为参考。但是有些人可能有疑问,或者新的想法,你这代码是...

1.4K160
来自专栏Hongten

spring开发_邮箱注册_激活_获取验证码

==============================================

37230
来自专栏菩提树下的杨过

在非SqlServer数据库上实现MemberShip和Role功能(自定义MemberShipProvider和RoleProvider)

默认情况下,.Net网站上的MemberShip和Role功能只能用于SqlServer,如果要在其它数据库,比如Access,Oracle上使用该功能该怎么办...

29590
来自专栏公众号_薛勤的博客

Java执行JavaScript脚本破解encodeInp()加密

18820
来自专栏ppjun专栏

Retrofit 使用笔记

在使用retrofit之前,你需要导入retrofit gsonconverter这些库。详情可以查看相关资料。https://github.com/squar...

17020
来自专栏小工匠技术圈

【小工匠聊密码学】--消息摘要--RIPEMD算法

14330

扫码关注云+社区

领取腾讯云代金券