Lucene
源码地址:LuceneDemo码云
全文检索技术
传统搜索流程
基于Lucene搜索流程
1、Lucene
1.1、什么是Lucene
全文检索引擎工具包
通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式
1.2、主要功能
构建索引库(以数据库中的数据构建)
-
创建文档
将数据库查询的每条数据信息“赋值”给创建的每个Document对象
-
分析文档,创建索引库
处理生成的Document对象(包括:设置分词器,索引库生成路径)
将生成的多个Document对象写入这个配置类
-
索引库作用:就是通过关键字搜索,和被索引的分词进行比较,从未快速找到Document(文档)
-
主要代码
ps:查询的Car类型的list集合中,每一个car只有一个String类型的carName属性
/* * 根据数据库数据建立索引库 * */ public static void createIndexDataBase(List<Car> cars) throws IOException { //1、采集数据 //2、创建Document对象 ArrayList<Document> documents = new ArrayList<>(); for (Car car : cars) { Document document = new Document(); // Document文档中添加Field域 // 汽车名称 // Store.YES:表示存储到文档域中 document.add(new TextField("carName", car.getBName(), Field.Store.YES)); // 把Document放到list中 documents.add(document); // 3. 创建Analyzer分词器,分析文档,对文档进行分词 // Analyzer analyzer = new StandardAnalyzer(); IKAnalyzer analyzer = new IKAnalyzer(); // 4. 创建Directory对象,声明索引库的位置 Directory directory = FSDirectory.open(Paths.get("/root/matengfei/demo/database/car")); // 5. 创建IndexWriteConfig对象,写入索引需要的配置 IndexWriterConfig config = new IndexWriterConfig(analyzer); // 6.创建IndexWriter写入对象 IndexWriter indexWriter = new IndexWriter(directory, config); // 7.写入到索引库,通过IndexWriter添加文档对象document for (Document doc : documents) { indexWriter.addDocument(doc); } // 8.释放资源 indexWriter.close(); } }
查询索引库,返回结果
-
封装关键字
-
执行搜索
-
主要代码
public static String parseKey(String keyWord) throws IOException, ParseException { // 1. 创建Query搜索对象 // 创建分词器 // Analyzer analyzer = new StandardAnalyzer(); IKAnalyzer analyzer = new IKAnalyzer(); // 创建搜索解析器,第一个参数:默认Field域,第二个参数:分词器 QueryParser queryParser = new QueryParser("carName", analyzer); // 创建搜索对象 Query query = queryParser.parse(keyWord); // 2. 创建Directory流对象,声明索引库位置 Directory directory = FSDirectory.open(Paths.get("/root/matengfei/demo/database/car")); // 3. 创建索引读取对象IndexReader IndexReader reader = DirectoryReader.open(directory); // 4. 创建索引搜索对象 IndexSearcher searcher = new IndexSearcher(reader); // 5. 使用索引搜索对象,执行搜索,返回结果集TopDocs // 第一个参数:搜索对象,第二个参数:返回的数据条数,指定查询结果最顶部的n条数据返回 TopDocs topDocs = searcher.search(query, 1); System.out.println("查询到的数据总条数是:" + topDocs.totalHits); // 获取查询结果集 ScoreDoc[] docs = topDocs.scoreDocs; String result = null; // 6. 解析结果集 for (ScoreDoc scoreDoc : docs) { // 获取文档 int docID = scoreDoc.doc; Document doc = searcher.doc(docID); System.out.println("============================="); System.out.println("id:" + docID); System.out.println("carName:" + doc.get("carName")); result = doc.get("carName"); } reader.close(); return result; }
1.3、底层结构
Lucene底层是一个倒排索引,这个索引结构主要分为两部分:索引和文档,通过关键字查询时,比较关键字和索引,从而找到对应文档。
索引
- 一行目录就是一个索引,在Lucene中一个索引是放在一个文件夹中的
段
- 一个索引由多个段组成
文档
- 文档是建立索引的基本单位,一个段中可以包含多篇文档
域(Field)
- 一篇文档包含不同类型的信息,也就是不同的域,比如一篇文章的标题、时间、描述等
Lucene3.0之前(跳表)
跳表原理类似于二分查找,前提是建立跳表之前(多级链表)底层原始链表有序
Lucene3.0之后(FST原理)
…文章来源:https://www.toymoban.com/news/detail-731881.html
2、Lucene相关度排序
后续会更新基于Lucene实现博客系统相同兴趣和领域方向的博主推荐!!!文章来源地址https://www.toymoban.com/news/detail-731881.html
到了这里,关于了解Lucene(车辆名称映射Demo)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!