Lucene中的Analyzer
为了更好地搜索中文,在Lucene中通过WhitespaceTokenizer、WordDelimiter Filter、LowercaseFilter处理英文字符串。
Lucene中的StandardAnalyzer对于中文采用了单字切分的方式,这样的结果是单字匹配,如搜索"上海",可能会返回和"海上"有关的结果。
CJKAnalyzer采用了二元覆盖的方式实现。小规模搜索网站可以采用二元覆盖的方法,这样可以解决单字搜索"上海"和"海上"混淆的问题。采用中文分词的方法适用于中大规模的搜索引擎。猎兔搜索提供了一个基于Lucene接口的Java版中文分词系统。
可以对不同的索引列使用不同的Analyzer来切分。例如可以对公司名采用CompanyAnalyzer来分析;对地址列采用AddressAnalyzer来分析。这样可以通过更细分化的切分方式来实现更准确合适的切分效果。
例如把"唐山聚源食品有限公司"拆分成如表4-1所示的结果。
表4-1 公司名拆分结果表
词 开始位置 结束位置 标注类型
唐山 0 2 City
聚源 2 4 KeyWord
食品 4 6 Feature
有限公司 6 10 Function
这里的开始位置和结束位置是指词在文本中的位置信息,也叫做偏移量。例如"唐山"这个词在"唐山聚源食品有限公司"中的位置是0-2。OffsetAttribute属性保存了词的位置信息;TypeAttribute属性保存了词的类型信息。
专门用来处理公司名的CompanyAnalyzer实现代码如下所示:
引用
public class CompanyAnalyzer extends
Analyzer {
public TokenStream tokenStream
(String fieldName, Reader reader) {
//调用ComTokenizer切分公司名
TokenStream stream = new
ComTokenizer(reader);
//调用ComFilter后续加工
stream = new ComFilter (stream);
return stream;
}
}
对不同的数据写了不同用途的分析器,需要在同一个索引中针对不同的索引列使用。一般情况下只使用一个分析器。为了对不同的索引列使用不同的分析器,可以使用PerFieldAnalyzerWrapper。在PerFieldAnalyzerWrapper中,可以指定一个默认的分析器,也可以通过addAnalyzer方法对不同的列使用不同的分析器,例如:
引用
PerFieldAnalyzerWrapper aWrapper =
new PerFieldAnalyzerWrapper(new CnAnalyzer());
aWrapper.addAnalyzer("address", new AddAnalyzer());
aWrapper.addAnalyzer("companyName",
new CompanyAnalyzer());
在这个例子中,将对所有的列使用CnAnalyzer,除了地址列使用AddAnalyzer且公司名称列使用CompanyAnalyzer。像其他分析器一样,PerFieldAnalyzerWrapper可以在索引或者查询解析阶段使用。
分享到:
相关推荐
【Lucene源码解读1】 Lucene是一款开源的全文搜索引擎库,由Apache软件基金会开发,广泛应用于各种信息检索系统。其强大的搜索功能和高效的性能深受开发者喜爱。在深入理解Lucene之前,我们需要先了解它的核心概念...
这部分可能涉及一些关键类的源码解读,如Analyzer、IndexWriter、QueryParser等。 10. **实战案例**:书中可能包含了一些实际项目中的例子,展示如何将Lucene集成到Web应用或其他系统中,以及解决实际问题的经验...
最后,可能还提到了自定义索引和查询策略,比如倒排索引的优化、定制化Analyzer、分词策略以及自定义Query和Filter的实现,这些都是为了适应特定领域或应用场景的需求。 通过以上分析,我们可以看出,《Lucene In ...
### Lucene介绍与源码解读 #### 一、Lucene概述 Lucene是一个开放源代码的全文检索引擎工具包,由Doug Cutting所创立,并于2002年捐赠给了Apache基金会。Lucene并非一个完整的搜索引擎解决方案,而是一个提供全文...
《Lucene 4.4 使用手册》详细解读 Lucene 是一个开源的全文检索库,由 Apache 软件基金会开发。它提供了高效的全文检索功能,适用于各种应用场景,包括站内搜索、论坛、博客文章、商品搜索等。全文检索的核心在于...
`Analyzer`是Lucene中的核心组件之一,负责将文本分词并转换为TokenStream,用于索引和搜索。 2. **创建IndexSearcher:** `IndexSearcher`用于执行搜索操作。在构造函数中,通过`IndexReader.open()`打开指定目录...
**二、Lucene 的核心组件** 1. **文档(Document)**:文档是 Lucene 中的基本信息单元,可以包含多个字段(Field),如标题、内容等。每个字段都有其特定的属性,如是否可搜索、是否存储原始值等。 2. **字段...
例如,在 LuceneDemo1 中,我们可能会看到一个定制的 Analyzer 类,用于处理特定语言或领域的文本。 **2. 索引构建:** Lucene 使用倒排索引(Inverted Index)结构,这是一种优化的搜索数据结构。在这个过程中,每...
《Lucene in Action》中文版是关于Apache Lucene搜索引擎库的详细解读,它涵盖了Lucene的基本概念、核心功能以及实际应用。这本书的前四章深入浅出地介绍了Lucene的关键知识点,对于想要学习和理解Lucene的人来说是...
3. `AnalyzerPanel`:这个类处理用户输入的文本,通过Lucene的`Analyzer`进行分析,并展示分词结果。源码中,它实现了文本输入、分词器选择和分词结果显示的功能。 四、源码学习的价值 通过对Luke 3.5源码的学习,...
常见的分词器有标准分词器(Standard Analyzer)、中文分词器(Smart Chinese Analyzer)等。安装分词器通常涉及下载对应的插件,然后使用Elasticsearch的`bin/elasticsearch-plugin`命令进行安装。 例如,安装IK...