指具有固定格式或有限长度的数据,如Oracle或Mysql中的数据。 使用SQL语句查询结构化数据,速度快 数据量大时,可以在数据库中建立索引,但此时创建的索引不支持模糊查询,需要创建另外一套索引库。
非结构化数据指不定长度和固定格式的数据,如邮件、word文档等磁盘上的文件。
常见的结构化数据也就是数据库只能够的数据。在数据库中搜索很容易实现,通常都是使用sql语句进行查询,而且能够很快的得到查询结果。
为什么数据库搜索很容易呢?因为数据库中的数据存储是有规律的,有行有列而且数据格式,数据长度都是固定的
所谓的顺序检索,就是在查找某一个字符串文件时,会一个一个文档去一一查看,对于每一个文档都会从头看到尾,直到找到某文档包含该字符串,则返回此文档,速度是相当的慢。
全文检索将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定的结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。 这种先建立索引,再对索引进行搜索的过程叫做全文搜索。
Lucene是apache下的一个开放源代码的全文检索引擎工具包。提供了完整的查询引擎和索引引擎,部分文本分析引擎,Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能。
确定原始内容–>采集文档–>创建文档–>分析文档–>索引文档
2.红色表示搜索过程,从索引库中搜索内容,搜索过程包括用户通过搜索界面–>创建查询–>执行搜索–>渲染搜索结果
场景一:搜索引擎:指的是互联网上的所有网页 场景二:站内搜索:指的是磁盘上的文件或表中的数据
获取源文档的方式?场景一:搜索引擎:网络爬虫 场景二:站内搜索:IO流、SQL查询
一个Document对象中放的是:一个网页内容、一个文件内容、或表中某行某列的数据、
自定义的域名称、spring是此域中的值、name: spring就是一个词汇term 一个文档中可以有多个域,不同的文档可以有不同的域 创建索引是对语汇单元索引,通过词语找文档,这种索引的结构叫做倒排索引结构,比如新华字典。
1)用户查询接口:就是用户输入关键字的位置 2)创建查询 3)执行查询 4)渲染结果
场景:给磁盘的文件创建索引 步骤:
1、指定索引库位置 Directory 2、创建写入索引的对象 IndexWriter 3、获取源文档IO流 4、把文档写入索引库 indexWriter.addDocument(doc); 5、关闭资源IndexWriter package com.lucene.demo; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.Field.Store; import org.apache.lucene.document.TextField; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; public class IndexWriterTest { public static void main(String[] args) throws IOException { // 1.指定索引库位置 Directory directory = FSDirectory.open(new File("/Users/xiayubao/Desktop/indexRepo")); // 创建一个 标准的分词器 Analyzer analyzer = new StandardAnalyzer(); // 第二个参数,分析器对象 IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer); // 2.创建写入索引IndexWriter对象 IndexWriter indexWriter = new IndexWriter(directory, config); // 3.获取源文档 File srcFile = new File("/Users/xiayubao/Desktop/searchsource"); File[] listFiles = srcFile.listFiles(); for (File file : listFiles) { Document doc = new Document(); // 获取文件名称 String fileName = file.getName(); // 创建文件名域 // 第一个参数:域的名称 // 第二个参数:域的内容 // 第三个参数:是否存储 Field nameFiled = new TextField("name", fileName, Store.YES); doc.add(nameFiled); // 获取文件大小 long fileSize = FileUtils.sizeOf(file); Field sizeField = new TextField("size", fileSize + "", Store.YES); doc.add(sizeField); // 获取文件路径 String filePath = file.getPath(); Field PathField = new TextField("path", filePath, Store.YES); doc.add(PathField); // 获取文件内容 String fileContent = FileUtils.readFileToString(file); Field contentField = new TextField("content", fileContent, Store.YES); doc.add(contentField); // 4.把文档写入索引库 indexWriter.addDocument(doc); } // 5.关闭资源indexWriter indexWriter.close(); } }使用luke工具查看索引文件