1

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

从我得到代码的地方......网址如下 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

如果有人讨论我的所有观点,我会很高兴。谢谢

4

1 回答 1

3

1)为什么此代码的开发人员替换所有 * & ?在搜索词中清空字符串

因为这些是通配符搜索的特殊字符。作者所做的 - 他检查搜索查询是否有其他内容以及通配符。例如,您通常不想搜索“*”。

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

他本身不使用 QueryParsers 进行搜索,但他正在解析搜索查询(字符串)并从中生成一堆对象。然后这些对象被Searcher执行实际搜索的对象消耗。

3) 开发者如何检测搜索词有一个或多个以空格分隔的词。

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

4)如何使用此代码完成通配符搜索......在哪里更改处理通配符的代码。

通配符在searchQuery参数中指定。例如,指定“test*”将被视为通配符。详情在这里

5)如何处理类似词的搜索,比如如果有人用 helo 搜索,那么应该会出现 hello 相关的结果。

我想你想要一个模糊搜索。

6)当我的搜索结果将返回 5000 条记录,然后如果我限制为 1000,那么我如何以分页方式显示下一个 4000。给出限制的对象是什么...我认为是为了
快速但如果我指定限制如何我可以显示其他结果吗....逻辑是什么

这是一篇关于此的文章。

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

  • 如果searchField指定,则使用简单的解析器,这将产生类似searchField: value1 seachField: value2... etc.
  • 但是,如果该参数不存在,则它假定传递的searchQuery将指定字段和值,例如"field1: value1 field2: value2". 正如我之前提到的,示例位于相同的语法页面上。

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

UPD3:关于模糊搜索,您可能还想实现自己的同义词搜索分析器(我们在我从事的一个商业项目中使用了该技术,以处理常见的拼写错误和同义词)。

于 2012-07-12T19:52:05.990 回答