3

我想为我的项目实施高级搜索。搜索现在使用用户输入的所有字符串,并与标准 API 进行了很大的分离。

这很好用,但现在我想实现更多功能:AND、OR 和括号()

我很难解析字符串 - 并从字符串构建标准。我找到了这个 Stackoverflow question,但它并没有真正帮助(他没有说清楚他想要什么)。

我找到了另一篇文章,但这支持更多并吐出 sql 语句。我经常听到的另一件事是 Lucene——但我不确定这是否真的对我有帮助。


我一直在搜索,发现了 Lucene.Net WhitespaceAnalyzer 和 QueryParser。

它将搜索 A AND B OR C 更改为 +A +BC 之类的内容,这是朝着正确方向迈出的重要一步(而且它处理括号)。下一步是将转换后的字符串转换为一组连词和析取词。

我发现的Java 示例使用的是我在 NHibernate 中找不到的查询生成器。

还有什么想法吗?

4

2 回答 2

3

猜猜你到现在还没有听说过Nhibernate Search

Nhibernate Search 在下面使用 lucene,并为您提供了使用 AND、OR、语法的所有选项。
您所要做的就是将您的实体属性用于索引,Nhibernate 将在预定义的位置对其进行索引。
下次您可以使用 lucene 公开的功能搜索此索引,然后获取您的域级实体对象作为回报。

using (IFullTextSession s = Search.CreateFullTextSession(sf.OpenSession(new SearchInterceptor()))) {

        QueryParser qp = new QueryParser("id", new StopAnalyzer());

        IQuery NHQuery = s.CreateFullTextQuery(qp.Parse("Summary:series"), typeof(Book));

        IList result = NHQuery.List();

很强大,不是吗?

于 2009-09-11T06:35:17.320 回答
1

我现在基本上在做的是使用 Lucene.Net 解析 API 解析输入字符串。这给了我一个统一和简化的语法。(伪代码)

using Lucene.Net.Analysis;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.QueryParsers;
using Lucene.Net.Search;

void Function Search (string queryString)
{
    Analyzer analyzer = new WhitespaceAnalyzer();
    QueryParser luceneParser = new QueryParser("name", analyzer);
    Query luceneQuery = luceneParser.Parse(queryString);
    string[] words = luceneQuery.ToString().Split(' ');

    foreach (string word in words)
    {
        //Parsing the lucene.net string
    }
}

之后我手动解析这个字符串,创建析取和连词。

于 2009-09-11T09:55:13.813 回答