解析搜索字符串(进入NHibernate Criterias)

时间:2009-09-11 06:06:29

标签: nhibernate search criteria

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

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

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

我找到了另一个article,但这支持更多并且吐出sql语句。 我听到的另一件事是Lucene - 但我不确定这是否真的能帮助我。


我一直在搜索一下,我找到了Lucene.Net WhitespaceAnalyzer和QueryParser。

它将搜索A和B或C更改为+ A + B C,这是正确方向的一个很好的步骤(加上它处理括号)。 下一步是将转换后的字符串转换为一组连词和析取。

Java example I found正在使用我在NHibernate中找不到的查询构建器。

还有什么想法?

2 个答案:

答案 0 :(得分: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();

功能强大,不是吗?

答案 1 :(得分: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
    }
}

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