Lucene简单使用
什么是Lucene?
Lucene是apache下的一个开放源代码的全文检索工具包。提供了完整的搜索引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,方便的在目标系统中实现全文检索功能。
全文检索的应用场景
对于数据量大、非结构化数据的查询。
- 搜索引擎 Google 百度 …
- 站内搜索 京东 招聘网站 …
- 垂直搜索 类似于视频网站,公司之间共用一家索引库,可以实现公司之间互相搜索内容
通过对数据分词后创建索引,再对索引进行搜索的过程就叫全文检索,虽然创建索引的过程是非常耗时的,但是索引一旦创建后可以多次使用,全文检索主要处理的是查询,所以消耗时间来创建索引为此增加数据检索的效率是值得的。
简单使用Lucene

创建索引
- 获取原始文档
搜索引擎原始文档 —> 互联网的页面
站内原始文档 —> 指的是MySQL
- 构建文档对象
文档对象是Lucene中的Document对象
- 分析文档(分词)
- 保存就是一个一个的term(由域名和分词后的内容组成的),是Lucene中存储的最小单元,在存储时每一个term都会对应所属的document
由一个term查询到document文档, 这种结构称为倒排索引结构
查询索引
- 创建用户接口:提供用户输入关键字的地方
- 创建查询,查询的域名或关键字
- 执行查询
- 渲染结果
使用SpringBoot 操作 lucene
- 创建一个Maven工程。
省略…
- 导入相关依赖。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!--lucene核心包-->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>4.10.3</version>
</dependency>
<!--lucene分词器-->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>4.10.3</version>
</dependency>
<!--IK分词器-->
<dependency>
<groupId>com.janeluo</groupId>
<artifactId>ikanalyzer</artifactId>
<version>2012_u6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>- 创建SpringBoot引导类。
@SpringBootApplication
@MapperScan("com.cml.mappers")//映射路径
public class LuceneApplication {
public static void main(String[] args) {
SpringApplication.run(LuceneApplication.class,args);
}
}- 配置yml文件。
省略…(配置一下数据库的路径)
- 创建索引。
@RunWith(SpringRunner.class)
@SpringBootTest
@Component
public class LuceneDemo {
@Autowired //依赖注入,集成了通用mapper的接口,方便从数据库中那数据
private JobInfoMapper jobInfoMapper;
@Test
public void save() throws Exception {
//Directory d, 目录,把索引放在什么位置
Directory directory = FSDirectory.open(new File("D:\\luceneIndex"));
//IndexWriterConfig conf 配置
//Version matchVersion 版本
// Analyzer analyzer 分词器
Analyzer analyzer = new IKAnalyzer(); //中文分词器
/*
如果不使用ik分词器,搜索中文的时候会出现问题
*/
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LATEST, analyzer);
//保存文件的对象
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
//从数据库中查找准备好的数据
List<JobInfo> jobInfoList = jobInfoMapper.selectAll();
//循环添加到document中
for (JobInfo jobInfo : jobInfoList) {
Document document = new Document();
String companyName = jobInfo.getCompanyName();
String jobName = jobInfo.getJobName();
Integer salary = jobInfo.getSalary();
String url = jobInfo.getUrl();
//参数1:域名
//参数2:保存内容
//参数3: 是否保存原文件
document.add(new TextField("companyName", companyName, Field.Store.YES));
document.add(new TextField("jobName", jobName, Field.Store.YES));
document.add(new IntField("salary", salary, Field.Store.YES));
document.add(new StringField("url", url, Field.Store.YES));
//将数据保存到数据库
indexWriter.addDocument(document);
}
indexWriter.close();
}
@Test
public void find() throws Exception {
//获得索引库的位置
Directory directory = FSDirectory.open(new File("D:\\luceneIndex"));
//创建文件读取对象
IndexReader indexReader = DirectoryReader.open(directory);
//获得索引查询对象
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//new Term(域名,查询内容,最多显示数量)
TopDocs topDocs = indexSearcher.search(new TermQuery(new Term("companyName", "北京")), 10);
int totalHits = topDocs.totalHits;
System.out.println("总数:" + totalHits);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
//获得每一个Document的id
int docId = scoreDoc.doc;
//根据id查找每一个documented对象
Document doc = indexSearcher.doc(docId);
System.out.println(doc.get("companyName"));
System.out.println(doc.get("jobName"));
System.out.println(doc.get("salary"));
System.out.println(doc.get("url"));
System.out.println("---------------------------------------------------");
}
indexReader.close();
}
}以上是Lucene的简单使用,但是项目中不会使用Lucene这种原生代码的方式,所以需要借助一个成熟的项目或软件来实现,目前比较有名是Solr和ElasticSearch。
















