0

初めて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();

ここに画像の説明を入力してください

可能であれば、JCB関連のデータが上位に表示される理由について話し合い、検索結果をカスタマイズして、検索結果の単語が最大になるレコードが上位に表示されるようにする方法を教えてください。GEOのように。したがって、検索結果をカスタマイズする方法を提案してください。可能であれば、サンプルコードをいくつか用意してください。これは、lucene.netを初めて使用した結果、より適切に視覚化できるためです。どうもありがとう

4

1 に答える 1

1

スコアをよりよく理解するために、LBがリンクしたスコア式を理解する必要があります。また、それを変更する場合は、独自の類似性を実装する必要があります。

あなたの場合、おそらく起こることは、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を使用して、検索を実行し、結果を選択して、[説明]ボタンをクリックして、ヒットの説明を表示します。

于 2012-07-16T14:51:37.607 に答える