自定义Lucene.net搜索结果

时间:2012-07-16 09:06:26

标签: c# lucene.net

我第一次使用lucene.net。它工作正常。我用jcb geo关键字搜索数据,结果即将到来。我的第一个结果是与JCB关键字相关,接下来的几个数据与GEO关键字一起出现。我只是不明白为什么JCB会名列前茅。另一方面,最大结果与GEO有关。我认为GEO相关数据应该排在最前面,然后JCB应该来。

这里我给的是我用来搜索的代码。

        string multiWordPhrase = "";
        multiWordPhrase = txtSearch.Text.Trim().Replace("*", "").Replace("?", "").Replace("~", "");
        IndexSearcher searcher = null;
        List<SearchResult> list = new List<SearchResult>();
        SearchResult oSr = null;

        if (!string.IsNullOrEmpty(multiWordPhrase))
        {
            string[] fieldList = { "Title", "Description", "Url" };
            List<BooleanClause.Occur> occurs = new List<BooleanClause.Occur>();
            foreach (string field in fieldList)
            {
                occurs.Add(BooleanClause.Occur.SHOULD);
            }

            searcher = new IndexSearcher(_directory, false);
            Query qry = MultiFieldQueryParser.Parse(Version.LUCENE_29, multiWordPhrase, fieldList, occurs.ToArray(), new StandardAnalyzer(Version.LUCENE_29));
            TopDocs topDocs = searcher.Search(qry, null, ((PageIndex + 1) * PageSize), Sort.RELEVANCE);
            ScoreDoc[] scoreDocs = topDocs.ScoreDocs;
            int resultsCount = topDocs.TotalHits;

            if (topDocs != null)
            {
                for (int i = (PageIndex * PageSize); i <= ((PageIndex + 1) * PageSize) && i < topDocs.ScoreDocs.Length; i++)
                {
                    Document doc = searcher.Doc(topDocs.ScoreDocs[i].doc);
                    oSr = new SearchResult();
                    oSr.ID = doc.Get("ID");
                    oSr.Title = doc.Get("Title");
                    oSr.Description = doc.Get("Description");
                    //oSr.WordCount = AllExtension.WordCount(oSr.Description, WordExist(oSr.Title, multiWordPhrase));
                    string preview =
                    oSr.Description = AllExtension.HighlightKeywords(oSr.Description, multiWordPhrase);  //sr.Description;
                    oSr.Url = doc.Get("Url");
                    list.Add(oSr);
                }
            }
            lblMatchFound.Text = "Match Found " + resultsCount.ToString();

            Pagination pagination = new Pagination();
            pagination.BaseUrl = "/Search.aspx";
            pagination.TotalRows = resultsCount;
            pagination.CurPage = (PageIndex+1);
            pagination.PerPage = PageSize;
            pagination.PrevLink = "Prev";
            pagination.NextLink = "Next";
            pagination.SearchTerm = multiWordPhrase;
            lblPager.Text = pagination.GetPageLinks(); ;

            rptResult.DataSource = list;
            rptResult.DataBind();
            searcher.Close();

enter image description here

如果有可能那么请讨论为什么JCB相关数据会出现在最顶层,并告诉我如何自定义搜索结果,因此这些记录应该位于顶部,哪个最大搜索词是.....像GEO。所以请建议如何自定义我的搜索结果,如果可能的话请提供一些示例代码,因为我是lucene.net的新手,因此我可以更好地想象。非常感谢

1 个答案:

答案 0 :(得分:1)

你需要了解L.B.的评分公式。链接以更好地理解分数,如果要修改它,则需要实现自己的相似性。

在你的情况下,可能发生的是JCB术语比GEO术语更不受欢迎。也可能是包含JCB术语的文件较短。

另外,您还可以使用IndexSearcher的Explain方法查看文档的评分方式: http://lucene.apache.org/core/old_versioned_docs/versions/2_9_4/api/all/org/apache/lucene/search/IndexSearcher.html#explain(org.apache.lucene.search.Weight, int)

您也可以使用Luke:http://code.google.com/p/luke/downloads/list

使用Luke,您可以进行搜索,选择结果并单击“解释”按钮以显示命中的解释。