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坐标:
上面说的对中文分词支持的分词器
IK分词器(中文分词器IK-analyzer):
jar包:IKAnalyzer2012FF_u1.jar,这个我没有找到maven坐标,我是导入的jar文件,很容易下载
扩展词文件:ext.dic --》 用来自定义添加分词规则,比如新出网络词“单身狗”,以前是肯定没有这个词的,现在就需要自定义加入
禁用词文件:stopword.dic --》用来自定义不进行分词的规则,比如一些禁用的词“法论功”,这个词有些时候就不能出现,更不能成为关键字
核心配置文件: IKAnalyzer.cfg.xml--》核心配置文件
存放位置:
src资源目录下
数据库表结构:
代码实例:
Product类:这里只使用三个字段作为测试
生成索引:
注意导包,都是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;
查询索引:
模拟淘宝搜索商品
查询结果:
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 简单入门
- Lucene安装及入门
- Lucene 3.6.2入门:高级搜索之自定义评分
- Lucene入门
- Lucene入门与使用(三) [转]
- Lucene3.6 入门指南
- Lucene入门例子
- Lucene.net入门学习系列(2)
- Lucene入门教程
- lucen入门学习之一(初识Lucene)
- lucene入门实例
- 【Lucene3.6.2入门系列】第08节_高级搜索之自定义评分
- 【Lucene3.6.2入门系列】第13节_Solr3.6.2简介以及整合Tomcat
- Lucene入门
- Lucene入门以及简单实例
- 【Lucene3.6.2入门系列】第06节_高级搜索之排序
- Lucene基础(一)--入门
- Lucene5.5.4入门以及基于Lucene实现博客搜索功能
- Lucene简单入门
- Lucene2.9.2 + 盘古分词2.3.1(一) 入门: 建立简单索引,搜索(原创)