【问题标题】:Parse a search string (into NHibernate Criterias )解析搜索字符串(进入 NHibernate Criterias )
【发布时间】:2009-09-11 06:06:28
【问题描述】:

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

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

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

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


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

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

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

还有什么想法吗?

【问题讨论】:

    标签: nhibernate search criteria


    【解决方案1】:

    猜你到现在还没有听说过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();
    

    很强大,不是吗?

    【讨论】:

    • 我不完全确定我是否要这样做,因为我们的用户有相当复杂的请求(定义搜索集并保存它们) - 但非常感谢。看起来很棒。
    【解决方案2】:

    我现在基本上在做的是使用 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
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多