在构建文档库之后,绝大多数的查询都是基于中文进行查询。使用前面的例子,进行测试时,会发现这样问题:
使用关键词“微信”进行搜索时,能够搜索到没有“微信”这个词出现,但是有“微”和“信”这两个字出现的文档。造成这种错误搜索的原因是,Lucene标准的分析器在分析文档以及查询关键词时,对于英文是基于单词分词的,但是对于中文,是基于汉字进行分词的,所以就造成了上述的查询问题。为了解决这个问题,我们只需要将Lucene的标准分析器换成中文的分析器就可以了,IK Analyzer是基于lucene实现的分词开源框架具有如下特性:
- 算法采用“正向迭代最细粒度切分算法”, 支持细粒度和最大词长两种分词 方式,速度最大支持 80W 字/秒(1600KB/秒) 。
- 支持多子处理器分析模式:中文、数字、字母,并兼容日文、韩文。
- 较小的内存占用,优化词库占有空间,用户可自定义扩展词库。 采用歧义分析算法优化查询关键字的搜索排列组
- 基于lucene 的扩展实现,提高 lucene 检索命中率。
比如对于“基于java语言开发的轻量级的中文分词工具包”,使用IK Analyzer分析后的结果为:
基于|java|语言|开发|的|轻量级|的|中文|分词|工具包|
基本上符合中文的分词,而使用Lucene标准的分析器,则分析的结果就是逐字分开。所以使用IK Analyzer作为分析器构建中文文档库时,不但能减少索引文件大小,还可以加快搜索速度。在使用时,只需要将构建索引时和查询时的分析器修改为IK Analyzer,就可以了。使用步骤如下:
1.在http://code.google.com/p/ik-analyzer/downloads/list下载IK Analyzer 2012FF_hf1.zip(该版本与
Lucene4.x兼容)
2.解压下载文件在classpath加入IKAnalyzer2012FF_u1.jar,并且将stopword.dic和IKAnalyzer.cfg.xml文件
添加到src的根路径下(保证编译时这两个文件copy到classes的根路径下)。
3.在代码中使用IK Analyzer作为分析器。
代码如下,为了便于调试,此处将全部代码贴出:
package com.hsdl.lucene; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.StringField; import org.apache.lucene.document.TextField; import org.apache.lucene.index.CorruptIndexException; 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.IndexWriterConfig.OpenMode; import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.queryparser.classic.QueryParser; 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.store.LockObtainFailedException; import org.apache.lucene.util.Version; import org.apache.tika.Tika; import org.wltea.analyzer.lucene.IKAnalyzer; public class LuceneDemo2 { private static String contentFieldName = "content"; private static Tika tika = new Tika(); public static void main(String[] args) { //Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_45); //使用IKAnalyzer构建分析器 Analyzer analyzer = new IKAnalyzer(true); try { String docPath = "D:/work/lucene/tika/doc"; String indexPath = "D:/work/lucene/tika/index"; //创建索引 createIndex(analyzer, indexPath, docPath); //搜索 search(analyzer, indexPath, "微信"); } catch (CorruptIndexException e) { e.printStackTrace(); } catch (LockObtainFailedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 创建索引 * * @param analyzer * @param indexPath * @param docPath * @throws IOException * @throws CorruptIndexException * @throws LockObtainFailedException */ private static void createIndex(Analyzer analyzer, String indexPath, String docPath) throws IOException, CorruptIndexException, LockObtainFailedException { IndexWriter iwriter; Directory directory = FSDirectory.open(new File(indexPath)); // 配置IndexWriterConfig IndexWriterConfig iwConfig = new IndexWriterConfig(Version.LUCENE_45, analyzer); iwConfig.setOpenMode(OpenMode.CREATE_OR_APPEND); iwriter = new IndexWriter(directory, iwConfig); File file = new File(docPath); indexDocs(iwriter, file); iwriter.close(); } /** * 搜索 * * @param analyzer * @param indexPath * @param queryStr * @throws CorruptIndexException * @throws IOException * @throws ParseException */ private static void search(Analyzer analyzer, String indexPath, String queryStr) throws CorruptIndexException, IOException, ParseException { Directory directory = FSDirectory.open(new File(indexPath)); // 搜索过程********************************** // 实例化搜索器 IndexReader ireader = DirectoryReader.open(directory); IndexSearcher isearcher = new IndexSearcher(ireader); // 使用QueryParser查询分析器构造Query对象 QueryParser qp = new QueryParser(Version.LUCENE_45, contentFieldName, analyzer); qp.setDefaultOperator(QueryParser.AND_OPERATOR); Query query = qp.parse(queryStr); // 搜索相似度最高的5条记录 TopDocs topDocs = isearcher.search(query, 10); System.out.println("命中:" + topDocs.totalHits); // 输出结果 ScoreDoc[] scoreDocs = topDocs.scoreDocs; System.out.println(scoreDocs.length); for (int i = 0; i < scoreDocs.length; i++) { Document targetDoc = isearcher.doc(scoreDocs[i].doc); System.out.println("内容:" + targetDoc.toString()); System.out.println(targetDoc.get("fileName") + "[" + targetDoc.get("path") + "]"); } } /** * 根据指定存放内容的文件或目录创建索引 * @param iwriter * @param file * @throws IOException */ public static void indexDocs(IndexWriter iwriter, File file) throws IOException { if (file.canRead()) if (file.isDirectory()) { String[] files = file.list(); if (files != null) for (int i = 0; i < files.length; i++) indexDocs(iwriter, new File(file, files[i])); } else { Document doc = null; FileInputStream fis=null; try { doc = new Document(); doc.add(new StringField("ID", "10000", Field.Store.YES)); fis = new FileInputStream(file); //此处添加文件内容时,需要根据tika获取Reader对象 doc.add(new TextField(contentFieldName, tika.parse(file))); doc.add(new StringField("fileName", file.getName(), Field.Store.YES)); doc.add(new StringField("path", file.getAbsolutePath(), Field.Store.YES)); iwriter.addDocument(doc); } finally { if(fis!=null){ fis.close(); } } } } }
相关推荐
本文将围绕“Lucene5学习之拼音搜索”这一主题,详细介绍其拼音搜索的实现原理和实际应用。 首先,我们需要理解拼音搜索的重要性。在中文环境中,由于汉字的复杂性,用户往往习惯于通过输入词语的拼音来寻找信息。...
总之,Lucene.net是一个强大的全文搜索引擎工具,通过深入学习其源码和相关文档,开发者可以构建出满足各种需求的搜索解决方案。无论你是.NET开发者还是对全文检索技术感兴趣,Lucene.net都是一个值得投入时间和精力...
9. **分布式搜索**:虽然3.0.3版本可能不包含完整的分布式搜索解决方案,但你可以了解Lucene如何为大型数据集提供支持,以及后续版本中引入的Solr或Elasticsearch如何解决这一问题。 10. **扩展性**:Lucene的API...
在深入探讨Lucene Field之前,我们先来...在实际应用中,结合其他相关技术,如Solr(基于Lucene的搜索引擎服务器)、Netty(高性能网络通信框架)和Hadoop(大数据处理框架),可以构建更复杂、高效的搜索解决方案。
《Lucene in Action》是一本深入探讨Apache Lucene搜索引擎库的专业书籍,中文版的发布使得更多的中文读者能够理解和掌握这个强大的全文检索工具。这本书详细介绍了Lucene的基本概念、核心组件以及高级应用,是学习...
5. **评分(Scoring)**:Lucene会根据查询和文档的相关性给出一个分数,决定搜索结果的排序。TF-IDF(Term Frequency-Inverse Document Frequency)是最常用的评分算法。 现在,我们详细讲解如何在Lucene中进行...
总的来说,Lucene 3.0 API中文帮助文档是学习和掌握Lucene搜索引擎的关键资源。通过阅读和实践,开发者可以构建出高效的全文检索系统,满足各种复杂的信息检索需求。尽管现在已经有了更新的版本,但3.0版本的API仍然...
《Lucene In Action 第二版》是一本深入探讨Apache Lucene全文搜索引擎库的专业书籍,高清中文版的提供为中文读者提供了便利。这本书由Michael McCandless等作者编写,旨在帮助开发者充分利用Lucene的强大功能,构建...
通过阅读和理解Lucene.NET的源代码,开发者可以深入学习其内部工作原理,如倒排索引的构建、查询解析的逻辑以及匹配算法等。这对于自定义扩展和优化搜索引擎功能至关重要。 总的来说,Lucene.NET是一个强大的全文...
《Lucene实战(第2版)》是一本深入解析Apache Lucene搜索引擎库的专业书籍,针对中文版,将帮助读者全面理解和掌握如何利用Lucene进行文本检索和数据分析。Lucene是Java开发的一个高性能、全文检索库,它提供了强大的...
总的来说,Lucene 2.0是Java全职搜索引擎的重要里程碑,它的分词工具包则解决了处理中文文本的关键问题。通过深入理解和熟练运用这些工具,开发者可以构建出高效、精准的信息检索系统,满足各种搜索需求。尽管年代...
《Lucene实战中文版第2版》是一本深入讲解开源搜索引擎Lucene的...通过学习《Lucene实战中文版第2版》,读者不仅可以掌握Lucene的基本操作,还能深入了解其内部机制,从而更好地利用这一强大的搜索工具解决实际问题。
《Lucene in Action》中文版是一本全面介绍Apache Lucene搜索引擎库的专业书籍,它深入浅出地阐述了...通过阅读这本书,你可以深入理解Lucene的工作原理,学会如何利用它来解决信息检索问题,提升你的项目搜索体验。
总的来说,"中文搜索分词lucene包+paoding包"的组合为开发者提供了一个高效且灵活的解决方案,用于处理中文文本的搜索和检索。通过深入理解这两个工具的功能和交互方式,开发者可以构建出高质量的中文搜索引擎应用。
3. **查询解析**:Lucene支持丰富的查询语法,包括布尔查询、短语查询、范围查询、模糊查询等,同时提供查询分析器,将用户输入的查询字符串转化为适合索引的查询表达式。 4. **搜索与评分**:Lucene的搜索算法基于...
总结起来,"庖丁解牛"中文分词器是Lucene 3全中文索引解决方案的重要组成部分,它的引入能显著提升中文文本处理的效率和精确性。对于从事信息检索和自然语言处理的开发者来说,掌握并合理运用庖丁解牛,无疑能为你的...
在实践中,会遇到如数据导入、更新、删除等问题,解决这些问题有助于提升开发者的Lucene应用能力。 总结,Lucene 5为开发者提供了强大且灵活的全文检索功能,通过深入学习其源码,尤其是拼音检索和分词器的运用,...
《Lucene实战》第二版是一本深入探讨Apache Lucene搜索引擎库的权威指南。...书中涵盖了从基础到进阶的各种主题,包括高级搜索技巧、索引优化以及如何解决实际开发中的问题,是学习和应用Lucene的宝贵资源。