【问题标题】:RavenDB search for each of multiple terms using StartsWithRavenDB 使用 StartsWith 搜索多个术语中的每一个
【发布时间】:2012-06-26 13:04:49
【问题描述】:

当在编译时不知道多个术语时,是否有推荐的方法来使用 StartsWith 搜索多个术语中的每一个?

我的设想是这样的:

var searchTerms = "John Doe".Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
var query = session.Query<Person, PersonIndex>()
                   .Where(x => x.FirstName.StartsWithAnyOf(searchTerms) ||
                               x.LastName.StartsWithAnyOf(searchTerms));

查询相当于:

var query = session.Query<Person, PersonIndex>()
                   .Where(x => x.FirstName.Starts(searchTerms[0]) ||
                               x.LastName.StartsWith(searchTerms[0]) ||
                               x.FirstName.Starts(searchTerms[1]) ||
                               x.LastName.StartsWith(searchTerms[1]));

答案是在运行时构建 LINQ 查询(PredicateBuilder 或类似)吗?

【问题讨论】:

    标签: c# linq ravendb


    【解决方案1】:

    使用 LuceneQuery(可能需要使用子句,具体取决于您在做什么):

    var searchTerms = "John Doe".Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
    
    var query = session.Advanced.LuceneQuery<Person, PersonIndex>();
    query = query.OpenSubclause(); // optional
    
    foreach (var term in terms)
    {
        query = query.WhereStartsWith("FirstName"), term).OrElse();
        query = query.WhereStartsWith("LastName"), term).OrElse();
    }
    
    query = query.WhereEquals("Id", null);
    query = query.CloseSubclause(); // if OpenSubclause() was used
    

    如果您想要强类型变量名,请查看以下答案:https://stackoverflow.com/a/301957/941536

    【讨论】:

      【解决方案2】:

      你想做什么? 您最好使用已分析的字段,然后发出 .Search 而不是 .Where

      【讨论】:

      • 我不认为.Search会做我想做的事,当搜索字符串是Jo时,我想返回John Doe,做,Jo DoeJo Do。我认为 .Search 不会返回 John Doe 除非我匹配分析的术语之一?
      • 澄清一下,我的意思是当搜索字符串是 any of 时。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-12
      • 2012-12-09
      • 2014-03-13
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多