1

私は自分のプロジェクトに沿って移動しており、ファイルの内容を扱う岐路に立っています。いくつかの分類フィールドを持つ作業インデックスを正常に作成しましたが、ファイルの内容にキーワード検索を適用したいと考えています。私の問題は、リーダーに lucene を渡すと、ファイルの内容全体をインデックス化する API に変換されるかどうかわからないことです。オンラインで検索を行ったところ、IFilter が必要であるという提案が見つかりました。それは本当ですか? やや複雑なようです。とにかく、ファイルの内容をインデックス化するための私のコードは以下にあり、機能しません(リーダーが渡された場合は失敗します)。理想的には、doc および docx ファイルを処理できるようにしたいと考えています。どんな助けでも大歓迎です。

リーダーを作成する私のコード

public void setFileText()
        {

            var FD = new System.Windows.Forms.OpenFileDialog();
            StreamReader reader;
            if (FD.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                string fileToOpen = FD.FileName;
                reader = new StreamReader(fileToOpen);
            }
            else
            {
                reader = null;
            }
            this.FileText =  reader;
        }
}

ドキュメントをインデックスに追加する私のコード

 private static void _addToLuceneIndex(MATS_Doc Data, IndexWriter writer)
        {
            // remove older index entry
        //    Query searchQuery = new TermQuery(new Term("Id", Data.Id.ToString()));
          //  writer.DeleteDocuments(searchQuery);

            // add new index entry
            Document doc = new Document();

            // add lucene fields mapped to db fields

            doc.Add(new Field("Id", Data.Id.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
            if (!string.IsNullOrEmpty(Data.Title))
                doc.Add(new Field("Title", Data.Title, Field.Store.YES, Field.Index.NOT_ANALYZED));
            if (!string.IsNullOrEmpty(Data.Plant))
                doc.Add(new Field("Plant", Data.Plant, Field.Store.YES, Field.Index.NOT_ANALYZED));
            if (!string.IsNullOrEmpty(Data.Containment))
                doc.Add(new Field("Containment", Data.Containment, Field.Store.YES, Field.Index.NOT_ANALYZED));
            if (!string.IsNullOrEmpty(Data.Part))
                doc.Add(new Field("Part", Data.Part, Field.Store.YES, Field.Index.NOT_ANALYZED));
            if (!string.IsNullOrEmpty(Data.Operation))
                doc.Add(new Field("Operation", Data.Operation, Field.Store.YES, Field.Index.NOT_ANALYZED));
            if (!string.IsNullOrEmpty(Data.Geometry))
                doc.Add(new Field("Geometry", Data.Geometry, Field.Store.YES, Field.Index.NOT_ANALYZED));
            if (Data.FileText != null)
                doc.Add(new Field("Text", Data.FileText));
            // add entry to index
            writer.AddDocument(doc);
        }
4

3 に答える 3

2

IFitler を使用するのは実際には非常に簡単です。

Eclipse.IndexingService (c#) を使用することをお勧めします。

次に、必要に応じてIFitlersをインストールする以外に、次のことを行う必要があります。

using (FilterReader filterReader = new FilterReader(path, Path.GetExtension(path)))
{
     filterReader.Init();
     string content = filterReader.ReadToEnd();
}

ここで IFitler の詳細を読むことができます。

http://www.codeproject.com/Articles/31944/Implementing-a-TextReader-to-extract-various-files

http://www.codeproject.com/Articles/13391/Using-IFilter-in-C

于 2013-02-21T07:50:42.893 に答える
0

Lucene 自体は .doc および .docx ファイルを処理できません。Lucene 自体は検索エンジンを構築するための単なるライブラリであるため、ここではSolrを検討する価値があります。

于 2013-02-20T22:02:54.020 に答える
0

検討する価値のある別のオプションは、 RavenDB を使用することです。これは、インデックス作成エンジン用に Lucene.Net を内部的に実装します。デスクトップ アプリにいるように見えるので、RavenDB の組み込みモードを検討する必要があります。

その後、私のIndexed Attachments Bundleを使用できます。これは、これらの多くを管理します。ドキュメントを添付ファイルとしてアップロードするだけで、IFilters を使用してドキュメントからテキストが抽出されます。そのテキストに自動的に索引を作成します。その後、そのインデックスで全文 Lucene 検索を実行できます。必要に応じて、見つかった検索用語を強調表示することもできます。

バンドルのドキュメントは現在不足していますが、単体テストから必要なものを収集できるはずです。

于 2013-02-25T21:33:53.763 に答える