lucene简介
Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单方便的工具包,可以在目标系统中实现全文检索的功能。Lucene是一套用于全文检索和搜寻的开源程式库。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。
lucene突出的优点
- (1)索引文件格式独立于应用平台。
Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
- (2)在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。
- (3)优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。
- (4)设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。
- (5)已经默认实现了一套强大的查询引擎,用户无需自己编写代码即可使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询、分组查询等等。
代码实现
环境配置
<!--第一步就是配置maven-compiler-plugin插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- 修改web.xml由2.3至3.0 -->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
步骤
1、构建索引(产生索引文件)
public class IndexStarter {
private static BlogDao blogDao = new BlogDao();
public static void main(String[] args) {
IndexWriterConfig conf = new IndexWriterConfig(new SmartChineseAnalyzer());
Directory d;
IndexWriter indexWriter = null;
try {
d = FSDirectory.open(Paths.get(PropertiesUtil.getValue("indexPath")));
indexWriter = new IndexWriter(d, conf);
List<Map<String, Object>> list = blogDao.list(null, null);//为所有数据库里的数据构建索引
for (Map<String, Object> map : list) {
Document doc = new Document();
// Field.Store.YES是否存储到硬盘
doc.add(new StringField("id", (String) map.get("id"), Field.Store.YES));
// TextField 是对一句话分词处理 如java培训机构 保存则为 java 培训 机构 三个词
doc.add(new TextField("title", (String) map.get("title"), Field.Store.YES));
doc.add(new StringField("url", (String) map.get("url"), Field.Store.YES));
indexWriter.addDocument(doc);
}
} catch (IOException | InstantiationException | IllegalAccessException | SQLException e) {
e.printStackTrace();
}finally {
try {
if(indexWriter != null) {
//关闭流
indexWriter.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
配置文件信息
indexPath=D://blogCrawler/lucene
2、读取索引文件,获取命中片段
3、使命中文件高亮显示
SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer();
IndexReader indexReader = DirectoryReader.open(FSDirectory.open(Paths.get(PropertiesUtil.getValue("indexPath"))));
IndexSearcher searcher = new IndexSearcher(indexReader);
//拿一句话到索引目录中的索引文件进行碰撞
Query query = new QueryParser("title", analyzer).parse(title);//对标题进行分词处理
TopDocs topDocs = searcher.search(query, 100);//
//高亮显示
//将碰撞出来的关键词点亮
QueryScorer queryScorer = new QueryScorer(query);
//以什么形式点亮关键值
Formatter formatter = new SimpleHTMLFormatter("<span style='color:red;'><b>", "<span><b>");
Highlighter highlighter = new Highlighter(formatter, queryScorer);
List<Map<String, Object>> blogList = new ArrayList<>();
Map<String, Object> map = null;
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
// scoreDoc 指在索引文件中查到的一条记录
map = new HashMap<>();
Document doc = searcher.doc(scoreDoc.doc);
map.put("id", doc.get("id"));
String titlehighlighter = doc.get("title");
if(StringUtils.isNotBlank(titlehighlighter)) {
titlehighlighter = highlighter.getBestFragment(analyzer, "title", titlehighlighter);
}
map.put("title", titlehighlighter);
map.put("url", doc.get("url"));
blogList.add(map);
}
request.setAttribute("blogList", blogList);
注:
Field.Store.YES是否存储到硬盘
以什么形式点亮关键值 Formatter formatter = new SimpleHTMLFormatter("<span style='color:red;'><b>", "<span><b>");