3

最近Lucene.NETを使い始めましたが、いくつか問題がありIndexWriterます。ドキュメントのインデックスを作成するためにを使用しましたが、いくつかの、、、、ファイルが生成されたため、機能しC:\\TestIndexたと思います。.fnm.frq.cfx.tii.tis

問題は、それらを簡単に検索しようとすると、結果が返ってこないことです。以下は私が使用するコードです、

using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.QueryParsers;
using Lucene.Net.Search;
using Lucene.Net.Store;
using Lucene.Net.Util;

//Provide the directory where index is stored
Directory directory = FSDirectory.Open(newSystem.IO.DirectoryInfo(@"C:\\TestIndex")); 

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

Analyzer std = new StandardAnalyzer(Version.LUCENE_29);
QueryParser parser = new QueryParser(Version.LUCENE_29, "text", std);
Query qry = parser.Parse("morning");

// true opens the index in read only mode
Searcher srchr = new IndexSearcher(IndexReader.Open(directory, true));

TopScoreDocCollector cllctr = TopScoreDocCollector.Create(100, true);

ScoreDoc[] hits = cllctr.TopDocs().ScoreDocs;
srchr.Search(qry, cllctr); 

for (int i = 0; i < hits.Length; i++)
{
    int docId = hits[i].Doc;
    float score = hits[i].Score;
    Document doc = srchr.Doc(docId);
    Console.WriteLine("Searched from Text: " + doc.Get("text"));
}

いくつかのアプローチを試しましたが、結果が得られませんでした。何か考えはありますか?

以下はインデックスコードです。

IndexWriter indexWriter = 
    new IndexWriter(
        luceneDir, 
        new StandardAnalyzer(Version.LUCENE_29), 
        true, 
        IndexWriter.MaxFieldLength.UNLIMITED);

string[] listOfFiles = Directory.GetFiles(@"C:\Projects\lucene.net-trunk\build\vs2010\demo\MyTestProject\TestDocs");

foreach (string s in listOfFiles)
{
    String content = File.ReadAllText(s);
    Document doc = new Document();
    String title = s;

    // adding title field
    doc.Add(new Field("title", title, Field.Store.YES, Field.Index.NOT_ANALYZED));  
    doc.Add(new Field("content", content, Field.Store.YES, Field.Index.ANALYZED));

    indexWriter.AddDocument(doc);
}

indexWriter.Optimize();
indexWriter.Dispose();
4

3 に答える 3

2

luke を使用してインデックスを検査し、データがあることを確認します。また、検索を実行して検索条件を検証することもできます

http://www.getopt.org/luke/

編集- (Luke は lucene および lucene.net インデックスで動作します。使用するには Java をインストールする必要があります)

編集

ラインを更新する

Lucene.Net.QueryParsers.QueryParser parser = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_29, "text", std);

Lucene.Net.QueryParsers.QueryParser parser = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_29, "content", std);

text存在しないデフォルトの検索フィールドを設定しました

console.writeまた、行で間違ったフィールドを取得しようとしています

于 2013-03-08T11:03:44.780 に答える
0

検索するフィールドを明示的に指定してみてください。例えば:

    Lucene.Net.QueryParsers.QueryParser parser = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_29, "text", std);
    Lucene.Net.Search.Query qry = parser.Parse("content: morning");

Lucene では、クエリを実行するフィールド (タイトル、コンテンツなど) を指定する必要があると思います。

于 2013-03-08T12:12:21.767 に答える
0

インデックス作成と検索の際に同じアナライザーを使用していることを確認してください (あなたの場合はStandardAnalyzerそう思います):

using Lucene.Net.Analysis;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Store;

...

Directory directory = FSDirectory.Open(new System.IO.DirectoryInfo(@"C:\\TestIndex"));

var writer = new IndexWriter(
    directory, 
    new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), 
    true, 
    new MaxFieldLength(int.MaxValue));

アップデート

検索には少し異なるアプローチを使用していますが、とにかく、次の 2 行を入れ替える必要があるかもしれません。

ScoreDoc[] hits = cllctr.TopDocs().ScoreDocs;
srchr.Search(qry, cllctr); 

したがって、次のようになります。

srchr.Search(qry, cllctr); 
ScoreDoc[] hits = cllctr.TopDocs().ScoreDocs;

つまり、検索が実行されたときにコレクターが最初に結果を収集し、次にコレクター インスタンスを介してスコアリングされたドキュメントを取得します。

于 2013-03-08T11:14:55.690 に答える