解析搜索字符串(转换为NHibernate标准)

解析搜索字符串(转换为NHibernate标准),nhibernate,search,criteria,Nhibernate,Search,Criteria,我想为我的项目实现一个高级搜索。 现在的搜索使用了用户输入的所有字符串,并与CriteriaAPI进行了一次大的分离 这很好,但现在我想实现更多功能:和、或和括号() 我很难解析字符串,也很难从字符串中构建标准。我找到了,但没有真正起作用(他没有明确说明他想要什么) 我找到了另一个,但它支持更多,并输出sql语句。 另一件我经常听到的事情是Lucene,但我不确定这是否真的对我有帮助 我搜索了一下,找到了Lucene.Net WhitespaceAnalyzer和QueryParser 它将搜

我想为我的项目实现一个高级搜索。 现在的搜索使用了用户输入的所有字符串,并与CriteriaAPI进行了一次大的分离

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

我很难解析字符串,也很难从字符串中构建标准。我找到了,但没有真正起作用(他没有明确说明他想要什么)

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


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

它将搜索A和B或C更改为类似+A+bc的内容,这是朝着正确方向迈出的一大步(加上它处理括号)。 下一步是将转换后的字符串转换成一组连接和分离

这是我在NHibernate中找不到的查询生成器


还有什么想法吗?

我想你现在还没听说过

Nhibernate搜索在下面使用lucene,并为您提供使用and或语法的所有选项。
您所要做的就是将实体的属性设置为索引,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();

强大,不是吗?

我现在主要做的是用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
    }
}