Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包.

粘贴这句话的意思就是想说明  Lucene仅仅是一个工具包,搜索引擎的工具包.

有人会问?Lucene和solr的区别,solr是一个搜索系统,打个比方,就如servlet和struts2的区别   Lucene就是servlet,solr就好比solr,solr封装了Lucene.

下面说说Lucene的原理:

我们使用Lucene,其实使用的是他的倒排查询

什么是倒排查询?举个例子

新华字典,我们都用过吧,新华字典分为两部分,第一部门就是目录的边旁部首,第二部分就是正文,一个一个字的解释,

我们在用新华字典的时候,一般我们都是通过边旁部首找字,没有人一页一页的翻字典找字吧.

Lucene的倒排就是如此,他会检索文本,数据库,web网页,在把内容分词,就像边旁部首

再次强调

搜索引擎(百度,谷歌)和lucene的区别
搜索引擎就是一个应用,lucene就是一个搜索工具类

name:lucene表示要搜索name这个Field域中,内容为“lucene”的文档。
desc:lucene AND desc:java 表示要搜索即包括关键字“lucene”也包括“java”的文档。
 
看不懂没关系
我接下来说明Doucment和Field关系
这里我用数据库中的一条数据说明

这一条数据就是一个document文档

每一个字段就是一个Field域

这样说是不是豁然开朗了.
 
 
接下来,我们说说分词器
这个lucene是外国人搞得,对中文的支持不说你也知道,不多外国人也想到这一点,"我是中国人">>我  是  中  国  人   >> 这样的效果其实还不是我们想要的,我们要的是"中国","国人"这样的词汇,这里我也不打哑谜了,市场上有很多中文分词器,无敌的存在我觉得就是IK了,这是一个jar包,导入项目即可,说他无敌是因为他可以自己加词,比如"屌丝","高富帅",这也词,可以自己加到分词器中,让程序认得.

这就是要用到的包;

ik下载后把这3个文件也要导入项目中,ext.dic是加词的,stop是停词的.

前面的都是Lucece的理论,只有理论搞懂了,下面的代码实现过程也就轻松了

 package com.itheima.lucene;

 import java.io.File;
import java.util.ArrayList;
import java.util.List; 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.Store;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;
import org.wltea.analyzer.lucene.IKAnalyzer; import com.itheima.dao.BookDao;
import com.itheima.dao.impl.BookDaoImpl;
import com.itheima.pojo.Book; public class CreateIndexTest {
//分词
@Test
public void testCreateIndex() throws Exception{
// 1. 采集数据
BookDao bookDao = new BookDaoImpl();
List<Book> listBook = bookDao.queryBookList(); // 2. 创建Document文档对象
List<Document> documents = new ArrayList<>();
for (Book bk : listBook) { Document doc = new Document();
doc.add(new TextField("id", String.valueOf(bk.getId()), Store.YES));// Store.YES:表示存储到文档域中
doc.add(new TextField("name", bk.getName(), Store.YES));
doc.add(new TextField("price", String.valueOf(bk.getPrice()), Store.YES));
doc.add(new TextField("pic", bk.getPic(), Store.YES));
doc.add(new TextField("desc", bk.getDesc(), Store.YES)); // 把Document放到list中
documents.add(doc);
} // 3. 创建分析器(分词器)
//Analyzer analyzer = new StandardAnalyzer();
//中文 IK
Analyzer analyzer = new IKAnalyzer(); // 4. 创建IndexWriterConfig配置信息类
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer); // 5. 创建Directory对象,声明索引库存储位置
Directory directory = FSDirectory.open(new File("H:\\temp")); // 6. 创建IndexWriter写入对象
IndexWriter writer = new IndexWriter(directory, config); // 7. 把Document写入到索引库中
for (Document doc : documents) {
writer.addDocument(doc);
} // 8. 释放资源
writer.close();
} //查
@Test
public void serachIndex() throws Exception{
//创建分词器 必须和检索时的分析器一致
Analyzer analyzer = new StandardAnalyzer();
// 创建搜索解析器,第一个参数:默认Field域,第二个参数:分词器
QueryParser queryParser = new QueryParser("desc", analyzer); // 1. 创建Query搜索对象
Query query = queryParser.parse("desc:java AND lucene"); // 2. 创建Directory流对象,声明索引库位置
Directory directory = FSDirectory.open(new File("H:\\temp")); // 3. 创建索引读取对象IndexReader
IndexReader indexReader = DirectoryReader.open(directory); // 4. 创建索引搜索对象IndexSearcher
IndexSearcher indexSearcher = new IndexSearcher(indexReader); // 5. 使用索引搜索对象,执行搜索,返回结果集TopDocs
// 第一个参数:搜索对象,第二个参数:返回的数据条数,指定查询结果最顶部的n条数据返回
TopDocs topDocs = indexSearcher.search(query, 10);
System.out.println("查询到的数据总条数是:" + topDocs.totalHits);
//获得结果集
ScoreDoc[] docs = topDocs.scoreDocs; // 6. 解析结果集
for (ScoreDoc scoreDoc : docs) {
//获得文档
int docID = scoreDoc.doc;
Document doc = indexSearcher.doc(docID); System.out.println("docID:"+docID);
System.out.println("bookid:"+doc.get("id"));
System.out.println("pic:"+doc.get("pic"));
System.out.println("name:"+doc.get("name"));
System.out.println("desc:"+doc.get("desc"));
System.out.println("price:"+doc.get("price"));
} // 7. 释放资源
indexReader.close();
}
}

Lucence的更多相关文章

  1. lucence.net+盘古分词

    第一步: 添加盘古和lucence的dll引用 第二步: 拷贝Dict文件夹到项目  demo里面是Dictionaries 不过官方建议改成Dict 然后把所有项右击属性 改为“如果较新则复制” 第 ...

  2. Lucence工作原理

    lucence 是一个高性能的java全文检索工具包,他使用倒排序文件索引结构,改结构和相应的生成算法如下: 一.设有两篇文章1和2      文章1的内容为:Tom lives in guangzh ...

  3. lucence学习系列之一 基本概念

    1. Lucence基本概念 Lucence是一个java编写的全文检索类库,使用它可以为一个应用或者站点增加检索功能. 它通过增加内容到一个全文索引来完成检索功能.然后允许你基于这个索引去查询,返回 ...

  4. Lucence使用入门

    参考: https://blog.csdn.net/u014209975/article/details/50525624 https://www.cnblogs.com/hanyinglong/p/ ...

  5. apache开源项目--lucence

    Lucene 是apache软件基金会一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎.Lucene的目的是为软件开发人员提供一个简单易用 ...

  6. Lucence.net索引技术 二

    一. Lucene索引创建和优化 [版本2.9.0以上] Lucene索引的创建首先需要取得几个必须的对象: 1.分词器//可以采用其他的中文分词器 StandardAnalyzer analyzer ...

  7. Lucence.net索引技术 一

    1.建立索引 为了对文档进行索引,Lucene 提供了五个基础的类,他们分别是 Document, Field, IndexWriter, Analyzer, Directory.下面我们分别介绍一下 ...

  8. Lucence.Net+添加关键词+分页+排序

    1.使用queryparser完成解析搜索请求 2.基本格式如: QueryParser parser=new QueryParser("字段名称","分析器实例&quo ...

  9. Lucence.Net学习+盘古分词

    创建索引库          //读取文件,存储到索引库           public string CreateDatebase()         {         //获取索引库的路径   ...

随机推荐

  1. 从foreach语句枚举元素看数组

    在foreach语句中使用枚举,可以迭代数组或集合中的元素,且无须知道集合中的元素的个数.如图显示了调用foreach方法的客户端和集合之间的关系.数组或集合实现带GetEnumerator()方法的 ...

  2. 单源最短路Dijkstra算法——matlab实现

    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijk ...

  3. js闭包绑定元素

    闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. 作为一个函数变量的一个引用,当函数返回时,其处于激活状 ...

  4. hdu2059 龟兔赛跑 DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2059 虽然 知道是DP ,刚开始一直没有想出状态转移方程. 刚开始的思路就是定义dp[i]表示到达第i ...

  5. Tomcat--各个目录详解(二)

    Tomcat整体目录: 一.bin文件(存放启动和关闭tomcat脚本) 其中.bat和.sh文件很多都是成对出现的,作用是一样的,一个是Windows的,一个是Linux. ① startup文件: ...

  6. Tomcat--安装与部署(一)

    一.Tomcat背景 自从JSP发布之后,推出了各式各样的JSP引擎.Apache Group在完成GNUJSP1.0的开发以后,开始考虑在SUN的JSWDK基础上开发一个可以直接提供Web服务的JS ...

  7. Redis学习-String

    命令  描述  复杂的  返回值 SET key value [EX seconds] [PX milliseconds] [NX|XX] 将字符串值value关联到key.如果key已经持有其他值, ...

  8. 在Caffe上运行Cifar10示例

    准备数据集 在终端上运行以下指令: cd caffe/data/cifar10 ./get_cifar10.sh cd caffe/examples/cifar10 ./create_cifar10. ...

  9. springcloud(三):服务提供与调用

    上一篇文章我们介绍了eureka服务注册中心的搭建,这篇文章介绍一下如何使用eureka服务注册中心,搭建一个简单的服务端注册服务,客户端去调用服务使用的案例. 案例中有三个角色:服务注册中心.服务提 ...

  10. CollectioView滚动到指定section的方法

    项目中的需求:collectionView顶部有一个scrollView组成的标签,点击标签,让collectionView滚动到指定的行,滚动collectionView自动切换到顶部指定的标签 实 ...