lucene入门

Lucene介绍:

Lucene是一种全文检索技术,属于Apache公司,它也可以称为是一种数据库,凡是能够保持或持久化数据的地方就叫数据库

Lucene并不是现成的搜索引擎,但可以根据Lucene来编写搜索引擎,常见搜索引擎:百度,google;常见应用场景:淘宝,京东

Lucene是实现此搜索引擎系统的工具jar包

数据库分类:

关系型数据库:Mysql,Oracle

非关系型数据库:Redis,memcached

消息数据库:ActiveMQ

索引库:Lucene

Lucene存储结构:索引+内容


全文检索解释:

是一种搜索技术,搜索技术有顺序扫描法:从头到尾以此比较扫描,效率非常低下,比如查没有目录的字典;

全文检索是先根据索引确定搜索的关键字在某个范围内,然后在从中查询,效率很高,比如查带目录的字典;

使用全文检索的前提是首先要创建索引

创建索引是根据所存储的数据信息进行创建

比如:Lucene 是 Apache 公司的一项开源的技术

那么当我们搜索Lucene/Apache/公司/开源/技术这些关键字时都应该能够查到这句话

也就是说这些关键字就是索引,我们现在要做的就是怎么来创建一个这样的索引,其实我感觉就像把这一句话反复拆解

创建索引过程

1,获得数据,也就是创建索引所需要的数据,索引总是建立在数据之上的

数据来源:数据库,文本文件,web网站爬虫

2,构建文档对象,把获得的数据封装成一个个的文档对象(Document,lucene提供的API)

3,分析文档,也就是分解文档数据,就是拆分一个个的索引关键字

规则:

1)所有英文全部转小写

2)标点符号不要

3)is,a,an...这类单独没有意义的词不要

4)英文过去式,将来式转成现在式

注意:对中文的分析之后有专门的工具jar包,先按照英文分析解释

Lucene入门程序需要jar包

核心包:lucene-core-4.10.1.jar

分词器包:lucene-analyzers-common-4.10.1.jar

查询解析包:lucene-queryparser-4.10.1.jar

mysql驱动包(数据从mysql数据库中获得,也可以自己写死)

对应maven坐标:

<!-- Lucene核心包 -->
		<dependency>
		    <groupId>org.apache.lucene</groupId>
		    <artifactId>lucene-core</artifactId>
		    <version>4.10.1</version>
		</dependency>
		
		<!-- Lucene查询解析包 -->
		<dependency>
		    <groupId>org.apache.lucene</groupId>
		    <artifactId>lucene-queryparser</artifactId>
		    <version>4.10.1</version>
		</dependency>
		
		<!-- 分词器包 -->
		<dependency>
		    <groupId>org.apache.lucene</groupId>
		    <artifactId>lucene-analyzers-common</artifactId>
		    <version>4.10.1</version>
		</dependency>


上面说的对中文分词支持的分词器

IK分词器(中文分词器IK-analyzer):

jar包:IKAnalyzer2012FF_u1.jar,这个我没有找到maven坐标,我是导入的jar文件,很容易下载

扩展词文件:ext.dic --》 用来自定义添加分词规则,比如新出网络词“单身狗”,以前是肯定没有这个词的,现在就需要自定义加入


禁用词文件:stopword.dic   --》用来自定义不进行分词的规则,比如一些禁用的词“法论功”,这个词有些时候就不能出现,更不能成为关键字



核心配置文件: IKAnalyzer.cfg.xml--》核心配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">  
<properties>  
	<comment>IK Analyzer 扩展配置</comment>
	<!--用户可以在这里配置自己的扩展字典 
	-->
	<entry key="ext_dict">ext.dic;</entry> 
	<!--用户可以在这里配置自己的扩展停止词字典-->
	<entry key="ext_stopwords">stopword.dic;</entry> 
</properties>

存放位置:

src资源目录下


数据库表结构:



代码实例:

Product类:这里只使用三个字段作为测试

public class Product {
    private Long id;
    private Long brandId;
    private String name;
   
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public Long getBrandId() {
        return brandId;
    }
    public void setBrandId(Long brandId) {
        this.brandId = brandId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }
}


生成索引:


注意导包,都是lucene下的包

import org.apache.lucene.analysis.Analyzer;
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.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.FuzzyQuery;
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;

//创建索引
	@Test
	public void test() throws Exception{
		
		//分词器,StandardAnalyzer是标准分词器对中文支持不好,可以使用IKAnalyzer分词器,对中文支持特别好
		Analyzer analyzer = new StandardAnalyzer();
		//索引存储目录
		Directory dir = FSDirectory.open(new File("D:\\ttt\\lucene\\index"));
		//分析器配置,Version.LATEST表示使用最新版本分词器,根据所导Jar包选择,只有当导入两个以上分词器jar包时才有意义
		IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);
		//索引
		IndexWriter indexWriter = new IndexWriter(dir, config);
		//bpm是查询数据操作,返回一个List集合,这点很简单
		List<Product> plist = bpm.selectAll();
		for (Product product : plist) {
			
			//创建Document文档对象
			Document doc = new Document();
			//为每一个字段创建索引
			Field idField = new TextField("id",String.valueOf(product.getId()),Store.YES);
			Field brandIdField = new TextField("brandId",String.valueOf(product.getBrandId()),Store.YES);
			Field nameField = new TextField("name",String.valueOf(product.getName()),Store.YES);
			//添加索引
			doc.add(idField);
			doc.add(brandIdField);
			doc.add(nameField);
			
			//保存索引
			indexWriter.addDocument(doc);
		}
		//关闭流
		indexWriter.close();
		
	}

查询索引:

模拟淘宝搜索商品

	//索引查询
	@Test
	public void test2() throws Exception{
		
		//从索引中查询
		
		//模糊查询
		FuzzyQuery query=new FuzzyQuery(new Term("name","T恤"));
		
		//索引存储目录
		Directory dir = FSDirectory.open(new File("D:\\ttt\\lucene\\index"));
		//分析器配置
		IndexReader indexReader = DirectoryReader.open(dir);
		//执行查询
		IndexSearcher searcher = new IndexSearcher(indexReader);
		//参数一:查询条件;参数二:查询返回记录数
		TopDocs topDocs = searcher.search(query, 10);
		ScoreDoc[] scoreDocs = topDocs.scoreDocs;
		for (ScoreDoc scoreDoc : scoreDocs) {
			int docId = scoreDoc.doc;
			Document doc = searcher.doc(docId);
			String string = doc.get("id");
			String brandId = doc.get("brandId");
			String name = doc.get("name");
			
			System.out.println(name);
			
		}
		
		indexReader.close();
	}
	


查询结果:















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值