Lucene是apache软件基金会 jakarta项目组的一个子项目,是一个开源的全文检索引擎工具包
Lucene的数学模型:倒排表(反向索引:从词元到文档的索引)
Lucene的文件结构:
-
索引:一个索引放在一个文件夹中
-
段:一个索引可以有很多段,段与段之间是独立的,添加新的文档可能产生新段,不同的段可以合并成新段
-
文档:文档是创建索引的基本单位,不同文档保存在不同段中,一个段可以包含多个文档
-
域:一个文档可以包含不同类型的信息,可以拆分开索引
-
词元:词是索引的最小单位,是经过词法分析和语言处理后的数据
-
-
-
-
JAVA实现demo
创建索引:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public class Lucene01
{ public static void main(String[]
args) throws Exception
{ Analyzer
analyzer = new StandardAnalyzer(); //创建标准分词器 IndexWriterConfig
indexWriterConfig = new IndexWriterConfig(analyzer); //根据分词器创建索引配置对象 indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND); //设置索引配置对象打开索引的方式为:无则新建有则追加 Directory
directory = null ; directory
= FSDirectory.open(Paths.get( "D://index/test" ));
//创建索引所在目录对象 IndexWriter
indexWriter = null ; indexWriter
= new IndexWriter(directory,
indexWriterConfig); //
根据目录,索引写配置对象创建索引写对象 Document
doc1 = new Document(); //创建文档对象 doc1.add( new StringField( "id" , "abcdef" ,
Store.YES)); //插入域 doc1.add( new TextField( "content" , "巫巫巫巫巫,啦啦啦啦啦啦啦啦" ,
Store.YES)); doc1.add( new IntField( "num" , 1 ,
Store.YES)); indexWriter.addDocument(doc1); //向索引写对象添加文档对象 indexWriter.commit(); //提交,创建索引 indexWriter.close(); //关闭索引写对象 directory.close(); //关闭文件目录,释放资源 } } |
代码步骤:
步骤 | 关键类 |
1.创建分词器 | Analyzer |
2.创建索引配置,并设置索引打开模式 | IndexWriterConfig |
3.创建索引路径对象 | Director FSDirector Paths |
4.创建索引对象 | IndexWriter |
5.创建文档对象,向文档添加域对象 | Document StringField TextField IntField |
6.提交索引创建请求,并释放资源 |
检索索引:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public static void main(String[]
args) throws Exception
{ Directory
directory = null ; directory
= FSDirectory.open(Paths.get( "D://index/test" ));
//指定索引文件所在目录 DirectoryReader
directoryReader = DirectoryReader.open(directory); //创建索引读对象 IndexSearcher
searcher = new IndexSearcher(directoryReader); //创建索引检索对象 Analyzer
analyzer = new StandardAnalyzer(); //选择相应的分词器并创建,这里为标准分词,必须与创建索引时选用的分词器一致 QueryParser
parser = new QueryParser( "content" ,
analyzer); //创建索引查询对象 Query
query = parser.parse( "巫" ); //由索引查询对象获得查询条件对象 TopDocs
topDocs = searcher.search(query, 10 ); //通过索引检索对象检索与查询条件相关的前10个文档 if (topDocs
!= null )
{ System.out.println( "符合条件的文档总数:
" +
topDocs.totalHits); //匹配文档总数 for ( int i
= 0 ;
i < topDocs.scoreDocs.length; i++) { //topDocs.scoreDocs是数组对象 Document
doc = searcher.doc(topDocs.scoreDocs[i].doc); //topDocs.scoreDocs[i].doc是个Int值,表示当前文档Index System.out.println(doc.get( "id" )); //获得该文档的id域 System.out.println(doc.get( "content" )); } } } |