没有得到命中字段的值?

时间:2011-05-25 11:21:45

标签: c# lucene.net

我正在使用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 个答案:

答案 0 :(得分: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];