Lucence

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的理论,只有理论搞懂了,下面的代码实现过程也就轻松了

  1 package com.itheima.lucene;
  2
  3 import java.io.File;
  4 import java.util.ArrayList;
  5 import java.util.List;
  6
  7 import org.apache.lucene.analysis.Analyzer;
  8 import org.apache.lucene.analysis.standard.StandardAnalyzer;
  9 import org.apache.lucene.document.Document;
 10 import org.apache.lucene.document.Field.Store;
 11 import org.apache.lucene.document.TextField;
 12 import org.apache.lucene.index.DirectoryReader;
 13 import org.apache.lucene.index.IndexReader;
 14 import org.apache.lucene.index.IndexWriter;
 15 import org.apache.lucene.index.IndexWriterConfig;
 16 import org.apache.lucene.queryparser.classic.QueryParser;
 17 import org.apache.lucene.search.IndexSearcher;
 18 import org.apache.lucene.search.Query;
 19 import org.apache.lucene.search.ScoreDoc;
 20 import org.apache.lucene.search.TopDocs;
 21 import org.apache.lucene.store.Directory;
 22 import org.apache.lucene.store.FSDirectory;
 23 import org.apache.lucene.util.Version;
 24 import org.junit.Test;
 25 import org.wltea.analyzer.lucene.IKAnalyzer;
 26
 27 import com.itheima.dao.BookDao;
 28 import com.itheima.dao.impl.BookDaoImpl;
 29 import com.itheima.pojo.Book;
 30
 31 public class CreateIndexTest {
 32     //分词
 33     @Test
 34     public void testCreateIndex() throws Exception{
 35     //    1. 采集数据
 36         BookDao bookDao = new BookDaoImpl();
 37         List<Book> listBook = bookDao.queryBookList();
 38
 39     //    2. 创建Document文档对象
 40         List<Document> documents = new ArrayList<>();
 41         for (Book bk : listBook) {
 42
 43             Document doc = new Document();
 44             doc.add(new TextField("id", String.valueOf(bk.getId()), Store.YES));// Store.YES:表示存储到文档域中
 45             doc.add(new TextField("name", bk.getName(), Store.YES));
 46             doc.add(new TextField("price", String.valueOf(bk.getPrice()), Store.YES));
 47             doc.add(new TextField("pic", bk.getPic(), Store.YES));
 48             doc.add(new TextField("desc", bk.getDesc(), Store.YES));
 49
 50             // 把Document放到list中
 51             documents.add(doc);
 52         }
 53
 54     //    3. 创建分析器(分词器)
 55         //Analyzer analyzer = new StandardAnalyzer();
 56         //中文  IK
 57         Analyzer analyzer = new IKAnalyzer();
 58
 59     //    4. 创建IndexWriterConfig配置信息类
 60         IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
 61
 62     //    5. 创建Directory对象,声明索引库存储位置
 63         Directory directory = FSDirectory.open(new File("H:\\temp"));
 64
 65     //    6. 创建IndexWriter写入对象
 66         IndexWriter writer = new IndexWriter(directory, config);
 67
 68     //    7. 把Document写入到索引库中
 69         for (Document doc : documents) {
 70             writer.addDocument(doc);
 71         }
 72
 73     //    8. 释放资源
 74         writer.close();
 75     }
 76 

//查
 77     @Test
 78     public void serachIndex() throws Exception{
 79         //创建分词器   必须和检索时的分析器一致
 80         Analyzer analyzer = new StandardAnalyzer();
 81         // 创建搜索解析器,第一个参数:默认Field域,第二个参数:分词器
 82         QueryParser queryParser = new QueryParser("desc", analyzer);
 83
 84         // 1. 创建Query搜索对象
 85         Query query = queryParser.parse("desc:java AND lucene");
 86
 87         // 2. 创建Directory流对象,声明索引库位置
 88         Directory directory = FSDirectory.open(new File("H:\\temp"));
 89
 90         // 3. 创建索引读取对象IndexReader
 91         IndexReader indexReader = DirectoryReader.open(directory);
 92
 93         // 4. 创建索引搜索对象IndexSearcher
 94         IndexSearcher indexSearcher = new IndexSearcher(indexReader);
 95
 96         // 5. 使用索引搜索对象,执行搜索,返回结果集TopDocs
 97         // 第一个参数:搜索对象,第二个参数:返回的数据条数,指定查询结果最顶部的n条数据返回
 98         TopDocs topDocs  = indexSearcher.search(query, 10);
 99         System.out.println("查询到的数据总条数是:" + topDocs.totalHits);
100         //获得结果集
101         ScoreDoc[] docs = topDocs.scoreDocs;
102
103         // 6. 解析结果集
104         for (ScoreDoc scoreDoc : docs) {
105             //获得文档
106             int docID = scoreDoc.doc;
107             Document doc = indexSearcher.doc(docID);
108
109             System.out.println("docID:"+docID);
110             System.out.println("bookid:"+doc.get("id"));
111             System.out.println("pic:"+doc.get("pic"));
112             System.out.println("name:"+doc.get("name"));
113             System.out.println("desc:"+doc.get("desc"));
114             System.out.println("price:"+doc.get("price"));
115         }
116
117         // 7. 释放资源
118         indexReader.close();
119     }
120 }
时间: 2024-10-22 04:24:53

Lucence的相关文章

lucence.net+盘古分词

第一步: 添加盘古和lucence的dll引用 第二步: 拷贝Dict文件夹到项目  demo里面是Dictionaries 不过官方建议改成Dict 然后把所有项右击属性 改为“如果较新则复制” 第三步 创建索引库,这里是一次性把数据库里的数据   循环写入了,正常项目里可以把循环打开,每报错一个数据  执行一遍 /// <summary> /// 创建索引库 /// </summary> public void CreateContent() { string indexPat

电子书 Lucence实战中文版第2版.pdf

<lucene实战(第2版)>基于apache的lucene3.0,从lucene核心.lucene应用.案例分析3个方面详细系统地介绍了lucene,包括认识lucene.建立索引.为应用程序添加搜索功能.高级搜索技术.扩展搜索.使用tika提取文本.lucene的高级扩展.使用其他编程语言访问lucene.lucene管理和性能调优等内容,最后还提供了三大经典成功案例,为读者展示了一个奇妙的搜索世界. <lucene实战(第2版)>适合于已具有一定java编程基本的读者,以及希

lucence学习系列之一 基本概念

1. Lucence基本概念 Lucence是一个java编写的全文检索类库,使用它可以为一个应用或者站点增加检索功能. 它通过增加内容到一个全文索引来完成检索功能.然后允许你基于这个索引去查询,返回结果,结果要么根据查询的相关度来排序要么根据任意字段如文档最后修改日期来排序. 增加到Lucence的内容可以来自多种数据源,如SQL/NOSQL 数据库,文件系统,甚至从站点上. 1.1 检索与索引 Lucence能快速的完成查询结果,是因为它不是直接搜索的文本,而是搜索一个索引.这类似于通过查询

Haoop生态--ElasticSeaarch(1)--ES预备知识(全文检索的概念、Lucence、倒排索引)

介绍ES为什么介绍这些?理下关系,ES是一种分布式全文检索系统,用来做分布式系统上的信息检索.它是一个集群,底层单机版用的是Lucence,Lucene是一种全文检索工具. 一.什么是全文检索? 数据一般分为两种:结构化数据(有固定格式或有限长度的数据,如数据库.元数据)和非结构化数据(长度和格式不定的数据,如word文档).数据存起来就是为了以后检索的,在对非结构化数据内容进行检索,一般有两种方式,顺序扫描和全文检索.顺序扫描就是把全部文档的全部文档从头到尾搜索一遍来和查询关键字对比.全文索引

elk的搜索常用 基于lucence

举例: a. 搜索domainname为search.s.d.pa.com的 domainname:search.s.d.pa.com 写法或者 domainname:"search.s.d.pa.com" b.搜索状态为400的 或者200的 status:404 c.范围值有 status:[400 TO 499] 多个条件查找 status:500  AND remote_addr:123.125.71.12 或者 status:500  AND remote_addr:&quo

Lucence.Net学习+盘古分词

创建索引库 //读取文件,存储到索引库 public string CreateDatebase() { //获取索引库的路径 var indexPath = AppDomain.CurrentDomain.BaseDirectory + ConfigurationManager.AppSettings["IndexDateBase"]; FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new

Lucence.net索引技术 二

一. Lucene索引创建和优化 [版本2.9.0以上] Lucene索引的创建首先需要取得几个必须的对象: 1.分词器//可以采用其他的中文分词器 StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);//分词器 2.lucene目录 File dir = new File(indexDir);// indexDir为文件路径 //这种目录存在锁机制,在打开目录时,写的权利一次只分给一个用户:有效保证了

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

1.使用queryparser完成解析搜索请求 2.基本格式如: QueryParser parser=new QueryParser("字段名称","分析器实例"); Query q=parser.parse("关键词") 3.例如:解析一个关键字太阳 QueryParser parser=new QueryParser("context",new StandardAnalyzer()); Query q=parser.pa

Lucence.net索引技术 一

1.建立索引 为了对文档进行索引,Lucene 提供了五个基础的类,他们分别是 Document, Field, IndexWriter, Analyzer, Directory.下面我们分别介绍一下这五个类的用途: Document Document 是用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件.一个 Document 对象由多个 Field 对象组成的.可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一