c# - Lucene .NET 搜索结果

标签 c# c#-4.0 lucene lucene.net

我正在使用这段代码来编制索引:

public void IndexEmployees(IEnumerable<Employee> employees)
{
    var indexPath = GetIndexPath();
    var directory = FSDirectory.Open(indexPath);

    var indexWriter = new IndexWriter(directory, new StandardAnalyzer(Version.LUCENE_29), true, IndexWriter.MaxFieldLength.UNLIMITED);

    foreach (var employee in employees)
    {
        var document = new Document();
        document.Add(new Field("EmployeeId", employee.EmployeeId.ToString(), Field.Store.YES, Field.Index.NO, Field.TermVector.NO));
        document.Add(new Field("Name", employee.FirstName + " " + employee.LastName, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO));
        document.Add(new Field("OfficeName", employee.OfficeName, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO));
        document.Add(new Field("CompetenceRatings", string.Join(" ", employee.CompetenceRatings.Select(cr => cr.Name)), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO));

        indexWriter.AddDocument(document);
    }

    indexWriter.Optimize();
    indexWriter.Close();

    var indexReader = IndexReader.Open(directory, true);
    var spell = new SpellChecker.Net.Search.Spell.SpellChecker(directory);
    spell.ClearIndex();

    spell.IndexDictionary(new LuceneDictionary(indexReader, "Name"));
    spell.IndexDictionary(new LuceneDictionary(indexReader, "OfficeName"));
    spell.IndexDictionary(new LuceneDictionary(indexReader, "CompetenceRatings"));
}

public DirectoryInfo GetIndexPath()
{
    return new DirectoryInfo(HttpContext.Current.Server.MapPath("/App_Data/EmployeeIndex/"));
}

此代码用于查找结果(以及建议):

public SearchResult Search(DirectoryInfo indexPath, string[] searchFields, string searchQuery)
{
    var directory = FSDirectory.Open(indexPath);

    var standardAnalyzer = new StandardAnalyzer(Version.LUCENE_29);

    var indexReader = IndexReader.Open(directory, true);
    var indexSearcher = new IndexSearcher(indexReader);

    var parser = new MultiFieldQueryParser(Version.LUCENE_29, searchFields, standardAnalyzer);
    //parser.SetDefaultOperator(QueryParser.Operator.OR);
    var query = parser.Parse(searchQuery);

    var hits = indexSearcher.Search(query, null, 5000);

    return new SearchResult
                {
                    Suggestions = FindSuggestions(indexPath, searchQuery),
                    LuceneDocuments = hits
                        .scoreDocs
                        .Select(scoreDoc => indexSearcher.Doc(scoreDoc.doc))
                        .ToArray()
                };
}

public string[] FindSuggestions(DirectoryInfo indexPath, string searchQuery)
{
    var directory = FSDirectory.Open(indexPath);

    var spell = new SpellChecker.Net.Search.Spell.SpellChecker(directory);

    var similarWords = spell.SuggestSimilar(searchQuery, 20);

    return similarWords;
}

var searchResult = Search(GetIndexPath(), new[] { "Name", "OfficeName", "CompetenceRatings" }, "admin*");

像这样的简单查询:admin 或 admin* 不会给我任何结果。我知道有一个员工叫这个名字。如果我搜索 James,我希望能够找到 James Jameson。

谢谢!

最佳答案

首先。您必须提交对索引的更改。

indexWriter.Optimize();
indexWriter.Commit(); //Add This
indexWriter.Close();

编辑#2 另外,在你得到有用的东西之前,保持简单。

把这东西注释掉。

//var indexReader = IndexReader.Open(directory, true);
//var spell = new SpellChecker.Net.Search.Spell.SpellChecker(directory);
//spell.ClearIndex();

//spell.IndexDictionary(new LuceneDictionary(indexReader, "Name"));
//spell.IndexDictionary(new LuceneDictionary(indexReader, "OfficeName"));
//spell.IndexDictionary(new LuceneDictionary(indexReader, "CompetenceRatings"));

编辑#3

您正在搜索的字段可能不会经常更改。我会将它们包括在您的搜索功能中。

string[] fields = new string[] { "Name", "OfficeName", "CompetenceRatings" };

我建议这样做的最大原因是字段区分大小写,有时您不会得到任何结果,这是因为您搜索的是“名称”字段(不存在)而不是“名称”字段。这样更容易发现错误。

关于c# - Lucene .NET 搜索结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9004849/

相关文章:

c#-4.0 - 从图像和 mp3 文件创建 C# MP4 视频

c# - 如何让 Lucene (.NET) 使用通配符正确突出显示?

java - 如何设置 EmbeddedSolrServer 实例?

c# - 如何从url获取参数

c# - 为什么我无法在 Razor 页面上获得正确的文本框值?

c# - 如何测试 SSL/TLS 底层是否正常工作

search - 使用 Lucene SpanQueries 进行句子感知搜索

c# - 获取asp.net mvc网站中的本地文件路径

c# - List<> 的对象集合不起作用

c# - WF4 : Workflow stay locked