Lucene.net 4.8无法使用重音进行搜索



基于堆栈溢出方面的一些帮助,我设法创建了一个自定义分析器,但仍然无法解决单词有重音的搜索问题。

public class CustomAnalyzer : Analyzer
{
LuceneVersion matchVersion;
public CustomAnalyzer(LuceneVersion p_matchVersion) : base()
{
matchVersion = p_matchVersion;
}
protected override TokenStreamComponents CreateComponents(string fieldName, TextReader reader)
{
Tokenizer tokenizer = new KeywordTokenizer(reader);
TokenStream result = new StopFilter(matchVersion, tokenizer, StopAnalyzer.ENGLISH_STOP_WORDS_SET);            
result = new LowerCaseFilter(matchVersion, result); 
result = new StandardFilter(matchVersion, result);
result = new ASCIIFoldingFilter(result);
return new TokenStreamComponents(tokenizer, result);

}
}

其想法是能够搜索";perez";并且还发现";Pérez";。使用该分析器,我重新创建了索引,并搜索了带有重音的单词,但仍然没有结果。

作为LuceneVersion,我使用的是LuceneVersion。LUCENE_48

如有任何帮助,我们将不胜感激。谢谢

最初在GitHub上回答,但为了上下文而复制到这里。

不,在同一个Analyzer中使用多个标记器是无效的,因为需要遵守严格的消费规则。

最好构建代码分析组件,以确保开发人员在键入时遵守这些标记化规则,例如确保TokenStream类是密封的或使用密封的IncrementToken()方法的规则(欢迎投稿(。我们不太可能在4.8.0发布之前添加任何额外的代码分析器,除非它们是由社区贡献的,因为这些不会阻止发布。目前,确保自定义分析器遵守规则的最佳方法是使用Lucene进行测试。网TestFramework,它还使用多个线程、随机区域性和随机文本字符串来攻击它们,以确保它们是健壮的。

我在这里构建了一个演示,展示了如何在自定义分析器上设置测试:https://github.com/NightOwl888/LuceneNetCustomAnalyzerDemo(同时展示了上面的例子是如何通过测试的(。功能分析器只使用WhiteSpaceTokenizerICUFoldingFilter。当然,您可能希望添加额外的测试条件,以确保您的自定义分析器满足您的期望,然后您可以尝试使用不同的标记器,并添加或重新排列过滤器,直到您找到满足所有要求的解决方案(以及Lucene规则(。当然,以后您可以在发现问题时添加其他条件。

using Lucene.Net.Analysis;
using Lucene.Net.Analysis.Core;
using Lucene.Net.Analysis.Icu;
using Lucene.Net.Util;
using System.IO;
namespace LuceneExtensions
{
public sealed class CustomAnalyzer : Analyzer
{
private readonly LuceneVersion matchVersion;
public CustomAnalyzer(LuceneVersion matchVersion)
{
this.matchVersion = matchVersion;
}
protected override TokenStreamComponents CreateComponents(string fieldName, TextReader reader)
{
// Tokenize...
Tokenizer tokenizer = new WhitespaceTokenizer(matchVersion, reader);
TokenStream result = tokenizer;
// Filter...
result = new ICUFoldingFilter(result);
// Return result...
return new TokenStreamComponents(tokenizer, result);
}
}
}
using Lucene.Net.Analysis;
using NUnit.Framework;
namespace LuceneExtensions.Tests
{
public class TestCustomAnalyzer : BaseTokenStreamTestCase
{
[Test]
public virtual void TestRemoveAccents()
{
Analyzer a = new CustomAnalyzer(TEST_VERSION_CURRENT);
// removal of latin accents (composed)
AssertAnalyzesTo(a, "résumé", new string[] { "resume" });
// removal of latin accents (decomposed)
AssertAnalyzesTo(a, "reu0301sumeu0301", new string[] { "resume" });
// removal of latin accents (multi-word)
AssertAnalyzesTo(a, "Carlos Pírez", new string[] { "carlos", "pirez" });
}
}
}

关于您可能使用的测试条件的其他想法,我建议您查看Lucene。Net广泛的分析仪测试,包括ICU测试。您还可以参考这些测试,看看是否可以找到与您构建查询类似的用例(尽管请注意,这些测试没有显示.NET处理对象的最佳实践(。

最新更新