如何将自定义TokenFilter从Lucene.Net 3.0.3迁移至4.8版本
你的猜测完全正确,Lucene.Net 4.8 版本已废弃 3.x 中的 ITermAttribute,统一使用 ICharTermAttribute 处理词项文本,适配后的完整实现如下:
using Lucene.Net.Analysis; using Lucene.Net.Analysis.TokenAttributes; using System.Text; using System.Globalization; public sealed class AccentFoldingFilter : TokenFilter { private readonly ICharTermAttribute termAttribute; public AccentFoldingFilter(TokenStream input) : base(input) { // 从输入Token流中获取ICharTermAttribute实例 termAttribute = GetAttribute<ICharTermAttribute>(); } public override bool IncrementToken() { if (m_input.IncrementToken()) { // 读取原始词项文本,去除音调后更新回属性 string cleanedText = termAttribute.ToString().RemoveDiacritics(); termAttribute.SetEmpty().Append(cleanedText); return true; } return false; } // 你提供的RemoveDiacritics扩展方法可以直接复用,无需修改 public static string RemoveDiacritics(this string text) { var normalizedString = text.Normalize(NormalizationForm.FormD); var stringBuilder = new StringBuilder(); foreach (var c in normalizedString) { var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c); if (unicodeCategory != UnicodeCategory.NonSpacingMark) { stringBuilder.Append(c); } } return stringBuilder.ToString().Normalize(NormalizationForm.FormC); } }
核心改动说明
- 接口替换:将
ITermAttribute替换为ICharTermAttribute,对应的命名空间为Lucene.Net.Analysis.TokenAttributes - 逻辑适配:原来读取词项的
Term属性替换为直接调用ToString()获取文本,原来设置词项的SetTermBuffer()方法替换为SetEmpty().Append(处理后文本)的组合调用,和原有逻辑功能完全对齐 - 字段适配:4.8 版本中
TokenFilter的输入流字段已改为m_input,直接调用GetAttribute方法即可获取对应属性实例,无需通过输入流额外调用
内容的提问来源于stack exchange,提问作者Jesús López
相关产品推荐
相关产品推荐

