做响应式网站的菜单,百度联盟推广,为什么网页在线视频会卡,wordpress官方中文主题Lucene是用Java编写的全文搜索引擎#xff0c;可以为任何应用程序提供强大的搜索功能。 Lucene的核心是基于文件的全文本索引。 Lucene提供API创建该索引#xff0c;然后向该索引添加和删除内容。 此外#xff0c;它允许使用功能强大的搜索算法从该索引中搜索和检索信息。 可… 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有自己的查询语言。 这使我们可以基于多个字段搜索文档。 我们可以为一个字段分配权重也可以对查询使用布尔表达式例如和和或。 例如– 返回购物车中属于花园或家庭类别且颜色为红色且价格低于1000卢比的所有物品。 分析器 –要对字段文本进行索引时需要将其转换为最基本的形式。 首先将它们标记化然后将其转换为小写字母标记化去斑点化。 这些任务由分析器执行。 分析仪非常复杂我们需要深入研究如何使用它们。 大多数情况下内置分析仪不能满足我们的要求在这种情况下我们可以创建一个新的分析仪。 在本教程中我们将使用StandardAnalyzer因为它们包含了我们所需的大多数基本功能。 教程目标 尝试创建一个Lucene索引。 在其中插入书籍记录。 在此索引上执行各种搜索。 书名字符串 图书作者字符串 图书类别字符串 #Pagesint 价格浮动 本教程的代码已提交给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添加 dependencyartifactIdlucene-core/artifactIdgroupIdorg.apache.lucene/groupIdtypejar/typeversion${lucene-version}/version/dependencydependencyartifactIdlucene-queries/artifactIdgroupIdorg.apache.lucene/groupIdtypejar/typeversion${lucene-version}/version/dependencydependencyartifactIdlucene-queryparser/artifactIdgroupIdorg.apache.lucene/groupIdtypejar/typeversion${lucene-version}/version/dependencydependencyartifactIdlucene-analyzers-common/artifactIdgroupIdorg.apache.lucene/groupIdtypejar/typeversion${lucene-version}/version/dependencydependencyartifactIdlucene-facet/artifactIdgroupIdorg.apache.lucene/groupIdtypejar/typeversion${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是您要在其中创建索引的目录。 目录是用于存储索引的文件的平面列表。 它可以是RAMDirectoryFSDirectory或基于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 stylecolor: #222222; font-family: Courier 10 Pitch, Courier, monospace; line-height: 21px;IndexWriterConfig iwc new IndexWriterConfig(Version.LUCENE_43, analyzer);/spaniwc.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 ListBookVO getBooksByField(String value, String field, IndexSearcher indexSearcher){ListBookVO bookList new ArrayListBookVO();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入门工具的基础教程。 还有很多话要说但是那您不想自己探索吗 参考通过Weblog4j博客的JCG合作伙伴 Niraj Singh 使用Apache Lucene 4.3可以轻松进行搜索 。 翻译自: https://www.javacodegeeks.com/2013/06/searching-made-easy-with-apache-lucene-4-3.html