2011-05-25 41 views
0

我正在使用Lucene.Net进行搜索项目。我们创建了一个索引,其中包含10个5个字段的文档。但在搜索时,我无法追踪我的正确记录。有谁能够帮助我?为什么?没有得到命中字段的值?

我的代码看起来像这样

List<int> ids = new List<int>(); 
List<Hits> hitList = new List<Hits>(); 
List<Document> results = new List<Document>(); 
int startPage = (pageIndex.Value - 1) * pageSize.Value; 
string indexFileLocation = @"c:\\ResourceIndex\\"; //Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ResourceIndex"); 
var fsDirectory = FSDirectory.Open(new DirectoryInfo(indexFileLocation)); 
Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29); 
IndexReader indexReader = IndexReader.Open(fsDirectory, true); 
Searcher indexSearch = new IndexSearcher(indexReader); 

//ids.AddRange(this.SearchPredicates(indexSearch, startPage, pageSize, query)); 

/*Searching From the ResourceIndex*/ 
Query resourceQuery = MultiFieldQueryParser.Parse(Lucene.Net.Util.Version.LUCENE_29, 
    new string[] { productId.ToString(), languagelds, query }, 
    new string[] { "productId", "resourceLanguageIds", "externalIdentifier" }, 
    analyzer); 
TermQuery descriptionQuery = new TermQuery(new Term("description", '"'+query+'"')); 
//TermQuery identifierQuery = new TermQuery(new Term("externalIdentifier", query)); 
BooleanQuery filterQuery = new BooleanQuery(); 
filterQuery.Add(descriptionQuery, BooleanClause.Occur.MUST); 
//filterQuery.Add(identifierQuery,BooleanClause.Occur.MUST_NOT); 

Filter filter = new CachingWrapperFilter(new QueryWrapperFilter(filterQuery)); 
TopScoreDocCollector collector = TopScoreDocCollector.create(100, true); 

//Hits resourceHit = indexSearch.Search(resourceQuery, filter); 
indexSearch.Search(resourceQuery, filter, collector); 
ScoreDoc[] hits = collector.TopDocs().scoreDocs; 
//for (int i = startPage; i <= pageSize && i < resourceHit.Length(); i++) 
//{ 
// ids.Add(Convert.ToInt32(resourceHit.Doc(i).GetField("id"))); 
//} 
for (int i = 0; i < hits.Length; i++) 
{ 
    int docId = hits[i].doc; 
    float score = hits[i].score; 

    Lucene.Net.Documents.Document doc = indexSearch.Doc(docId); 

    string result = "Score: " + score.ToString() + 
        " Field: " + doc.Get("id"); 
} 

回答

1

你打电话Document.Get( “ID”),它返回一个存储字段的值。索引时它不会没有Field.Store.YES工作。

如果您已经将字段编入索引而无需分析(Field.Index.NOT_ANALYZED)或使用KeywordAnalyzer,则可以使用FieldCache。 (意思是每个字段和文档有一个术语。)

您需要使用FieldCache最内层的阅读器进行最佳工作。这里有一个代码粘贴FieldCache with frequently updated index,它以正确的方式使用FieldCache,从ID字段中读取一个整数值。

// Demo values, use existing code somewhere here. 
var directory = FSDirectory.Open(new DirectoryInfo("index")); 
var reader = IndexReader.Open(directory, readOnly: true); 
var documentId = 1337; 

// Grab all subreaders. 
var subReaders = new List<IndexReader>(); 
ReaderUtil.GatherSubReaders(subReaders, reader); 

// Loop through all subreaders. While subReaderId is higher than the 
// maximum document id in the subreader, go to next. 
var subReaderId = documentId; 
var subReader = subReaders.First(sub => { 
    if (sub.MaxDoc() < subReaderId) { 
     subReaderId -= sub.MaxDoc(); 
     return false; 
    } 

    return true; 
}); 

var values = FieldCache_Fields.DEFAULT.GetInts(subReader, "id"); 
var value = values[subReaderId];