需要帮助进行代码分析Lucene.Net搜索结果asp.net

时间:2012-07-12 19:16:54

标签: c# lucene.net

我一直在寻找使用lucene.net搜索索引的好代码。我有一个看起来很有希望,但我有一些困惑。如果可能的话,任何熟悉lucene.net的人都请查看代码并告诉我为什么这个人以这种方式构建代码。

从哪里得到代码... url如下 http://www.codeproject.com/Articles/320219/Lucene-Net-ultra-fast-search-for-MVC-or-WebForms

这是代码

private static IEnumerable<SampleData> _search
(string searchQuery, string searchField = "") {
// validation
if (string.IsNullOrEmpty(searchQuery.Replace("*", "").Replace("?", ""))) return new List<SampleData>();

// set up lucene searcher
using (var searcher = new IndexSearcher(_directory, false)) {
    var hits_limit = 1000;
    var analyzer = new StandardAnalyzer(Version.LUCENE_29);

    // search by single field
    if (!string.IsNullOrEmpty(searchField)) {
        var parser = new QueryParser(Version.LUCENE_29, searchField, analyzer);
        var query = parseQuery(searchQuery, parser);
        var hits = searcher.Search(query, hits_limit).ScoreDocs;
        var results = _mapLuceneSearchResultsToDataList(hits, searcher);
        analyzer.Close();
        searcher.Close();
        searcher.Dispose();
        return results;
    }
    // search by multiple fields (ordered by RELEVANCE)
    else {
        var parser = new MultiFieldQueryParser
            (Version.LUCENE_29, new[] { "Id", "Name", "Description" }, analyzer);
        var query = parseQuery(searchQuery, parser);
        var hits = searcher.Search
        (query, null, hits_limit, Sort.RELEVANCE).ScoreDocs;
        var results = _mapLuceneSearchResultsToDataList(hits, searcher);
        analyzer.Close();
        searcher.Close(); 
        searcher.Dispose();
        return results;
    }
}
} 

我对上述例程有几个问题

1) why the developer of this code replace all * & ? to empty string in search term
2) why search once with QueryParser and again by MultiFieldQueryParser
3) how developer detect that search term has one word or many words separated by space.
4) how wild card search can be done using this code....where to change in code for handling wild card.

5) how to handle search for similar word like if anyone search with helo then hello related result should come.

var hits = searcher.Search(query, 1000).ScoreDocs;

6) when my search result will return 5000 record and then if i limit like 1000 then how could i      show next 4000 in pagination fashion.what is the object for giving the limit...i think for    fastness but if i specify limit the how can i show other results....what would be the logic
如果有人讨论我的所有观点,我将很高兴。谢谢

1 个答案:

答案 0 :(得分:3)

  

1)为什么这段代码的开发者会替换所有*&amp; ?清空字符串   搜索词

因为这些是通配符搜索的特殊字符。作者做了什么 - 他检查搜索查询是否还有通配符。例如,您通常不想搜索&#34; *&#34;。

  

2)为什么用QueryParser再次搜索一次   MultiFieldQueryParser

他本身并没有使用QueryParsers进行搜索,但是他正在解析一个搜索查询(字符串)并从中创建一堆对象。然后,这些对象由Searcher对象使用,该对象执行实际搜索。

  

3)开发人员如何检测搜索词有一个   由空格分隔的单词或许多单词。

这是Parser对象应该关心的事情,而不是开发人员。

  

4)如何进行外卡搜索   使用此代码完成....在哪里更改代码以处理wild   卡。

通配符在searchQuery参数中指定。指定&#34;测试*&#34;例如,将被视为通配符。详细信息为here

  

5)如果有人搜索,如何处理搜索类似的单词   那么你好,相关的结果应该来了。

我想你想要fuzzy搜索。

  

6)当我的搜索结果将返回5000记录然后如果我限制   像1000那样我怎么能在分页中显示下一个4000   时尚。给予极限的对象是什么...我认为是   坚定但如果我指定限制我怎么能显示其他   结果......什么是逻辑

这里有一个article

UPD:关于多个字段。逻辑如下:

  • 如果指定searchField,则使用简单的解析器,这将产生searchField: value1 seachField: value2... etc之类的查询。
  • 但是,如果该参数不存在,那么它会假设,通过searchQuery将指定字段和值"field1: value1 field2: value2"。示例与我之前提到的语法page的语法相同。

UPD2:不要犹豫为Lucene寻找Java文档和示例,因为这最初是一个Java项目(因此,有很多Java示例和教程)。 Lucene.NET是一个移植项目,两个项目共享许多功能和类。

UPD3:关于模糊搜索,您可能还想实现自己的analyzer for synonyms搜索(我们在其中一个商业项目中使用该技术,我处理过,以处理常见的拼写错误以及同义词)。