》
官网 http://lucene.apache.org/
下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/java/7.5.0/
》
Lucene的全文检索是指什么:
程序扫描文档,对文档document建立索引,并对文档进行分词 ik,对每一个词建立索引并关联文档document的编号(索引);
当用户进行搜索时候,按照搜索条件的分词的索引,匹配出对应的文档索引,把具体的文档展现出来,整个过程就是全文索引(倒排索引基本原理);
->
->全文检索的特点:
1、只处理文本不处理语义
2、搜索时英文不区分大小写
3、结果列表有关度 排行
》
12.19更新
倒排索引原理是什么?
1、倒排索引,实现原理创建document文档对象,并对其添加索引1;
2、搜索条件进行分词,对词条创建索引2;
3、映射索引1和索引2的关系,搜索依据索引2来查找索引1,然后找到对应的document对象;
以上的这样的一个过程,称之为倒排索引技术;
1、document建立索引
2、依据分词建立倒排索引列表、
》
1、全文检索和数据库模糊查询(或者模糊匹配)的区别:
1、数据库模糊匹配会查询出许多和期望无关的数据;
=>假设搜索it相关的:
=>select * from db where name like ‘%’ it ‘%’ 会搜索出git ,显然结果并不是我们所期望的;
2、相关度排序问题数据库无法解决;
3、数据库模糊匹配效率较低;
》
2、Lucene与Solr的关系
/
->Lucene: 是全文检索的底层API;
->Solr: 基于Lucene开发的搜索服务器;
》
3、使用Lucene需要的依赖:
<dependencies>
<!-- Junit单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- lucene核心库 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>4.10.2</version>
</dependency>
<!-- Lucene的查询解析器 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>4.10.2</version>
</dependency>
<!-- lucene的默认分词器库 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>4.10.2</version>
</dependency>
<!-- lucene的高亮显示 -->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-highlighter</artifactId>
<version>4.10.2</version>
</dependency>
<!--ik分词器 -->
<dependency>
<groupId>com.janeluo</groupId>
<artifactId>ikanalyzer</artifactId>
<version>2012_u6</version>
</dependency>
</dependencies>
》>1、创建测试类完成一次分词:
1、创建文档,添加 StringField、TextField
2、对文档分词:使用 IKAnalyzer 分词器
- FSDirectory创建目录
- DirectoryReader 读取Directory
- 搜索工具IndexSearcher
3、创建写的工具:
- 配置IndexWriterConfig写的配置,设置规则
- 生成写的对象IndexWriter
4、提交关闭
- commit
- close
》
以下测试源码分享地址:
https://github.com/medoo-Ai/lucene
/**
* @auther SyntacticSugar
* @data 2018/11/23 0023上午 11:37
*/
public class CreateIndexTest {
/**
* 给 文档添加fieldName /FieldText/store 是yes or no 控制是否保存
*/
@Test
public void createIndexTest() {
Document document = new Document();
// LongField 为数字范围查找做铺垫
document.add(new LongField("id", 1L, Field.Store.YES));
document.add(new TextField("title", "谷歌地图之父跳槽facebook厉害了我的哥碉堡了" +
"蓝瘦香菇", Field.Store.YES));
// 创建储存目录、分词
try {
FSDirectory indexDir = FSDirectory.ope