Lucene.net でのインデックス作成または検索中に、数値句または数値を拒否できるかどうかを知りたいです。
たとえば (これは 1 行です)、
Hi all my no is 4756396
ここで、索引付けまたは検索を行うと、数値 4756396 の索引付けまたは検索を拒否する必要があります。1、2、3、4、5、6 などのカスタム ストップ ワード リストを作成してみましたが、単一の数字が表示された場合にのみ無視されると思います。
Lucene.net でのインデックス作成または検索中に、数値句または数値を拒否できるかどうかを知りたいです。
たとえば (これは 1 行です)、
Hi all my no is 4756396
ここで、索引付けまたは検索を行うと、数値 4756396 の索引付けまたは検索を拒否する必要があります。1、2、3、4、5、6 などのカスタム ストップ ワード リストを作成してみましたが、単一の数字が表示された場合にのみ無視されると思います。
をコピーし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);
}