Lucene (2) 构建索引

Submitted by Lizhe on Wed, 12/20/2017 - 17:19

如果想要搜索存储在硬盘上的文件,电子邮件,网页或是数据库中的数据, Lucene都可以做到

在开始搜索之前, 你必须对搜索内容进行索引.

一个文档Document对象包含若干个域Field, 每个Field都有一个标示名称, 该名称为一个文本值或者二进制值

Lucene可以对域进行3种操作

1 域值可以被索引

2 域被索引后, 还可以选择性的存储项向量

3 域值可以被单独存储

addDocument(Document) 使用默认分析器添加文档, 该分析器在创建IndexWriter对象时指定

 

删除索引中的文档

deleteDocuments(Term)  删除项的所有文档
deleteDocuments(Term[]) 删除包含项数组任一元素的所有文档
deleteDocuments(Query) 删除匹配查询语句的所有文档
deleteDocuments(Query[]) 删除匹配查询语句数组任一元素的所有文档
deleteAll() 负责删除索引中的所有文档. 该功能与关闭writer再用参数create=true重新打开writer等效

 

在所有情况下删除操作不会马上执行,而是放入内存缓冲区

与加入文档一样, 你必须调用writer的commit()或者close()方法向索引提交更改

 

更新文档

updateDocument(Term,Document)

 

分词配置

doc.add(new Field("title", title, Field.Store.YES, Field.Index.NO));

doc.add(new Field("title", title, Field.Store.YES, Field.Index.ANALYZED));

Field.Index.ANALYZED 使用分析器将域值分解成独立的语汇单元流,并使每个语汇单元能被搜索.该选项适用于普通文本域(如正文,标题,摘要等)
Field.Index.NOT_ANALYZED 对域进行索引,但不对String值进行分析. 该操作实际上将域值作为单一语汇单元并使之能被搜索.该选项适合用于索引那些不能被分解的域值. 如 URL,文件路径,日期,人名,社保号码和电话号码等.
Index.ANALYZED_NO_NORMS 这是Index.ANALYZED选项的一个变体, 它不会在索引中存储norms信息. norms记录了索引中的index-time boost信息, 但是当你进行搜索时可能会比较耗费内存.
Index.NOT_ANALYZED_NO_NORMS 与Index.NOT_ANALYZED选项类似, 但也是不存储norms.该选项常用于在搜索期间节省索引空间和减少内存耗费
Index.NO 使对应的域值不被搜索

稍微举个例子

addDoc(w, "Lu cene in Action", "193398817"); 

当使用Query q = new TermQuery(new Term("title","lu"));来进行查询时

doc.add(new Field("title", title, Field.Store.YES,Field.Index.NOT_ANALYZED)); 这个得不到结果,因为Lu cene...被作为整词处理

doc.add(new Field("title", title, Field.Store.YES,Field.Index.ANALYZED)); 可以得到结果, Lu cene 和 in , action 会被切割索引

 

Field.Store.YES 

存储域值. 原始的字符串值全部被保存在索引中,并且可由IndexReader类恢复

Field.Store.No

不存储域值

 

对文档和域进行加权操作

文档加权操作, 默认情况下, 所有文档都没有加权值 或者说 他们都拥有同样的加权值1.0

通过改变文档的加权因子, 你就能指示Lucene在计算相关性时或多或少地考虑到该文档针对索引中其他文档的重要程度.

调用加权操作的API只包含一个方法 setBoost(float)

doc.setBoost(1.5F)

域的加权操作和对文档的加权操作一样

field.setBoost(1.5F)