lucene使用3.0.3_使用Apache Lucene 4.3轻松进行搜索

lucene使用3.0.3

Lucene是用Java编写的全文搜索引擎,可以为任何应用程序提供强大的搜索功能。 Lucene的核心是基于文件的全文本索引。 Lucene提供API创建该索引,然后向该索引添加和删除内容。 此外,它允许使用功能强大的搜索算法从该索引中搜索和检索信息。 可以从不同的来源(如数据库,文件系统以及网站)中提取存储的数据。 在开始之前,让我们先思考一下。

倒排索引

倒排索引是一种数据结构,用于存储内容的映射以及包含该内容的对象的位置。 为了更加清楚,这里有一些示例

  1. 图书索引图书索引包含重要的单词以及包含这些单词的页面。 因此,书索引可帮助我们导航到包含特定单词的页面。
  2. 使用价格范围列出葡萄酒 –价格范围是内容,葡萄酒名称是具有该价格范围的对象
  3. 网站索引 -通过关键字列出网站地址。 例如,所有包含关键字“ Apache Lucene”的网页的列表
  4. 购物车 –按类别列出购物车中的物品。  

多面搜索

任何对象都可以具有多个属性,每个属性是该对象的一个方面分面搜索使我们可以基于多个分面来搜索对象的集合。 多面搜索也称为多面导航或多面浏览 ,它使我们可以搜索根据多面组织结构组织的信息

考虑一个购物车中的商品示例。 商品可以具有多个类别,例如类别,标题,价格,颜色,重量等。现在,商品搜索可以让我们搜索花园类别中所有具有红色且价格在30卢比到Rs之间的商品.40。

Lucene为我们提供了一个API

  1. 创建一个倒排索引。
  2. 根据分面分类存储信息。
  3. 使用分面搜索检索信息。

所有以上这些使Lucene成为超快速的搜索引擎,它返回超相关的搜索结果。

Lucene功能

  1. 相关性排名搜索
  2. 短语,接近度,通配符搜索。
  3. 可插入式山墙分析仪。
  4. 多面搜索。
  5. 基于字段的排序
  6. 范围查询
  7. 多重索引搜索。
  8. 快速索引150GB /小时。
  9. 轻松备份和还原。
  10. 小内存需求。
  11. 增量加法和快速搜索。

有关完整列表,请访问此处: http : //lucene.apache.org/core/features.html

Lucene概念和术语

  1. 索引编制-索引编制涉及通过称为“ IndexWriter ”的类将文档添加到Lucene索引中。
  2. 搜索 –搜索涉及借助名为“ IndexSearcher ”的类从Lucene索引中检索文档。
  3. 文档 – Lucene文档是单个搜索和索引单元。 例如购物车中的物品。 Lucene索引可以包含数百万个文档。
  4. 字段 –字段是任何文档的属性。 换句话说,字段是作为对象的文档的各个方面。 例如,购物车中某商品的类别。 每个文档可以具有多个字段。
  5. 查询 – Lucene有自己的查询语言。 这使我们可以基于多个字段搜索文档。 我们可以为一个字段分配权重,也可以对查询使用布尔表达式,例如and和or。 例如– 返回购物车中属于花园或家庭类别且颜色为红色且价格低于1000卢比的所有物品。
  6. 分析器 –要对字段文本进行索引时,需要将其转换为最基本的形式。 首先,将它们标记化,然后将其转换为小写字母,标记化,去斑点化。 这些任务由分析器执行。 分析仪非常复杂,我们需要深入研究如何使用它们。 大多数情况下,内置分析仪不能满足我们的要求,在这种情况下,我们可以创建一个新的分析仪。 在本教程中,我们将使用StandardAnalyzer,因为它们包含了我们所需的大多数基本功能。

教程目标

  1. 尝试创建一个Lucene索引。
  2. 在其中插入书籍记录。
  3. 在此索引上执行各种搜索。

  1. 书名(字符串
  2. 图书作者(字符串)
  3. 图书类别(字符串)
  4. #Pages(int)
  5. 价格(浮动)

本教程的代码已提交给SVN。 可以从以下位置检出: https : //www.assembla.com/code/weblog4j/subversion/nodes/24/SpringDemos/trunk

这是一个扩展项目,包含更多教程。 lucene类位于com.aranin.spring.lucene包中

  1. LuceneUtil –此类包含创建索引,创建IndexWriter和IndexSearcher的实用方法。
  2. MySearcherManager –此类使用LuceneUtil并对索引执行搜索。
  3. 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支持许多不同种类的查询器。

  1. TermQuery
  2. BooleanQuery
  3. WildcardQuery
  4. PhraseQuery
  5. PrefixQuery
  6. MultiPhraseQuery
  7. FuzzyQuery
  8. RegexpQuery
  9. TermRangeQuery
  10. NumericRangeQuery
  11. ConstantScoreQuery
  12. DisjunctionMaxQuery
  13. MatchAllDocsQuery

您可以为搜索选择适当的查询。 可以从此处了解查询语言的语法: http : //lucene.apache.org/core/old_versioned_docs/versions/2_9_1/queryparsersyntax.pdf

资源资源

  1. http://lucene.apache.org/core/old_versioned_docs/versions/2_9_1/queryparsersyntax.pdf
  2. http://lucene.apache.org/core/old_versioned_docs/versions/3_1_0/api/all/org/apache/lucene/index/IndexWriterConfig.OpenMode.html
  3. http://lucene.apache.org/core/old_versioned_docs/versions/3_5_0/api/all/org/apache/lucene/store/FSDirectory.html
  4. https://today.java.net/pub/a/today/2003/07/30/LuceneIntro.html
  5. http://www.lucenetutorial.com/lucene-query-syntax.html
  6. http://lucene.apache.org/core/4_3_0/core/org/apache/lucene/search/Query.html

摘要

搜索仍然是任何内容驱动的应用程序的骨干。 传统的数据库驱动的搜索功能不是很强大,还有很多不足之处。 因此,需要一种快速,准确且功能强大的搜索解决方案,该解决方案可以轻松地并入应用程序代码中。 Lucene很好地填补了这一空白,它使搜索变得轻而易举,并得到强大的搜索算法阵列的支持,例如相关性排名,词组,通配符,接近度和范围搜索。 它还具有空间和内存效率。 难怪在Lucene之上构建了如此多的应用程序。 本文旨在提供一个基础教程,以帮助亲爱的读者使用Lucene入门工具。 还有很多要说的,但是那您不想自己探索吗?

参考:通过Weblog4j博客的JCG合作伙伴 Niraj Singh, 使用Apache Lucene 4.3可以轻松进行搜索 。

翻译自: https://www.javacodegeeks.com/2013/06/searching-made-easy-with-apache-lucene-4-3.html

lucene使用3.0.3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java124 0,AcWing 124. 数的进制转换java

package acwing寒假每日一题;import java.io.BufferedInputStream;import java.util.*;public class TransNumber {public static void main(String[] args) {Scanner in new Scanner(new BufferedInputStream(System.in));//n次操作int n in.nextInt();//输入字符串&#xf…

php提取pdf首页图片,pdf图片怎么提取

pdf图片的提取方法&#xff1a;首先用极速PDF阅读器打开文档&#xff1b;然后在图片处单击鼠标右键并选择“复制图片”&#xff0c;这时就可以粘贴发送了。本文操作环境&#xff1a;Windows7系统&#xff0c;Microsoft Office PowerPoint2020版本&#xff0c;Dell G3电脑。pdf图…

dlopen linux 实例_Linux静态库和动态库

库从本质上来说是一种可执行代码的二进制格式&#xff0c;可以被载入内存中执行。库分静态库和动态库两种。 静态库和动态库的区别1. 静态函数库这类库的名字一般是libxxx.a&#xff1b;利用静态函数库编译成的文件比较大&#xff0c;因为整个 函数库的所有数据都会被整合进目标…

Neo4j:Cypher – Neo.ClientError.Statement.TypeError:不知道如何添加Double和String

我最近将支持Neo4j的应用程序从Neo4j 3.2升级到Neo4j 3.3&#xff0c;发现围绕类型强制的行为发生了有趣的变化&#xff0c;导致我的应用程序抛出了很多错误。 在Neo4j 3.2和更早版本中&#xff0c;如果将String添加到Double&#xff0c;它将把Double强制转换为String并连接值…

php7 php5.6 array,[转]php5.6 升级到php7及变化

不向后兼容的变更错误和异常处理相关的变更在 PHP 7 中&#xff0c;很多致命错误以及可恢复的致命错误&#xff0c;都被转换为异常来处理了。 这些异常继承自 Error 类&#xff0c;此类实现了 Throwable 接口 (所有异常都实现了这个基础接口)。这也意味着&#xff0c;当发生错误…

python 在末尾增加一个字符串,python - Python File.write在末尾添加额外的字符串 - SO中文参考 - www.soinside.com...

我正在使用python(3.6)更新文本文件&#xff0c;并打开r with open(f.play, r) as f2:play f2.read()result manipulate(play)print(result)f2.seek(0, 0)f2.write(result)通过这样做&#xff0c;我得到了意外的结尾部分ap:Envelope>当然&#xff0c;多余的部分是在第一次…

反射setaccessible_advancedday16类加载器,反射

加载配置文件在src目录下创建一个config.properties配置文件&#xff0c;使用类加载器加载配置文件。//创建集合Properties propertiesnew Properties();//获取src目录下&#xff0c;配置文件的流InputStream in ClassLoader.getSystemClassLoader() .getResourceAsStream(…

eventbus多个订阅_番石榴的EventBus –简单的发布者/订阅者

eventbus多个订阅在查看Google的Guava库版本10的最新添加内容时&#xff0c;我注意到EventBus的添加。 这是发布-订阅样式消息传递系统的轻量级实现。 这类似于JMS提供的发布-订阅模型&#xff0c;但是消息保留在应用程序内&#xff0c;而不是在外部广播。 EventBus允许您在程…

python 字段升序,python 根据两个字段排序, 一个升序, 一个降序

SSL双向认证java实现&lpar;转&rpar;本文通过模拟场景,介绍SSL双向认证的java实现 默认的情况下,我认为读者已经对SSL原理有一定的了解,所以文章中对SSL的原理,不做详细的介绍. 如果有这个需要,那么通过GOOGLE,可以搜索到很 ...List和Tuple类型list列表,list是一种有序的…

元气骑士如何获得机器人成就皮肤_元气骑士:机器人成就皮肤该怎么获得?百场老机器人教你走位...

【元气骑士我最行&#xff0c;不爱红武爱老云】各位亲爱的读者大家好&#xff0c;我是百场老机器老云。自从《元气骑士》更新出了特典皮肤之后&#xff0c;众多玩家开始了自己的成就之旅。有很多老玩家能够轻松完成这些成就&#xff0c;但是对于不少接触这款游戏不久的玩家来说…

Elasticsearch –使用模式替换过滤器和自定义分析器忽略查询中的特殊字符

使用Elasticsearch 5&#xff0c;我们有一个字段&#xff0c;例如驾驶执照编号&#xff0c;其中的值可能包含特殊字符&#xff0c;并且由于用户在有限的验证范围内输入了值&#xff0c;因此值的大小写不一致。 例如&#xff0c;这些是假设值&#xff1a; CA-123-456-789 WI.1…

python代码编程软件_编程与编程软件(python-pycharm)

课程安排编辑语言之python数据库软件之mysql今日内容概要编程与编程语言计算机存储内部工作原理编程语言的发展史解释型语言与编译型语言python解释器版本及下载安装编写python程序的编辑器(提升编码效率)变量的概念变量名的命名规范变量名的书写风格今日内容详细编程与编程语言…

基于matlab的语音信号,科学网—[转载]【信息技术】【2014.06】【含源码】基于MATLAB的语音信号处理与分析 - 刘春静的博文...

本文为瑞典耶夫勒大学(作者&#xff1a;Nan Wu)的学士论文&#xff0c;共48页。语音传递是人类最重要、最有效、最常用的信息交流方式。语言是人类特有的特征&#xff0c;而人声是常用的工具&#xff0c;也是相互传递信息的重要途径。语音具有较大的信息容量。因此&#xff0c;…

mysql 插入加锁_Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁

你需要知道的之前我们介绍了排他锁&#xff0c;其实innodb下的记录锁(也叫行锁)&#xff0c;间隙锁&#xff0c;next-key锁统统属于排他锁。行锁记录锁其实很好理解&#xff0c;对表中的记录加锁&#xff0c;叫做记录锁&#xff0c;简称行锁。生活中的间隙锁编程的思想源于生活…

string.intern_使用String.intern()减少内存使用

string.intern时不时地会有一个垂死的生产应用程序。 而且您知道您需要尽快对其进行修补。 我们也是如此&#xff0c;并认为分享最近的一个战争故事会很有趣。 在这种情况下&#xff0c;我们就有机会使用String.intern&#xff08;&#xff09;之类的简单补丁来修补应用程序。 …

测量string变量长度函数_利用Graphics::MeasureString函数测量字符串的宽度,高度

我就吐一句槽&#xff0c;今天被这个函数完虐....当我们需要获得一个字符串的长度时(注意&#xff0c;不是length&#xff0c;这只是返回该字符串的字符个数)&#xff0c;我们需要知道的是一个字符串的长度也就是一个字符串的宽&#xff0c;说到底就是像素大小&#xff0c;没错…

首选System.lineSeparator()以用Java编写系统相关的行分隔符字符串

JDK 7在java.lang.System类上引入了一个名为lineSeparator&#xff08;&#xff09;的新方法。 该方法不期待任何参数&#xff0c;并返回一个String &#xff0c;它表示“取决于系统的行分隔符字符串。” 此方法的Javadoc文档还指出System.lineSeparator() “始终返回相同的值–…

微信批量退款php,微信支付退款接口详解

微信支付有2个退款相关的接口&#xff0c;分别是申请退款API和查询退款API&#xff0c;这2个接口在实际微信支付开发中都会用到。其中申请退款API因为安全性&#xff0c;需要使用证书&#xff0c;证书在商户平台后台下载.申请退款接口支持一年以内的订单退款&#xff0c;可以分…

1235813找规律第100个数_人教版一年级下册数学第1-8单元知识点梳理填空,附答案...

参考答案&#xff1a;第一单元 认识图形1、认识平面图形 2、平面图形的拼组用相同的正方形、长方形或三角形可以分别拼成更大的正方形、长方形或三角形。3、认识七巧板 七巧板是由1个正方形、1个平行四边形、5个三角形组成的。第二单元 20以内的退位减法1、十几减几的计算方法(…

php m grep event,php-如何杀死与30分钟以上的grep匹配的进程?

我有一组并行运行的进程.有时有些闲荡时间超出了脚本的预期范围&#xff1a;$time_start microtime(true)$max_run_time 30 * 60; // 30 minutes, measured in secondswhile ((microtime(true)-$time_start) < $max_run_time) {// do stuff, but quit after 30 minutes}我…