【问题标题】:Lucene Index Contains Bad DataLucene 索引包含错误数据
【发布时间】:2014-08-19 20:02:01
【问题描述】:

我正在使用 Lucene.NET 构建搜索索引。当我进行搜索时,除了少数条目之外,大多数数据都是正确的。我尝试将问题追查到源头,但我没有任何线索,我想知道我的所有代码是否看起来都正确。

public static readonly string[] FIELDNAMES = { "Name", "ExtID", "Description", "FieldType", "ContentType", "ID" };


    public static List<SearchResults> Search(string[] propertyNames, string propertyValue)
    {
        using (var dir = FSDirectory.Open(new DirectoryInfo(IndexLocation)))
        {
            using (IndexReader ir = IndexReader.Open(dir, true))
            {
                Searcher searcher = new IndexSearcher(ir);

                SearchAnalyzer analyzer = new SearchAnalyzer();
                var queryParser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30, propertyNames, analyzer);


                var query = queryParser.Parse(propertyValue + '*');

                TopDocs resultDocs = searcher.Search(query, ir.MaxDoc);

                var topDocs = resultDocs.ScoreDocs;

                List<SearchResults> AllSearchResults = new List<SearchResults>();

                foreach (var hit in topDocs)
                {
                    var DFS = searcher.Doc(hit.Doc);
                    var Name = DFS.Get(FIELDNAMES[0]);
                    var ExtID = DFS.Get(FIELDNAMES[1]);
                    int Res = Int32.Parse(DFS.Get(FIELDNAMES[3]));
                    int ID = Int32.Parse(DFS.Get(FIELDNAMES[5]));

                    AllSearchResults.Add(new SearchResults(ID, Name, ExtID, (ResultsType)Res));
                }

                return AllSearchResults;
            }
        }
    }

    /// <summary>
    /// Rebuilds Lucene Indexes
    /// </summary>
    /// <exception> Throws Exceptions if directory is in-use or cannot rebuild index </exception>
    /// <param name="Data">Data Base Connections</param>
    public static void RebuildLuceneIndex(DBData Data)
    {
        //var dir = new DirectoryInfo(IndexLocation);
        //dir.Delete();

        System.IO.Directory.Delete(IndexLocation, true);
        System.IO.Directory.CreateDirectory(IndexLocation);

        CreateIndex(Data);

    }


    public static void CreateIndex(DBData Data)
    {
        var Model = Data.MK3Model;

        using (var dir = FSDirectory.Open(new DirectoryInfo(IndexLocation)))
        {
            SearchAnalyzer analyzer = new SearchAnalyzer();
            using (var writer = new IndexWriter(dir, analyzer, true, IndexWriter.MaxFieldLength.LIMITED))
            {
                var SeriesIds = GetSeriesExternalIDs(Model);
                TitlesToDocument(Model, writer, SeriesIds);
                ProducerToDocument(Model, writer);
                CollectionToDocument(Data.FMGModel, writer);
                writer.Optimize();

            }
        }
    }

     private static void TitlesToDocument(MK3Entities Model, IndexWriter writer, List<string> Series)
    {
        try
        {
            foreach (var t in Model.Titles.Where(t => Series.Contains(t.ExtTitleID)).ToList())
            {
                GenerateTitleDocument(writer, t, true);
            }
            foreach (var t in Model.Titles.Where(t => !Series.Contains(t.ExtTitleID)).ToList())
            {
                GenerateTitleDocument(writer, t);
            }
        }
        catch (Exception ex)
        {
            MMSLogger.Instance.WriteToLog("Error Creating Titles Lucene index ex: " + ex.Message);
        }
    }

进入索引的数据正常,正如您在这张 img 中看到的那样(变量在观察窗口中)

当我搜索“Jimm”时,我的搜索结果会返回这个 Id 2026 的名称是“Prentice Hall 理解音乐”而不是 Jimmy Cater Library,也没有具有该特定名称的标题。关于如何解决此问题的任何想法?

【问题讨论】:

    标签: c# search lucene full-text-search


    【解决方案1】:

    我会使用 Luke 检查索引,以验证进入的数据是否是您在索引中找到的数据,就像 Luke 一样,您可以假设查询逻辑至少是正确的。

    【讨论】:

    • 我用卢克重新检查了它。这帮助我找到了错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    相关资源
    最近更新 更多