`
archangel
  • 浏览: 12153 次
文章分类
社区版块
存档分类
最新评论

Lucene针对多语言搜索的一个问题

    博客分类:
  • java
阅读更多
最近在做一个多语言的内容管理系统,搜索引擎部分用的Lucene,本来自信对Lucene还是比较了解的,结果多语言部分还是碰到了麻烦。
我的一个Document数据结构是这样的,一组基本信息,如文章id(articleId),文章创建时间(createTime)等,最后是多语言版本的文章内容(articleContent),针对于不同语言类型,保存Field时名称追加语言识别码,如英文,就是articleContent_en。
Document结构如下:
//Field数量不固定,每种语言都会增加一个Field
Document{
    articleId
    createTime
    ...
    articleContent_en
    articleContent_ch
    ...
}

全文搜索时,只要有一种语言的文章内容匹配,搜索就返回该Document。最后显示的时候,也要给出用户所有语言版本的预览信息。

就在这里,我碰到一个问题,我使用中文Analyzer只能支持中文和英文的索引和搜索,假如文章是日文,Analyzer只能分出其中的中文部分。

开始我不想改变数据结构,毕竟这个结构对于搜索来说最简单,那么,我想到的是对不同语言的文章内容使用不同的Analyzer进行分词,也就是当我判断文章内容是日文的时候,使用Lucene自带的StandardAnalyzer进行一元分词处理。但很快发现这个方案行不通,因为Lucene在构建索引时,Analyzer是Document级的,也就是一个Document的所有Field只能使用同一个Analyzer进行解析,Lucene的示意代码如下:
//Field中没有传入Analyzer的方法
Document.add(new Field(...));

//此处可以看出,Analyzer是和Document级别对应的
IndexWriter.addDocument(Document, Analyzer);


之后我又想到了第二个解决方案,修改我的Document结构,将一个Document分解为基本信息Document和单个语言文章内容Document这样几个Document的组合结构。每个Document都有articleId这个Field,增加一个docType的Field区分是基本信息的Document还是文章内容的Document,假设基本信息的docType为1,文章内容为2。
Document结构如下:
//基本信息Document
Document{
    docType = 1
    articleId
    createTime
    ...
}

//文章内容Document
Document{
    docType = 2
    articleId
    articleContent
}

这样对于不同的语言种类的同一篇文章,就可以使用不同的Analyzer进行索引了。但是很快发现如果这么拆分,复合搜索的过程会变得很复杂,比如以下条件:
文章关键字为“尼斯湖 水怪 考证”
文章创建时间要在2005年之后


搜索过程变成了:
1. 用关键字和docType等于2两个条件搜索进行联合搜索,得出搜索含有关键字的文章Document。
2. 从第一次搜索结果的Document中提取所有关键字匹配的文章的articleId,联合createTime早于2005年以及docType等于1这两个条件进行第二次搜索,得出真正符合用户要求的结果。
3. 进行当前分页页面的内容提取,将基本信息Document作为主信息,利用articleId和docType等于2两个条件搜索其下所有语言版本文章内容,组合成完整信息返回给页面。代码如下:
class Article{
    Document articleBaseInfoDoc;
    List articleContentList;
}


这个方案理论上能解决问题,但是会使搜索过程复杂很多,也不是我希望看到的。

于是想到第三种方案,修改Analyzer。把我使用的中文Analyzer进行修改,判断语言种类,如果不是中文,则直接按照StandartAnalyzer方式进行分词。但是我用的那个Analyzer不是开源的,源码经过了混淆,读起来都异常费劲,更别说修改。

不知道有没有人碰到过和我相同的问题,能给我一些提示,非常感谢。

另外:
通过这个事我发现了Lucene设计上的一个费解的事情,Lucene索引时不能对Field级别进行不同Analyzer分词处理,但是搜索的时候可以进行不同Field使用不同Analyzer分词搜索,搜索代码如下:
//针对每一个Field的搜索解析器都可以传入不同的Analyzer
QueryParser parser = new QueryParser("articleContent", analyzer);

好生奇怪。
分享到:
评论
2 楼 archangel 2008-02-20  
非常感谢,这正是我需要的。我查了Document和Field类的子类,唯独没查Analyzer的子类...没想到文章就在这个上面。

看来这是Lucene开发者对这种不对称设计的一个补救方案。
1 楼 melin 2008-02-19  
针对每一个field(articleContent_*)使用不同的分词器
* <pre>
*   PerFieldAnalyzerWrapper aWrapper =
*      new PerFieldAnalyzerWrapper(new StandardAnalyzer());
*   aWrapper.addAnalyzer("firstname", new KeywordAnalyzer());
*   aWrapper.addAnalyzer("lastname", new KeywordAnalyzer());
* </pre>

In this example, StandardAnalyzer will be used for all fields except "firstname"
and "lastname", for which KeywordAnalyzer will be used.

相关推荐

    Lucene.NET全文索引搜索Demo项目

    6. **多语言支持**:除了使用IKAnalyzerNet进行中文分词,Lucene.NET还支持其他语言的分析器,如英文的StandardAnalyzer,可以处理不同语言的搜索需求。 7. **扩展性**:Lucene.NET设计为模块化,可以方便地集成到...

    基于lucene的桌面搜索引擎

    本项目“基于Lucene的桌面搜索引擎”正是针对这一需求,利用开源全文搜索引擎库Lucene实现了一个桌面级别的搜索解决方案。 **一、Lucene简介** Lucene是Apache软件基金会的一个开放源代码项目,它是Java语言编写的...

    基于Lucene的搜索引擎的研究与应用

    Lucene是由Apache软件基金会提供的一个开源的全文搜索引擎库,它为用户提供了一组用Java编写的索引和搜索程序库。它具备高性能、可扩展性强的特点,可以用来构建各种搜索引擎应用。Lucene使用倒排索引,能够快速准确...

    ssd.rar_lucene_搜索 lucene_搜索引擎_文本搜索

    **Lucene搜索引擎简介** Lucene是一个高性能、全文检索库,由Apache软件基金会开发并维护,是Java...在实际应用中,可能还需要考虑性能优化、多语言支持、实时索引更新等问题,以提供更高效、准确和便捷的搜索体验。

    Lucene搜索技术

    【Lucene搜索技术】是一种基于Java的全文索引引擎工具包,它并非一个完整的全文搜索引擎,而是提供了一套用于构建全文检索应用的API。Lucene的主要目标是方便开发者将其嵌入到各种应用程序中,实现对特定数据源的...

    Lucene.Net +盘古分词 搜索引擎

    "盘古分词"是一个专门针对中文的分词工具,它可以将中文文本有效地切分成一个个独立的词语,为Lucene.Net提供精确的索引和查询基础。盘古分词以其高效、准确和丰富的词汇库,广泛应用于各种中文信息处理系统,包括...

    lucene相关十几个包

    这些文件的集合展示了Lucene的广泛功能和对多语言支持,同时也反映了Lucene在不同时间点的发展。使用这些组件,开发者能够创建复杂的全文搜索解决方案,支持多种语言,并进行有效的索引管理和查询处理。在实际应用中...

    lucene-4.7.0.zip

    总结,Apache Lucene 4.7.0作为一个强大的全文搜索引擎库,不仅提升了性能,还增强了对多语言和复杂查询的支持,是开发者实现高效、精确搜索功能的得力工具。无论是新手还是经验丰富的开发者,都能从这个版本中受益...

    Lucene实战

    Lucene是一个高性能、全文本检索库,它允许开发人员轻松地添加高级搜索功能到他们的项目中。下面,我们将详细讨论Lucene的一些核心概念和实战技巧。 1. **Lucene简介** Lucene是Java编写的一个开源全文检索库,由...

    实时搜索引擎源码LUCENE 实时搜索引擎源码LUCENE

    在LUCENE中,文档是搜索的基本单位,它由一个或多个字段(Field)组成,每个字段都有自己的名称和内容。例如,一个网页可以被视为一个文档,包含标题、内容、URL等字段。 #### 1.2 字段(Field) 字段是文档的组成...

    lucene+nutch搜索引擎开发源码1

    《lucene+nutch搜索引擎开发源码1》是一个包含开源搜索引擎项目Lucene和Nutch源代码的压缩包,主要针对搜索引擎开发的学习和实践。这个压缩包是书籍《lucene+nutch搜索引擎开发》的一部分,由于源码量较大,因此分为...

    lucene、lucene.NET详细使用与优化详解

    lucene 是一个广泛使用的全文搜索引擎库,其.NET版本称为lucene.NET,它提供了强大的文本检索和分析能力,适用于各种场景下的全文搜索需求。lucene 并非一个可以直接使用的成品应用,而是作为一个框架,需要开发者...

    Lucene实战(中文版第二版)对应Lucene版本

    此资源对应的是Lucene 3.0.3版本,这是Lucene发展历史中的一个重要里程碑。 在Lucene 3.0.3版本中,包含了以下关键知识点: 1. **索引构建**:Lucene的核心功能之一就是快速构建倒排索引。这个版本中,你可以学习...

    Lucene.NET2.9搜索引擎源代码(C#)

    Lucene.NET 是一个基于 Apache Lucene 的全文搜索引擎库,它是用 C# 实现的。Apache Lucene 是一个高性能、可扩展的信息检索库,广泛用于构建复杂的搜索功能。Lucene.NET 2.9 版本提供了对 .NET Framework 的全面...

    lucene搜索引擎简介

    它不是完整的全文检索引擎,而是提供了一个架构,包括完整的查询引擎和索引引擎,以及部分文本分析功能,主要针对英文和德文这两种西方语言。Lucene的创建者Doug Cutting是一位经验丰富的全文索引/检索专家,他曾在V...

    Lucene原理及使用总结

    Lucene是一个基于Java的全文信息检索工具包,它被广泛应用于构建搜索引擎和文本检索系统。Lucene最初由Doug Cutting开发,并且现在是Apache软件基金会Apache Jakarta项目的一部分,可以在官方网站...

    Lucene 课件

    Apache Lucene 是一个强大的开源全文搜索引擎库,由Java编写,它不是一个完整的搜索引擎应用程序,而是提供了一套功能强大的工具,可以方便地集成到各种应用程序中,以实现全文索引和检索功能。Lucene的核心特性在于...

    Lucene4.X实战类baidu搜索的大型文档海量搜索系统-08.Lucene搜索实战2 共5页.pptx

    Lucene是一个开源的全文搜索引擎库,它提供了强大的索引和搜索功能,被广泛应用于各类文档的海量搜索系统中。在"Lucene4.X实战类baidu搜索的大型文档海量搜索系统"课程中,涵盖了一系列关于Lucene的核心知识点,包括...

Global site tag (gtag.js) - Google Analytics