lucene使用3.0.3_使用Apache Lucene 4.3轻松进行搜索
lucene使用3.0.3
Lucene是用Java编写的全文搜索引擎,可以为任何应用程序提供强大的搜索功能。 Lucene的核心是基于文件的全文本索引。 Lucene提供API创建该索引,然后向该索引添加和删除内容。 此外,它允许使用功能强大的搜索算法从该索引中搜索和检索信息。 可以从不同的来源(如数据库,文件系统以及网站)中提取存储的数据。 在开始之前,让我们先思考一下。
倒排索引
倒排索引是一种数据结构,用于存储内容的映射以及包含该内容的对象的位置。 为了更加清楚,这里有一些示例
- 图书索引 – 图书索引包含重要的单词以及包含这些单词的页面。 因此,书索引可帮助我们导航到包含特定单词的页面。
- 使用价格范围列出葡萄酒 –价格范围是内容,葡萄酒名称是具有该价格范围的对象
- 网站索引 -通过关键字列出网站地址。 例如,所有包含关键字“ Apache Lucene”的网页的列表
- 购物车 –按类别列出购物车中的物品。
多面搜索
任何对象都可以具有多个属性,每个属性是该对象的一个方面 。 分面搜索使我们可以基于多个分面来搜索对象的集合。 多面搜索也称为多面导航或多面浏览 ,它使我们可以搜索根据多面组织结构组织的信息 。
考虑一个购物车中的商品示例。 商品可以具有多个类别,例如类别,标题,价格,颜色,重量等。现在,商品搜索可以让我们搜索花园类别中所有具有红色且价格在30卢比到Rs之间的商品.40。
Lucene为我们提供了一个API
- 创建一个倒排索引。
- 根据分面分类存储信息。
- 使用分面搜索检索信息。
所有以上这些使Lucene成为超快速的搜索引擎,它返回超相关的搜索结果。
Lucene功能
- 相关性排名搜索
- 短语,接近度,通配符搜索。
- 可插入式山墙分析仪。
- 多面搜索。
- 基于字段的排序
- 范围查询
- 多重索引搜索。
- 快速索引150GB /小时。
- 轻松备份和还原。
- 小内存需求。
- 增量加法和快速搜索。
有关完整列表,请访问此处: http : //lucene.apache.org/core/features.html
Lucene概念和术语
- 索引编制-索引编制涉及通过称为“ IndexWriter ”的类将文档添加到Lucene索引中。
- 搜索 –搜索涉及借助名为“ IndexSearcher ”的类从Lucene索引中检索文档。
- 文档 – Lucene文档是单个搜索和索引单元。 例如购物车中的物品。 Lucene索引可以包含数百万个文档。
- 字段 –字段是任何文档的属性。 换句话说,字段是作为对象的文档的各个方面。 例如,购物车中某商品的类别。 每个文档可以具有多个字段。
- 查询 – Lucene有自己的查询语言。 这使我们可以基于多个字段搜索文档。 我们可以为一个字段分配权重,也可以对查询使用布尔表达式,例如and和or。 例如– 返回购物车中属于花园或家庭类别且颜色为红色且价格低于1000卢比的所有物品。
- 分析器 –要对字段文本进行索引时,需要将其转换为最基本的形式。 首先,将它们标记化,然后将其转换为小写字母,标记化,去斑点化。 这些任务由分析器执行。 分析仪非常复杂,我们需要深入研究如何使用它们。 大多数情况下,内置分析仪不能满足我们的要求,在这种情况下,我们可以创建一个新的分析仪。 在本教程中,我们将使用StandardAnalyzer,因为它们包含了我们所需的大多数基本功能。
教程目标
- 尝试创建一个Lucene索引。
- 在其中插入书籍记录。
- 在此索引上执行各种搜索。
- 书名(字符串
- 图书作者(字符串)
- 图书类别(字符串)
- #Pages(int)
- 价格(浮动)
本教程的代码已提交给SVN。 可以从以下位置检出: https : //www.assembla.com/code/weblog4j/subversion/nodes/24/SpringDemos/trunk
这是一个扩展项目,包含更多教程。 lucene类位于com.aranin.spring.lucene包中
- LuceneUtil –此类包含创建索引,创建IndexWriter和IndexSearcher的实用方法。
- MySearcherManager –此类使用LuceneUtil并对索引执行搜索。
- MyWriterManager –此类使用LuceneUtil并对索引执行写操作。
逐步演练
1. 依赖关系 –依赖关系可以通过maven添加
<dependency><artifactId>lucene-core</artifactId><groupId>org.apache.lucene</groupId><type>jar</type><version>${lucene-version}</version></dependency><dependency><artifactId>lucene-queries</artifactId><groupId>org.apache.lucene</groupId><type>jar</type><version>${lucene-version}</version></dependency><dependency><artifactId>lucene-queryparser</artifactId><groupId>org.apache.lucene</groupId><type>jar</type><version>${lucene-version}</version></dependency><dependency><artifactId>lucene-analyzers-common</artifactId><groupId>org.apache.lucene</groupId><type>jar</type><version>${lucene-version}</version></dependency><dependency><artifactId>lucene-facet</artifactId><groupId>org.apache.lucene</groupId><type>jar</type><version>${lucene-version}</version></dependency>
2. 创建索引 –可以通过在创建模式下创建IndexWriter来创建索引。
public void createIndex() throws Exception {boolean create = true;File indexDirFile = new File(this.indexDir);if (indexDirFile.exists() && indexDirFile.isDirectory()) {create = false;}Directory dir = FSDirectory.open(indexDirFile);Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_43, analyzer);if (create) {// Create a new index in the directory, removing any// previously indexed documents:iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE);}IndexWriter writer = new IndexWriter(dir, iwc);writer.commit();writer.close(true);}
- indexDir是您要在其中创建索引的目录。
- 目录是用于存储索引的文件的平面列表。 它可以是RAMDirectory,FSDirectory或基于DB的目录。
- FSDirectory实现目录并将索引保存在文件系统中的文件中。
- IndexWriterConfig.Open模式在create或create_append或appned模式下创建编写器。 如果创建模式不存在或覆盖现有索引,则创建模式会创建一个新索引。 为了创建目的,我们创建一个现有的。
- 调用上述方法将创建一个空索引。
3. 写入索引 –创建索引后,我们可以向其中写入文档。 这可以通过以下方式完成。
public void createIndexWriter() throws Exception {boolean create = true;File indexDirFile = new File(this.indexDir);Directory dir = FSDirectory.open(indexDirFile);Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);
<span style="color: #222222; font-family: 'Courier 10 Pitch', Courier, monospace; line-height: 21px;">IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_43, analyzer);</span>iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);this.writer = new IndexWriter(dir, iwc);}
上面的方法在create_append模式下创建一个writer。 在这种模式下,如果创建了索引,则不会覆盖它。 您可以注意到,此方法不会关闭编写器。 它只是创建并返回它。 创建IndexWriter是一项昂贵的操作。 因此,我们不应该在每次必须将文档写入索引时都创建作者。 相反,我们应该创建一个IndexWriter池,并使用线程系统从池中将写入器写入索引,然后将写入器返回到池中。
public void addBookToIndex(BookVO bookVO) throws Exception {Document document = new Document();document.add(new StringField("title", bookVO.getBook_name(), Field.Store.YES));document.add(new StringField("author", bookVO.getBook_author(), Field.Store.YES));document.add(new StringField("category", bookVO.getCategory(), Field.Store.YES));document.add(new IntField("numpage", bookVO.getNumpages(), Field.Store.YES));document.add(new FloatField("price", bookVO.getPrice(), Field.Store.YES));IndexWriter writer = this.luceneUtil.getIndexWriter();writer.addDocument(document);writer.commit();}
插入时,我们不会在代码中创建编写器。 取而代之的是,我们使用了一个预先创建的writer,它被存储为实例变量。
4. 搜索索引 –这又分两个步骤完成:1.创建IndexSearcher 2.创建查询并进行搜索。
public void createIndexSearcher(){IndexReader indexReader = null;IndexSearcher indexSearcher = null;try{File indexDirFile = new File(this.indexDir);Directory dir = FSDirectory.open(indexDirFile);indexReader = DirectoryReader.open(dir);indexSearcher = new IndexSearcher(indexReader);}catch(IOException ioe){ioe.printStackTrace();}this.indexSearcher = indexSearcher;}
注–搜索器中使用的分析器应与用于创建编写器的分析器相同,因为分析器负责将数据存储在索引中的方式。 再次创建IndexSearcher是一项昂贵的操作,因此预创建IndexSearcher池并以与IndexWriter类似的方式使用它是有意义的。
public List<BookVO> getBooksByField(String value, String field, IndexSearcher indexSearcher){List<BookVO> bookList = new ArrayList<BookVO>();Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);QueryParser parser = new QueryParser(Version.LUCENE_43, field, analyzer);try {BooleanQuery query = new BooleanQuery();query.add(new TermQuery(new Term(field, value)), BooleanClause.Occur.MUST);//Query query = parser.Query(value);int numResults = 100;ScoreDoc[] hits = indexSearcher.search(query,numResults).scoreDocs;for (int i = 0; i < hits.length; i++) {Document doc = indexSearcher.doc(hits[i].doc);bookList.add(getBookVO(doc));}} catch (IOException e) {e.printStackTrace(); }return bookList;
}
已预先创建IndexSearcher并将其传递给该方法。 搜索的主要部分是查询形成。 Lucene支持许多不同种类的查询器。
TermQuery
BooleanQuery
WildcardQuery
PhraseQuery
PrefixQuery
MultiPhraseQuery
FuzzyQuery
RegexpQuery
TermRangeQuery
NumericRangeQuery
ConstantScoreQuery
DisjunctionMaxQuery
MatchAllDocsQuery
您可以为搜索选择适当的查询。 可以从此处了解查询语言的语法: http : //lucene.apache.org/core/old_versioned_docs/versions/2_9_1/queryparsersyntax.pdf
资源资源
- http://lucene.apache.org/core/old_versioned_docs/versions/2_9_1/queryparsersyntax.pdf
- http://lucene.apache.org/core/old_versioned_docs/versions/3_1_0/api/all/org/apache/lucene/index/IndexWriterConfig.OpenMode.html
- http://lucene.apache.org/core/old_versioned_docs/versions/3_5_0/api/all/org/apache/lucene/store/FSDirectory.html
- https://today.java.net/pub/a/today/2003/07/30/LuceneIntro.html
- http://www.lucenetutorial.com/lucene-query-syntax.html
- http://lucene.apache.org/core/4_3_0/core/org/apache/lucene/search/Query.html
摘要
搜索仍然是任何内容驱动的应用程序的骨干。 传统的数据库驱动的搜索功能不是很强大,还有很多不足之处。 因此,需要一种快速,准确且功能强大的搜索解决方案,该解决方案可以轻松地并入应用程序代码中。 Lucene很好地填补了这一空白,它使搜索变得轻而易举,并得到强大的搜索算法阵列的支持,例如相关性排名,词组,通配符,接近度和范围搜索。 它还具有空间和内存效率。 难怪在Lucene之上构建了如此多的应用程序。 本文旨在提供一个基础教程,以帮助亲爱的读者使用Lucene入门工具。 还有很多要说的,但是那您不想自己探索吗?
翻译自: https://www.javacodegeeks.com/2013/06/searching-made-easy-with-apache-lucene-4-3.html
lucene使用3.0.3
lucene使用3.0.3_使用Apache Lucene 4.3轻松进行搜索相关推荐
- 【手把手教你全文检索】Apache Lucene初探
讲解之前,先来分享一些资料 首先呢,学习任何一门新的亦或是旧的开源技术,百度其中一二是最简单的办法,先了解其中的大概,思想等等.这里就贡献一个讲解很到位的ppt.已经被我转成了PDF,便于搜藏. 其次 ...
- Apache Lucene拼写检查器的“您是不是要”功能
Google的"您是不是要"功能 在上一篇文章中对Lucene进行了介绍之后 ,现在是时候提高它,创建一个更复杂的应用程序了. 您肯定最熟悉Google的"您是不是要&q ...
- Apache Lucene Java 全文检索引擎架构
Apache Lucene Java 全文检索引擎架构 Apache Lucene 8.9.0 已发布,Lucene 是完全用 Java 编写的高性能.功能齐全的全文检索引擎架构,提供了完整的查询引擎 ...
- Did you mean feature with Apache Lucene Spell-Checker
http://www.cnblogs.com/huangfox/archive/2012/02/14/2350891.html lucene版本4.7.0 <dependency>< ...
- 简单认识Apache Lucene的使用
Lucene 简介 Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能.Lucene 目前是 Apache Jakarta 家 ...
- Lucene 6.1.0 入门Demo
根据Lucene 6.1.0 及JDK 1.8最新版本,结合前几篇文章所写的最新Demo. 代码如下: package HighLightSearch;import java.io.File; imp ...
- at org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:162)错误的解决办法主要是针对IK分词的结果运行错误解决
主要错误信息 Exception in thread "main" java.lang.AbstractMethodError: org.apache.lucene.analysi ...
- Apache Lucene - Building and Installing the Basic Demo
目录 关于本文档 关于 Demo Setting youy CLASSPATH Indexing Files About the code Location of the source IndexFi ...
- Lucene+分词器精确提取用户自定义关键词(Lucene版本3.6)
此篇博客的Lucene版本是3.6.0,若您的Lucene版本为5.X可以移步到此博文http://blog.csdn.net/echoyy/article/details/78468225 在分词的 ...
最新文章
- 公司 表名规则 TN基础表 TR关系表 TL定义表
- android模拟器越狱,关于iOS Simulator(模拟器)是否可以越狱。
- datagridview显示每次点击都会往后追加_R410A空调安装(或系统维修后)排空及追加制冷剂操作工艺...
- kettle的hello world
- java 构造器(constructor)是否可被重写(override)?
- pandas.iloc, pandas.loc用法
- JS中某事件需要同时调用几个function另类解决办法。
- latex常用最要快捷键
- IAR软件生成库文件.a的license限制
- 使用Windows自带的录音机进行wav转mp3的操作
- 网站SEO优化::降低网站跳出率、提高用户粘度网站用户粘度
- 0016_光源和打光(1)
- mongoDB设置用户名密码
- 全球人造丝卫生棉条行业调研及趋势分析报告
- 云服务器部署项目环境搭建
- 计算机图形学 OpenGl-种子填充算法画红黄绿交通灯
- python 安装module
- springboot整合多线程ThreadPoolTaskExecutor
- 微软发布会精华回顾:“台式电脑”抢了风头
- 基于微信小程序的家政服务预约系统的设计与实现
热门文章
- 汇编语言(三十四)之输出中文
- 谈谈 Java 的克隆
- Oracle入门(十四.7)之良好的编程习惯
- Oracle入门(九A)之用户的权限或角色
- 漫画:什么是A*寻路算法
- 试编写算法,设任意n个整数存放于数组A[1...n]中,将所有正数排在所有负数前面(要求:算法时间复杂度为O(n))
- 循环输入某同学 S1 结业考试的 5 门课成绩,并计算平均分
- struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Jsp页面
- 交换数组中的两个元素
- 蓝桥杯JAVA省赛2013-----B------2(马虎算式)