Lucene4它是非常优秀的开源的全文检索框架,但是不是一个引擎,与搜索引擎是有差异的,最少需要爬虫以及对数据的储存管理等。它主要用于解决一些sql代码无法完成或者完成需要许多like、or的sql语句问题,也就是全文检索:将要查询的目标文档中的词提取出来,组成索引,通过查询索引达到搜索目标文档的目的。这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)
结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。
非结构化数据: 指不定长或无固定格式的数据,如邮件,word文档等。
Lucene 官网下载网址http://lucene.apache.org
本文事例为了同一版本:lucene-4.10.3.zip (学习的版本) 2014.12.10发布的。
luke查看索引库工具下载地址:https://github.com/DmitryKey/luke/releases
项目为打包类型为jar的项目
pom.xml
4.0.0
com.linge
lucene_test
0.0.1-SNAPSHOT
junit
junit
4.12
test
log4j
log4j
1.2.17
org.apache.lucene
lucene-core
4.10.3
org.apache.lucene
lucene-analyzers-common
4.10.3
org.apache.lucene
lucene-queryparser
4.10.3
org.apache.lucene
lucene-sandbox
org.apache.lucene
lucene-queries
org.apache.lucene
lucene-analyzers-smartcn
4.10.3
org.apache.lucene
lucene-highlighter
4.10.3
org.wltea
IKAnalyzer
2012FF
org.apache.maven.plugins
maven-compiler-plugin
3.1
1.7
utf-8
采集数据——>构建文档对象——>分析文档(分词)——>创建索引
四个基本步骤可以分开为七步
1、 配置依赖jar包(lucene-core-4.10.3.jar、lucene-analyzers-common-4.10.3.jar)
/**
* 写索引到索引库
* @author LinGe
* @email [email protected]
* @version 1.0
*/
public class IndexWriterTest {
@Test
public void test() throws Exception{
/** 创建索引库存储目录 */
Directory directory = FSDirectory.open(new File("D:\\Lucene4\\lucene_index"));
/** 创建分词器(单字分词器) */
Analyzer analyzer = new StandardAnalyzer();
/** 创建写索引需要的配置信息对象 */
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
/**
* 设置打开索引库的模式
* OpenMode.CREATE": 每次都重新创建索引库
* OpenMode.APPEND: 追加模式(不会创建索引库)
* OpenMode.CREATE_OR_APPEND: 如果没有创建,第一次创建索引库,后面都是追加模式
* */
indexWriterConfig.setOpenMode(OpenMode.CREATE);
/**
* 创建IndexWriter对象(对索引库做CUD操作)
* 第一个参数:索引库存储目录
* 第二个参数:写索引需要的配置信息对象
* */
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
/** 获取文件目录 */
File dir = new File("D:\\Lucene4\\file");
int cursor = 1;
/** 迭代所有的文件,写入索引库 */
for (File file : dir.listFiles()){
/** 一个文件对应一个文档 */
Document doc = new Document();
/** 添加字段 */
doc.add(new StringField("id", String.valueOf(cursor++), Store.YES));
doc.add(new TextField("name", file.getName(), Store.YES));
doc.add(new TextField("filePath", file.getPath(), Store.YES));
doc.add(new TextField("fileContent", new InputStreamReader(new FileInputStream(file), "gbk")));
doc.add(new TextField("content", readFile(file), Store.YES));
doc.add(new IntField("int", cursor * 10, Store.YES));
doc.add(new FloatField("float", cursor * 50.5f, Store.YES));
doc.add(new DoubleField("double", cursor * 100.5d, Store.YES));
doc.add(new LongField("long", cursor * 1000l, Store.YES));
doc.add(new StoredField("stored", "只存储: " + cursor));
/** 定义字段类型 */
FieldType ft = new FieldType();
ft.setStored(true); // 是否存储
ft.setIndexed(true); // 是否创建索引
ft.setTokenized(true); // 是否分词
Field field = new Field("field", "传智" + cursor, ft);
doc.add(field);
indexWriter.addDocument(doc);
indexWriter.commit();
}
indexWriter.close();
}
private String readFile(File file) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "gbk"));
String line = null;
String res = "";
while((line = br.readLine()) != null){
res += line;
}
br.close();
return res;
}
}