1

Lucene.net でのインデックス作成または検索中に、数値句または数値を拒否できるかどうかを知りたいです。

たとえば (これは 1 行です)、

Hi all my no is 4756396

ここで、索引付けまたは検索を行うと、数値 4756396 の索引付けまたは検索を拒否する必要があります。1、2、3、4、5、6 などのカスタム ストップ ワード リストを作成してみましたが、単一の数字が表示された場合にのみ無視されると思います。

4

1 に答える 1

1

をコピーしStandardAnalyzerて文法 (単純な JFlex のもの) をカスタマイズし、数値トークンを拒否することができます。その場合、JFlex は Java コードを生成するため、アナライザーを Java に戻す必要があります。C# Flex で試してみることもできます。

TokenFilterトークンを 1 つずつスキャンし、それらが数字の場合は拒否する を作成することもできます。整数のみをフィルタリングし、たとえばハイフンで区切られた数値を保持したい場合、フィルターは単純に adouble.TryParse()を試行し、失敗した場合はトークンを受け入れます。より堅牢でカスタマイズ可能なソリューションでも、語彙パーサーを使用します。

編集:

これは、私が言いたいことの簡単なサンプルであり、その使用方法を示す小さなメイン メソッドがあります。これTryParse()では、トークンを除外するために a を使用しました。より複雑な製品システムの場合は、語彙パーサー システムを使用します。(そのためにC#Flexを見てください)

public class NumericFilter : TokenFilter
{
    private ITermAttribute termAtt ;

    public NumericFilter(TokenStream tokStream)
        : base(tokStream)
    {
        termAtt = AddAttribute<ITermAttribute>();
    }

    public override bool IncrementToken()
    {
        while (base.input.IncrementToken())
        {
            string term = termAtt.Term;
            double res ;
            if(double.TryParse(term, out res))
            {
                // skip this token
                continue;
            }
            // accept this token
            return true;
        }
        // no more token in the stream
        return false;
    }
}

static void Main(string[] args)
{
    RAMDirectory dir = new RAMDirectory();
    IndexWriter iw = new IndexWriter(dir, new KeywordAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED);

    Document d = new Document();
    Field f = new Field("text", "", Field.Store.YES, Field.Index.ANALYZED);
    d.Add(f);

    // use our Filter here
    f.SetTokenStream(new NumericFilter(new LowerCaseFilter(new WhitespaceTokenizer(new StringReader("I have 300 dollars")))));
    iw.AddDocument(d);

    iw.Commit();
    IndexReader reader = iw.GetReader();
    // print all terms in the text field
    TermEnum terms = reader.Terms(new Term("text", ""));
    do
    {
        Console.WriteLine(terms.Term.Text);
    }
    while (terms.Next());

    reader.Dispose();
    iw.Dispose();
    Console.ReadLine();
    Environment.Exit(42);
}
于 2013-04-22T19:47:18.103 に答える