2013-08-30 43 views
0

我使用leucene.net为我的网站,它索引的一些单词罚款和正确的,但它并没有索引一些词像“الله”!Lucene不索引一些单词?

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

我已经使用ArabicAnalyzer进行索引。

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

任何想法在转发的赞赏。

回答

1

ArabicAnalyzer对输入进行了一些转换;它会将输入الله转换为له。这是由于其与记录...

词干提取被定义为ArabicStemFilter(和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; 
    } 
} 
+0

你说得对,我该如何防止ArabicAnalyzer改变“الله”,并将这个词完全按照原样编入索引,而不是将其改为“له”? – MRP