0

何らかの理由で、SpanNearQuery を機能させることができません。過去 3 時間にわたってデバッグを試みましたが、無駄でした。私が愚かなことをしているなら、誰かが私に言うことができますか?これまでの私の試みは次のとおりです。

public static void Test2()
{
    Directory directory = FSDirectory.Open(new DirectoryInfo(Environment.CurrentDirectory + "\\LuceneIndex"));
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29);
    var writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);

    var article = new Document();
    article.Add(new Field("Id", "TEST-111111", Field.Store.YES, Field.Index.ANALYZED));
    article.Add(new Field("ArticleText", "How should I gather Active User statistics from the log file? There is somewhat more information available on Google.", Field.Store.YES, Field.Index.ANALYZED));

    writer.AddDocument(article);

    writer.Optimize();
    writer.Close();

    IndexReader indexReader = IndexReader.Open(directory, true);
    Searcher indexSearch = new IndexSearcher(indexReader);

    SpanNearQuery qq = new SpanNearQuery(new SpanQuery[] { new SpanTermQuery(new Term("ArticleText", "Active")), new SpanTermQuery(new Term("ArticleText", "User")) }, 3, true);

    Console.WriteLine(qq.ToString());

    TopDocs resultDocs = indexSearch.Search(qq, indexReader.MaxDoc());

    Console.WriteLine("Results Found: " + resultDocs.totalHits); // Gives me zero

    indexSearch.Close();
    directory.Close();

    Console.Read();

}
4

1 に答える 1

2

問題はテキスト分析にあります。StandardAnalyzer はインデックス内の単語を小文字にしますが、クエリには大文字 ( Active, User) が含まれています。

クエリ用語を小文字にするか、理想的にはそれらに StandardAnalyzer を適用する必要があります。そこではQueryParserが役立つと思います ( example )。

QueryParser は SpanNearQuery をサポートしていません。SpanNearQuery が必要な場合は、各用語を自分で分析するのが最善だと思います。

更新 - QueryParser (PhraseQuery) と SpanNearQuery の比較: QueryParser は近接クエリをサポートしていますが、SpanNearQuery ほどの柔軟性はありません。次の文字列をクエリとして QueryParser: に渡します"active user"~3。QueryParser は、スロップが 3 の PhraseQuery に変換します (StandardAnalyzer を介してクエリを実行することは言うまでもありません)。PhraseQuery には次の違いがあります。

  • PhraseQueryは用語を順番に照合します。クエリは「アクティブな xx ユーザー」には一致しますが、「ユーザー xx アクティブ」には一致しません。
  • PhraseQueryは、ワイルドカードまたはサブフレーズをサポートしていません。たとえば、次のクエリは QueryParser では有効ではありませんが、SpanNearQuery で同等の結果を得ることができます: "active use*"~3,""active user" statistics"~5
  • いくつかのスコアの違いがあります。また、傾斜が非常に低い場合の距離計算のわずかな違いを思い出しますが、ネット上でそれについて何も見つけることができません.

active例が推測するように前に一致する必要がある場合user(SpanNearQuery の inOrder を true に設定)、QueryParser/PhraseQuery が機能する可能性があります。(個人的には使ったことがないので、長所や短所については言えません。)

于 2013-08-03T11:36:03.000 に答える