2
我是Lucene的新手,並試圖對此進行分類。我索引是這樣的:Lucene.net返回查詢匹配的正確數量,但不是正確的文檔
Directory dir = FSDirectory.Open(new System.IO.DirectoryInfo(dirIndexDir));
//Create the indexWriter
IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), true,
IndexWriter.MaxFieldLength.UNLIMITED);
Document doc = new Document();
doc.Add(new Field("keyform_type", entry.keyForm.type, Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("keyform_lang", entry.keyForm.lang, Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("keyform_dial", entry.keyForm.dial, Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("keyform_reg", entry.keyForm.reg, Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("keyform_term", entry.keyForm.term.Value, Field.Store.YES, Field.Index.ANALYZED));
if(entry.refForm.type!=null)
doc.Add(new Field("refform_type", entry.refForm.type, Field.Store.YES, Field.Index.NOT_ANALYZED));
if(entry.refForm.lang!=null)
doc.Add(new Field("refform_lang", entry.refForm.lang, Field.Store.YES, Field.Index.NOT_ANALYZED));
if (entry.refForm.dial != null)
doc.Add(new Field("refform_dial", entry.refForm.dial, Field.Store.YES, Field.Index.NOT_ANALYZED));
if(entry.refForm.reg!=null)
doc.Add(new Field("refform_reg", entry.refForm.reg, Field.Store.YES, Field.Index.NOT_ANALYZED));
if(entry.refForm.term.Value!=null)
doc.Add(new Field("refform_term", entry.refForm.term.Value, Field.Store.YES, Field.Index.ANALYZED));
doc.Add(new Field("pos", entry.pos, Field.Store.YES, Field.Index.NOT_ANALYZED));
for (int s = 0; s < entry.subject.Count; s++)
{
doc.Add(new Field("subject_"+s, entry.subject[s], Field.Store.YES, Field.Index.NOT_ANALYZED));
}
for (int g = 0; g < entry.sense.gloss.Count; g++)
{
doc.Add(new Field("gloss_"+g, entry.sense.gloss[g], Field.Store.YES, Field.Index.ANALYZED));
}
if (entry.signature.action != null)
doc.Add(new Field("action", entry.signature.action, Field.Store.YES, Field.Index.NOT_ANALYZED));
if (entry.signature.source != null)
doc.Add(new Field("source", entry.signature.source, Field.Store.YES, Field.Index.NOT_ANALYZED));
if(entry.signature.date==0)
doc.Add(new Field("date", entry.signature.date.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
//Add the doc
writer.AddDocument(doc);
writer.Close();
我那麼查詢使用此代碼:
//Doesn't matter what term is, same result
string term="workers";
Directory dir = FSDirectory.Open(new System.IO.DirectoryInfo(luceneDir));
IndexSearcher searcher = new IndexSearcher(dir, true);
List<string> b=new List<string>();
b.Add("keyform_gloss");
b.Add("keyform_term");
b.Add("refform_term");
b.Add("refform_gloss");
for (int i = 0; i < nMaxDupes; i++)
b.Add("gloss_" + i.ToString());
MultiFieldQueryParser mfqp = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_29,
b.ToArray(), new StandardAnalyzer());
Query q = mfqp.Parse(term);
TopDocs td = searcher.Search(q, 300);
for (int i = 0; i < td.totalHits; i++)
{
//Generate a dictionaryEntry for each hit
Document doc = searcher.Doc(i);
//Access the document fields, blah
}
不管是什麼項的值,返回的Lucene索引中,其中X第X文檔=實際符合條款的文件數量。當我使用LUKE瀏覽索引時,相同的手動查詢(keyform_term:term gloss_0:term等)會返回正確數量的結果以及與這些結果匹配的正確文檔。
但是,上面的C#代碼總是返回第一個X文檔,它們不一定包含任何搜索字段中的搜索詞。他們甚至沒有接近。
我在做什麼錯?我知道索引是好的,因爲我可以在LUKE中搜索它,所以它必須是在查詢中的東西...
謝謝!
恰好就是這樣,謝謝!如果可以的話,我會投票回答。 – 2010-08-17 20:43:56
只需單擊複選標記以將其標記爲正確的答案。 ;) – bajafresh4life 2010-08-18 02:27:52
哦......謝謝! :) – 2010-08-18 17:52:08