在进入正题之前,小编先介绍一下什么是结构化数据,什么是非结构化数据.
结构化数据的特点是长度和数据类型固定, 对结构化数据的搜索用sql语句
非结构化数据的特点是长度和数据类型不固定, 对非结构化数据的搜索有两种方法:(1)顺序扫描法 (2)全文检索
那么什么是全文检索呢?先建立索引,然后对索引进行搜索的过程就是全文检索.全文检索的应用领域:电商网站的站内搜索,百度
那么什么是Lucene呢?Lucene是基于java开发的全文检索工具包.
Document是Lucene对索引对外表示的逻辑结构,Document采用NOSql的存储理念,每个Document中有很多Field组成,Field中存储key/value对即name:XXX,value:XXX
创建索引前要将要索引的内容用Document表示,这一步就相当于提取非结构数据的信息然后结构化为Document形式 。
创建索引就是针对Document中的内容进行索引,确切的说是针对Document中Field域中的内容进行索引。
那么如何创建文档域呢
采集数据
创建document集合(因为有多条数据),一个document相当于书记库中的一行数据
遍历doucment集合,创建doucment对象
创建file对象,相当于数据库中一行一列数据
将Field添加到文档中
将文档添加到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表的记录。
文档域作用:将非结构化数据进行统一结构化,将document中field中的value值进行分词。
索引域:
用于搜索,搜索程序将从索引域中搜索一个一个词,根据词找到对应的文档。
将Document中的Field的内容进行分词,将分好的词创建索引,索引=Field域名:词
小编个人理解为就是分好的词,就像字典中的目录
倒排索引表
传统方法是已知文件在文件中找内容,在文件内容中匹配搜索关键字,这种方法是顺序扫描方法,数据量大就搜索慢。
倒排索引结构是根据关键字(词语)找文档,倒排索引结构也叫反向索引结构,包括索引和文档两部分,索引即词汇表,它是在索引中匹配搜索关键字,由于索引内容量有限并且采用固定优化算法搜索速度很快,找到了索引中的词汇,词汇与文档关联,从而最终找到了文档。
那么怎么创建索引呢?
示例代码
// 创建标准分词器
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
转载于:https://blog.51cto.com/wangfoye/1847527