【问题标题】:Lucene Analyzer to Use With Special Characters and Punctuation?Lucene Analyzer 与特殊字符和标点一起使用?
【发布时间】:2010-04-29 02:19:15
【问题描述】:

我有一个 Lucene 索引,其中包含多个文档。每个文档都有多个字段,例如:

Id
Project
Name
Description

Id 字段将是一个唯一标识符,例如 GUID,Project 是用户的 ProjectID,用户只能查看其项目的文档,Name 和 Description 包含可以包含特殊字符的文本。

当用户在名称字段上执行搜索时,我希望能够尝试尽可能匹配,例如:

First

两者都会返回:

First.Last 

First.Middle.Last

名称也可以是:

Test (NameTest)

如果用户在哪里输入“Test”、“Name”或“(NameTest)”,那么他们可以找到结果。

但是,如果我说 Project 是“ProjectA”,那么它需要完全匹配(不区分大小写的搜索)。 Id 字段也是如此。

我应该将哪些字段设置为标记化,哪些设置为未标记化?另外,我应该考虑使用一个好的分析器来实现这一点吗?

我一直在努力确定实现所需搜索的最佳途径。

【问题讨论】:

    标签: c# indexing lucene lucene.net


    【解决方案1】:

    您的 ID 字段应该被取消标记,原因很简单,除非您编写自己的标记器,否则它似乎不会被标记(基于空格)。您可以标记所有其他字段。

    对项目名称执行短语查询、查找 PhraseQuery 或将您的项目名称用双引号括起来(这将使其完全匹配)。示例:“\”我的幻想项目“\”

    对于名称字段,一个简单的查询应该可以正常工作。

    不确定是否存在需要字段组合的情况。在这种情况下查找 BooleanQuery(它允许您以布尔方式组合不同的查询)

    【讨论】:

    • 我确实计划对“测试”之类的名称和描述进行布尔查询。在这种情况下,我想返回在任一字段中包含 test 的所有文档。我希望我的查询由项目 ID 限定。示例:(名称或描述包含“测试”)AND 项目 ID = 3(完全匹配)我假设项目 ID 将被取消标记,名称和描述将使用标准分析器进行标记。使用 QueryParser 类的标准布尔查询能否实现我的目标?
    • 是的,上面应该可以工作。如果您的项目 ID 可能只是一个数字或某个标识符(Lucene 术语中的“术语”),则可以使用 TermQuery。
    • 我按照您所说的进行了操作,但遇到了一些麻烦。插入标记化字段时,我转义了特殊字符。使用 QueryParser 执行搜索时,我在使用 StandardAnalyzer 执行搜索之前转义了搜索值。一个问题是,如果我的索引中有 2 个对象并且它们的名称分别是“测试”和“测试(测试)”,当我执行搜索“测试(测试)”并转义特殊字符时,我会同时返回对象。我知道它从我的输入中创建了 2 个术语 'Test' 和 '\(Test\)',但它为什么同时得到这两个术语是没有意义的。
    • 我应该补充一点,我认为它将对术语执行“与”操作,以匹配符合所有术语标准的字段/值对的文档。
    猜你喜欢
    • 2011-05-03
    • 2011-10-24
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多