在Lucene4.6中通过SynonymFilterFactory实现中文同义词非常方便,只需几行代码和一个同义词词典。这个词典还能在Lucene中实现一定程度的拼写纠错,提升搜索体验。在下面这个例子中我们从磁盘载入一个同义词词典,并且对“其实hankcs似好人”这句话进行stream化以供索引,同时还对其中的拼写错误“似->是”做出纠正。
首先是位于./data/synonyms.txt路径下的同义词词典:
我,俺,hankcs 似,is,are => 是 好人,好心人,热心人
可以看出上面有两种词典格式:
通过,分割的可拓展同义词
比如“我,俺,hankcs”代表着这三个词是同义词,并且任何一个词可以被expand(拓展)为其他三个。如果expand设为false的话,则这三个词都会被统一替换为第一个词,也就是“我”。
通过=>收缩的不可拓展同义词
比如“似,is,are => 是”代表这三个词同义,并且无视expand参数,统一会被替换为“是”
然后是加载代码
package com.hankcs.test; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.core.WhitespaceAnalyzer; import org.apache.lucene.analysis.synonym.SynonymFilterFactory; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; import org.apache.lucene.analysis.tokenattributes.OffsetAttribute; import org.apache.lucene.analysis.util.FilesystemResourceLoader; import org.apache.lucene.util.Version; import org.apache.uima.annotator.WhitespaceTokenizer; import java.io.IOException; import java.io.StringReader; import java.util.HashMap; import java.util.Map; /** * @author hankcs */ public class TestSynonyms { private static void displayTokens(TokenStream ts) throws IOException { CharTermAttribute termAttr = ts.addAttribute(CharTermAttribute.class); OffsetAttribute offsetAttribute = ts.addAttribute(OffsetAttribute.class); ts.reset(); while (ts.incrementToken()) { String token = termAttr.toString(); System.out.print(offsetAttribute.startOffset() + "-" + offsetAttribute.endOffset() + "[" + token + "] "); } System.out.println(); ts.end(); ts.close(); } public static void main(String[] args) throws Exception { String testInput = "其实 hankcs 似 好人"; Version ver = Version.LUCENE_46; Map<String, String> filterArgs = new HashMap<String, String>(); filterArgs.put("luceneMatchVersion", ver.toString()); filterArgs.put("synonyms", "./data/synonyms.txt"); filterArgs.put("expand", "true"); SynonymFilterFactory factory = new SynonymFilterFactory(filterArgs); factory.inform(new FilesystemResourceLoader()); WhitespaceAnalyzer whitespaceAnalyzer = new WhitespaceAnalyzer(ver); TokenStream ts = factory.create(whitespaceAnalyzer.tokenStream("someField", testInput)); displayTokens(ts); } }
输出:
0-2[其实] 3-9[我] 3-9[俺] 3-9[hankcs] 10-11[是] 12-14[好人] 12-14[好心人] 12-14[热心人]
由于 我 俺 hankcs 三个词是同一个意思,所以它们被视为同一个term,并且它们的偏移相同,都是3->9,这个长度取决于原来的词 hankcs 的长度。
http://www.hankcs.com/program/java/lucene-synonymfilterfactory.html
相关推荐
【描述】: 本文探讨了如何在Lucene搜索引擎中实现中文同义词查询,适合那些希望了解和使用Lucene同义词功能的读者。 【标签】: lucene同义词 【正文】: 随着互联网的快速发展,中文信息量剧增,搜索引擎需要处理...
本篇将聚焦于"Lucene5学习之自定义同义词分词器简单示例",通过这个主题,我们将深入探讨如何在Lucene5中自定义分词器,特别是实现同义词扩展,以提升搜索质量和用户体验。 首先,理解分词器(Analyzer)在Lucene中...
本篇文章将深入探讨如何基于Lucene 5.5版本构建一个同义词分析器,以及它对理解Lucene内部分析构造的重要性。 首先,我们要明白同义词分析器在文本处理中的作用。在信息检索系统中,同义词分析器能够识别并处理具有...
本篇文章将重点讲解“ES同义词插件”——elasticsearch-analysis-dynamic-synonym-6.5.1,这是针对Elasticsearch 6.x版本的一个定制化插件,用于实现同义词处理功能。 标题中的"ES同义词插件 elasticsearch-...
FST在Lucene中的应用不仅限于词典,它还可以用于实现词性标注、同义词扩展等功能。通过FST,Lucene可以在不增加太多内存开销的情况下,提供复杂的查询逻辑和高效的索引服务。 在实际应用中,FST的构建和查询性能是...
2. 同义词:为了提高召回率,Lucene支持同义词扩展。可以使用`SynonymFilter`在查询时将同义词合并,扩大查询覆盖范围。 四、近实时搜索 Lucene 4.6引入了近实时搜索(Near Real-Time Search)特性,允许在添加或...
在描述中提到,这个版本的IK Analyzer已经支持同义词、停用词和扩展词,这意味着它可以识别并处理这些词汇的不同形式,从而提供更丰富的搜索结果。 **同义词支持** 同义词功能在信息检索中至关重要,因为用户可能会...
本文将深入探讨一个以"lucene的分词的测试工程"为主题的项目,涵盖分词器的比较、扩展停用词以及同义词分词等多个关键知识点。 一、Lucene简介 Lucene是一款高性能、全文检索的开源库,它提供了索引和搜索功能,...
- **模糊搜索**:支持部分匹配或同义词搜索,可以通过设置查询分析器的同义词扩展或使用模糊查询。 - **排序与评分**:根据相关性(如TF-IDF)对结果进行排序,可以自定义评分函数。 - **过滤与聚合**:通过Filter和...
利用 `Lucene.Net` 和盘古分词,我们可以构建一个强大的站内搜索系统,提供精准的关键词匹配、拼音模糊搜索、同义词搜索等功能。通过定制化的索引策略和搜索算法,可以提升用户的搜索体验,提高用户在网站的停留时间...
索引过程涉及分词(Tokenization)、词干提取(Stemming)、同义词扩展(Synonym Expansion)等步骤,将文本转换为可搜索的结构。 4. 分词器(Analyzer):负责将输入文本分解成一系列独立的词语,这是构建索引的...
支持Spring-data-solr1.5的ik分词器,并且修改了代码,添加一个新的类,用于支持同义词,目前可以同时支持分词和同义词的功能。 修改 managed-schema,添加 <analyzer type="index"> ...
5. **拼音和同义词支持**: 引入拼音库和同义词库,提高对中文模糊搜索的支持。 总之,Lucene站内搜索提供了一套强大且灵活的搜索框架,通过合理的配置和优化,可以实现高效、准确的站内信息检索。在实际项目中,...
- **近似匹配**:讲解了如何实现模糊匹配、同义词扩展等功能,以提高搜索的灵活性和准确性。 - **排序与评分**:分析了Lucene中如何根据相关性对搜索结果进行排序,并介绍了不同评分策略的影响。 - **章节6:扩展...
3. **SynonymFilter**:通过在索引阶段使用同义词过滤器,将同义词关联起来,使得在查询时即使输入的是同义词也能得到正确的结果。 四、IKAnalyzer应用 在实际应用中,我们可能会遇到中文分词的问题。这时,IK...
此外,还可以研究Lucene如何处理分词、同义词、停用词等问题,以及它如何利用倒排索引来实现高效的模糊匹配和短语查询。 另一方面,"ppt"可能是一些关于Lucene的演示文稿或教程,可能是讲解Lucene的基本使用方法、...
- **同义词处理(Synonyms)**:识别并处理同义词,扩大搜索范围。 6. **优化与性能** - **位集(Bitset)**:用于快速过滤和比较文档,提高查询效率。 - **缓存(Cache)**:利用内存缓存高频查询结果,提升...
在索引过程中,每个文档会被拆分成词语(Tokenization),然后对每个词语进行词干提取(Stemming)和同义词处理(Synonym Processing),生成倒排索引(Inverted Index)。 2. **字段(Fields)**:在Lucene中,...
这可能涉及到查询分析,比如同义词扩展、短语匹配等。 6. **搜索执行**:通过Lucene的Query类构建查询对象,然后使用IndexSearcher进行搜索。Lucene会返回匹配度最高的文档列表。 7. **结果展示**:最后,将搜索...
4. **高级查询**:Lucene.NET提供了丰富的查询API,可以实现更复杂的搜索逻辑,如近义词搜索、同义词搜索、拼音搜索等。 5. **扩展性**:Lucene.NET设计为可扩展,可以方便地集成到各种应用中,如Web应用程序、桌面...