我正在将我们的搜索引擎升级到 Lucene.Net 3.0.3.0。此外,我正在彻底修改我们网站的搜索引擎,因为评分存在一些问题。所以我(再次)从头开始构建它。让我感到奇怪的第一件事是得分值是不可理解的。在以前的 Lucene 版本中,我使用它返回 0 到 1 之间的分数,这些分数很容易转换为百分比。升级后,我得到了无法转换为百分比的得分值。
第一个版本仅包含仅包含名称字段和 ID 字段的文档,我将使用以下代码添加:
文档文档 = 新文档();doc.Add(new Field("ID", studie.ID.ToString(), Field.Store.YES, Field.Index.NO)); doc.Add(new Field("indexNaam", studie.Naam.Replace("-", "").ToLower(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO));
对于搜索,我使用以下代码: string strIndexDir = @"C:\deploys\deploy3\live\index_studies2"; Analyzer std = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30); //TermQuery qry = new TermQuery(new Lucene.Net.Index.Term("indexNaam", trefwood)); Lucene.Net.QueryParsers.QueryParser 解析器 = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_30, "indexNaam", std); Lucene.Net.Search.Query qry = parser.Parse(trefwood); BooleanQuery bln = new BooleanQuery();
Lucene.Net.Store.Directory directory = Lucene.Net.Store.FSDirectory.Open(new System.IO.DirectoryInfo(strIndexDir)); //Provide the directory where index is stored
Lucene.Net.Search.Searcher srchr = new Lucene.Net.Search.IndexSearcher(Lucene.Net.Index.IndexReader.Open(directory, true));
TopScoreDocCollector cllctr = TopScoreDocCollector.Create(100, true);
bln.Add(qry,Occur.MUST);
srchr.Search(bln, cllctr);
ScoreDoc[] hits = cllctr.TopDocs().ScoreDocs;
for (int i = 0; i < hits.Length; i++)
{
int docId = hits[i].Doc;
float score = hits[i].Score;
Lucene.Net.Documents.Document doc = srchr.Doc(docId);
Studie studie =
new Studie
{
ID = doc.Get("ID"),
Naam = doc.Get("Naam"),
ActualScore = score.ToString(),
Score = System.Math.Round(score).ToString()
};
studies.Add(studie);
}
我还收集了评分说明,并注意到逆文档频率 (idf) 现在决定了 Score 属性的值。有没有一种很好的方法来检索百分比得分值,为什么会改变?
提前致谢。