您的位置:首页 > 其它

lucene入门

2018-01-02 21:40 316 查看
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{

//分词器,Standa
4000
rdAnalyzer是标准分词器对中文支持不好,可以使用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();
}


查询结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Lucene