【问题标题】:ASCIIFoldingFilter usage example on Lucene.NETLucene.NET 上的 ASCIIFoldingFilter 使用示例
【发布时间】:2011-07-13 21:18:28
【问题描述】:

我正在尝试在 Lucene.NET 上实现我的搜索,我的需求是:

  • 直接搜索找到结果
  • 如果没有结果,用不区分重音再次搜索

我是在 SQL Server 上完成的,但我想将其移至 Lucene.NET。我做了一个研究,首先我在 Lucene 中找到了 ISOLatinFilter,然后是 ASCIIFoldingFilter。但我找不到如何使用它的简单示例(即使在 Lucene in Action 书中)

你能给我一个小示例代码来实现不区分重音的搜索吗?我需要更改索引上的任何其他内容吗?由于我还需要区分重音,因此我不能只创建不区分重音的索引。

谢谢

【问题讨论】:

  • 这可能会给你一些想法:stackoverflow.com/questions/3354948/…
  • 我检查并尝试了它,但是当我使用 ASCIIFoldingFilter 时,它只使用不区分重音的版本索引我的值。 (即:göz 被索引为 goz)但我需要两个版本。 (即:当我搜索 göz 时,如果有直接的 göz 记录,它不应该返回 goz)有没有办法同时索引两者区分口音和不区分口音的版本?
  • 您需要索引数据两次(在 2 个不同的字段中),以便一个字段有重音,而另一个没有。搜索时,首先查看带重音的字段,然后查看不带重音的字段。或者,您可以同时在两个字段中进行搜索,但对带有重音符号的字段赋予更高的权重。

标签: c# lucene ascii lucene.net


【解决方案1】:

使用这个类作为索引和搜索的分析器,为我工作。

    public class CustomAnalyzer : StandardAnalyzer
    {
        Lucene.Net.Util.Version matchVersion;

        public CustomAnalyzer(Lucene.Net.Util.Version p_matchVersion)
            : base(p_matchVersion)
        {
            matchVersion = p_matchVersion;
        }

        public override TokenStream TokenStream(string fieldName, System.IO.TextReader reader)
        {
            TokenStream result = new StandardTokenizer(matchVersion, reader);
            result = new StandardFilter(result);
            result = new ASCIIFoldingFilter(result);
            return result;
        }

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    相关资源
    最近更新 更多