我在我的网站上使用了 leucene.net,它索引了一些正确且正确的词,但它没有索引一些像“الله”这样的词!
我已经看到了带有 Luke 的索引文件,它显示“الله”没有被索引。
我使用 ArabicAnalyzer 进行索引。
你可以在 www.qoranic.com 看到我的网站,如果你搜索“مریم”就可以了,但如果你搜索“الله”,它什么也没有显示。
任何想法都会受到赞赏。
我在我的网站上使用了 leucene.net,它索引了一些正确且正确的词,但它没有索引一些像“الله”这样的词!
我已经看到了带有 Luke 的索引文件,它显示“الله”没有被索引。
我使用 ArabicAnalyzer 进行索引。
你可以在 www.qoranic.com 看到我的网站,如果你搜索“مریم”就可以了,但如果你搜索“الله”,它什么也没有显示。
任何想法都会受到赞赏。
对该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;
}
}