在进入正题之前,小编先介绍一下什么是结构化数据,什么是非结构化数据.


结构化数据的特点是长度和数据类型固定, 对结构化数据的搜索用sql语句

非结构化数据的特点是长度和数据类型不固定, 对非结构化数据的搜索有两种方法:(1)顺序扫描法  (2)全文检索

 

那么什么是全文检索?先建立索引,然后对索引进行搜索的过程就是全文检索.全文检索的应用领域:电商网站的站内搜索,百度

 

那么什么是Lucene?Lucene是基于java开发的全文检索工具包.

 

DocumentLucene对索引对外表示的逻辑结构,Document采用NOSql的存储理念,每个Document中有很多Field组成,Field中存储key/value对即name:XXXvalueXXX

创建索引前要将要索引的内容用Document表示,这一步就相当于提取非结构数据的信息然后结构化为Document形式        

创建索引就是针对Document中的内容进行索引,确切的说是针对DocumentField域中的内容进行索引。

 

那么如何创建文档域

wKioL1fQOvmSiaAVAACgLBhGV4k510.png

  1. 采集数据

  2. 创建document集合(因为有多条数据),一个document相当于书记库中的一行数据

  3. 遍历doucment集合,创建doucment对象

  4. 创建file对象,相当于数据库中一行一列数据

  5. Field添加到文档中

  6. 将文档添加到document集合中

 

 

示例代码(本例以添加图书到索引库中为例):

BookDao bookDao = new BookDaoImpl();

// 从数据库中查询图书信息

List<Book>bookList = bookDao.findBookList();

List<Document>docs = new ArrayList<Document>();

for (Bookbook : bookList) {

//document文档

Documentdocument = new Document();

//商品id

TextFieldid = new TextField("id", book.getId().toString(),Store.YES);

//商品名称

TextFieldname = new TextField("name", book.getName(), Store.YES);

//商品价格

FloatFieldprice = new FloatField("price", book.getPrice(),Store.YES);

//商品图片

TextFieldpic = new TextField("pic", book.getPic(), Store.YES);

//商品描述

TextFielddescription = new TextField("description",book.getDescription(),Store.YES);

//Field添加到文档中

document.add(id);

document.add(name);

document.add(price);

document.add(pic);

document.add(description);

docs.add(document);


 

文档域:

对非结构化的数据统一格式为document文档格式,一个文档有多个field域,不同的文档其field的个数可以不同,建议相同类型的文档包括相同的field

本例子一个document对应一条 book表的记录。

文档域作用:将非结构化数据进行统一结构化,将documentfield中的value值进行分词。

 

 

索引域

用于搜索,搜索程序将从索引域中搜索一个一个词,根据词找到对应的文档。

Document中的Field的内容进行分词,将分好的词创建索引,索引=Field域名:

小编个人理解为就是分好的词,就像字典中的目录

 

 

 

倒排索引表

传统方法是已知文件在文件中找内容,在文件内容中匹配搜索关键字,这种方法是顺序扫描方法,数据量大就搜索慢。

倒排索引结构是根据关键字(词语)找文档,倒排索引结构也叫反向索引结构,包括索引和文档两部分,索引即词汇表,它是在索引中匹配搜索关键字,由于索引内容量有限并且采用固定优化算法搜索速度很快,找到了索引中的词汇,词汇与文档关联,从而最终找到了文档。

 

那么怎么创建索引?

wKiom1fQPIyCHMmGAAA1KyJ5-qI170.png-wh_50

示例代码

// 创建标准分词器

AnalyzerstandardAnalyzer = new StandardAnalyzer();

// 索引操作配置信息

IndexWriterConfigindexWriterConfig = new IndexWriterConfig(

    Version.LUCENE_4_10_3,standardAnalyzer);

// 创建索引目录流对象

Directorydirectory = FSDirectory.open(new File("F:\\develop\\lucene\\indexdata"));

// 定义索引操作对象

IndexWriterindexWriter = new IndexWriter(directory, indexWriterConfig);

// 遍历目录下的文件生成的文档,调用indexWriter方法创建索引

for(Document document : docs) {

    indexWriter.addDocument(document);

}

//提交

indexWriter.commit();

// 索引操作流关闭

indexWriter.close();

 

 

 

在创建完索引我们如何查看索引是否创建成功呢

使用Luke查看索引

打开Luke方法:

cmd运行:java -jar lukeall-4.10.3.jar