lucene
2015年6月26日
1 目标:查询目标词汇所在的相关文档。
参考:http://www.cnblogs.com/forfuture1978/category/300665.html
2 原理:创建目标文档的分词索引,查找目标分词的相关文档。
创建索引:将目标文档进行分词,根据分词创建文档分词索引。将不同文档的索引进行合并,建立文件夹分词索引。通过单一文档和所有文档中出现的频率进行权重排序。
查询索引:查询分词并设置索引,查询后将结果进行权重排序。
3 方法:lucene
全文检索:结构化数据通常使用数据库进行查询、管理。非结构化数据又称全文数据,使用顺序查询、操作时,效率低。通过将全文数据分类,为全文数据建立结构化的索引,方便检索的过程称之为全文检索。
正向索引:为每个文件中的内容创建索引信息,通过文档查找内容的索引。
反向索引:为文件中每个词创建索引信息,通过词查找所在文件的索引。
字典:目标是索引的关键词,方法是通过分词器将文本中的词进行分解,得到所有关键词信息,称为字典。
Lucene:Apache的开源项目,仅支持纯文本全文检索。包括创建索引和查询索引两个主要功能。
4 方法:创建索引,IndexWriter。
目标:使用分词器,将文档创建为索引,并输出到指定目录。
方法:
配置索引信息:IndexWriterConfig。
添加索引内容:addDocuement()将文档加入到索引。
生成索引:默认在close()时生成索引。
操作索引:可以添加、删除、更新索引内容。
4.1 配置信息:IndexWriterConfig
使用分词器作为参数。
示例:
4.2 文档:纯文本文档,Document。
目标:代表一个原始文件。其中存储字符串。
方法:由多个Field组成,每个Field由Key-value-type组成。
4.3 分词器:Analyzer。
目标:将文档进行分词,生成字典。
方法:常用的英文分词器是StandardAnalyzer,中文分词器为cjk,cn,smartcn等。
4.4 文档目录:Directory。
目标:索引的最终输出结果。可以保存于文件系统或内存中。
方法:FSDirectory,RAMDirectory。
4.4.1文件系统输出:FSDirectory。
目标:文件系统输出目录。
方法:针对不同的环境有三个子类实现,使用open()可以自动根据当前环境选择最合适的子类。
open()需要一个Path接口,由Paths提供。Paths类提供两个静态函数,将URI或String转换为Path对象。
4.4.2文件系统输出:RAMDirectory。
目标:内存中快速处理的输出目录。
方法:小数据量时使用,缓存1KB。如果超过百M,则浪费内存。
4.4.3生成内容:索引文件
整个输出目录作为一个完整的索引文件。
组织:段segment(具有相同的前缀,文档组),文档document(),域field,词term。既有正向索引,又有反向索引。
段信息: segment_xxx。
域信息:.fxx。
词信息:.txx。
4.5 示例
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//create index
Document doc=new Document();
doc.add(new Field("myField", "This is atest document,1234xxx",org.apache.lucene.document.TextField.TYPE_STORED));
//Directory output=new RAMDirectory();//write index to ram
Directoryoutput=FSDirectory.open(Paths.get("test_xx_path"));//result indexdirectory of file system
Analyzer analyzer=new StandardAnalyzer();
IndexWriterConfig cfg=new IndexWriterConfig(analyzer);
IndexWriter writer=new IndexWriter(output, cfg);
writer.addDocument(doc);
writer.close();
System.out.println("OK");
}
5 方法:查询索引,IndexSearcher。
目标:使用分词器分解查询内容构建查询,从索引目录中查询分词并输出结果。
方法:
5.1 构建查询:QueryPaser
分解查询:QueryParser,使用与索引生成时相同的分词器进行分解(可以指定Field)。
构建查询:parse()。
5.2 查询:IndexSearcher。
读入索引:DirectoryReader。使用open打开索引目录Dictionary。使用完成之后要close()。
查询:search()。
5.3 示例
/**
*
*/
package com.thbd.luceneTest;
import java.awt.TextField;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
importorg.apache.lucene.queryparser.classic.ParseException;
importorg.apache.lucene.queryparser.classic.QueryParser;
importorg.apache.lucene.search.IndexSearcher;
importorg.apache.lucene.search.Query;
importorg.apache.lucene.search.ScoreDoc;
importorg.apache.lucene.store.*;
importorg.apache.lucene.analysis.*;
importorg.apache.lucene.analysis.standard.StandardAnalyzer;
importorg.apache.lucene.document.*;
importorg.apache.lucene.index.*;