0

我在我的网站上使用了 leucene.net,它索引了一些正确且正确的词,但它没有索引一些像“الله”这样的词!

我已经看到了带有 Luke 的索引文件,它显示“الله”没有被索引。

我使用 ArabicAnalyzer 进行索引。

你可以在 www.qoranic.com 看到我的网站,如果你搜索“مریم”就可以了,但如果你搜索“الله”,它什么也没有显示。

任何想法都会受到赞赏。

4

1 回答 1

1

对该ArabicAnalyzer输入进行了一些转换;它将输入转换اللهله. 这是由于使用了ArabicStemFilter(and ArabicStemmer) 记录在 ...

词干定义为:

  • 删除附加的定冠词、连词和介词。
  • 常见后缀的词干。

这应该不是问题,因为您应该在搜索时通过相同的分析器解析用户提供的查询,从而生成相同的标记。

这是我用来查看分析器从给定输入生成哪些术语的示例代码。

using System;
using Lucene.Net.Analysis.AR;
using Lucene.Net.Analysis.Tokenattributes;
using System.IO;

namespace ConsoleApplication {
    public static class Program {
        public static void Main() {
            var luceneVersion = Lucene.Net.Util.Version.LUCENE_30;

            var input = "الله";
            var analyzer = new ArabicAnalyzer(luceneVersion);

            var inputReader = new StringReader(input);
            var stream = analyzer.TokenStream("fieldName", inputReader);

            var termAttribute = stream.GetAttribute<ITermAttribute>();
            while(stream.IncrementToken()) {
                Console.WriteLine("Term: {0}", termAttribute.Term);
            }

            Console.WriteLine("Done.");
            Console.ReadLine();
        }
    }
}

您可以通过编写一个Analyzer使用 的自定义来克服这种行为(删除词干) ArabicNormalizationFilter,就像这样ArabicAnalyzer做一样,但没有调用ArabicStemFilter.

public class CustomAnalyzer : Analyzer {
    public override TokenStream TokenStream(String fieldName, TextReader reader) {
        TokenStream result = new ArabicLetterTokenizer(reader);
        result = new LowerCaseFilter(result);
        result = new ArabicNormalizationFilter(result);
        return result;
    }
}
于 2013-09-11T05:34:15.943 回答