3

データベース内の重複を除外する必要があります。問題は、重複が完全一致ではなく類似文書と見なされることです。この目的のためにFuzzyQuery、次のように使用することにしました。

var fuzzyQuery = new global::Lucene.Net.Search.FuzzyQuery(
                     new Term("text", queryText),
                     0.8f,
                     0);
 hits = _searcher.Search(query);

アイデアは、最小類似度を 0.8 に設定することでした (十分に高いと思います)。これにより、十分に類似していないドキュメントを除外して、類似したドキュメントのみが検出されます。

このコードをテストするために、既存のドキュメントが見つかるかどうかを確認することにしました。変数queryTextには、インデックスに格納されている値が割り当てられました。上記のコードは何も検出しませんでした。つまり、完全一致すら検出しませんでした。

インデックスは次のコードで作成されました:

 doc.Add(new global::Lucene.Net.Documents.Field(
            "text",
            text,
            global::Lucene.Net.Documents.Field.Store.YES,
            global::Lucene.Net.Documents.Field.Index.TOKENIZED,
            global::Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));

以下の推奨事項に従いましたが、結果は次のとおりです。 TermQuery は結果を返しません。で構築されたクエリ

 var _analyzer = new RussianAnalyzer();
 var parser = new global::Lucene.Net.QueryParsers
                .QueryParser("text", _analyzer);
 var query = parser.Parse(queryText);
 var _searcher = new IndexSearcher
       (Settings.General.Default.LuceneIndexDirectoryPath);
 var hits = _searcher.Search(query);

完全に一致するドキュメントと同様のコンテンツを持つ他のいくつかのドキュメントの最大スコアを持つ複数の結果を返します。

4

3 に答える 3

2

インデックス内を調べると役立つ場合があります。クエリを実行しているデータと、Lucene がデータをどのように「認識」しているかが明確に示されます。これにはルークを使用できます。Lucent.NET との既知の互換性の問題がいくつかありますが、何もないよりははるかに優れています。

于 2010-02-09T20:26:40.367 に答える
1

LuceneでMoreLikeThisクラスを試してください...「類似した」ドキュメントを識別するのに役立ついくつかの優れたヒューリスティックがエンコードされています。

于 2010-04-02T02:01:41.370 に答える
1

私はルークの推薦に二番目です。他にもいくつか試してみてください。

  1. 最初に正確なクエリを試してください。たとえば、「テキスト」という用語の TermQuery を試してください。これが機能しない場合、あいまいクエリは機能しません。
  2. Explain()を使用して、スコアリングがどのように行われたかを確認します (他のヒットがあった場合)。
  3. 検索での関連性の問題のデバッグの提案に従います。
于 2010-02-10T08:21:24.697 に答える