【问题标题】:RavenDb search over multiple string propertiesRavenDb 搜索多个字符串属性
【发布时间】:2018-04-12 20:55:28
【问题描述】:

我正在尝试搜索多个属性。我想获取至少其中一个属性包含指定term的所有项目。以下代码按预期工作,但我想使用 Search 而不是 Lucene 查询来实现这一点。

var t = Regex.Replace(term, " ", @"\ ");
var query = session.Advanced
  .DocumentQuery<Order>()
  .Where($"Property1:*{t}* OR Property2:*{t}* OR Property3:*{t}*");

【问题讨论】:

    标签: c# lucene ravendb


    【解决方案1】:
    var result = session
        .Query<Order>()
        .Search(x => x.Property1, "*term*")
        .Search(x => x.Property2, "*term*")
        .Search(x => x.Property3, "*term*")
        .ToList();
    

    阅读文档(选择您的 ravendb 版本):https://ravendb.net/docs/article-page/4.0/csharp/indexes/querying/searching

    来自 RavenDB 文档:

    "默认情况下,RavenDB 会尝试猜测和匹配语义 条款之间。如果有连续搜索,它们将是 OR 一起使用,否则将使用 AND 语义。”

    还要考虑:

    "RavenDB 允许您使用此类查询进行搜索,但您必须 请注意,前导通配符会大大减慢搜索速度。

    考虑是否真的需要查找子字符串。在大多数情况下,寻找 整个单词就足够了。还有其他替代方案 搜索没有昂贵的通配符匹配,例如索引一个反向 文本字段的版本或创建自定义分析器。”

    在以前的 RavenDB 版本中,查询中必须允许使用通配符:

    var result = session
            .Query<Order>()
            .Search(x => x.Property1, "*term*", escapeQueryOptions: EscapeQueryOptions.AllowAllWildcards)
            .Search(x => x.Property2, "*term*", escapeQueryOptions: EscapeQueryOptions.AllowAllWildcards)
            .Search(x => x.Property3, "*term*", escapeQueryOptions: EscapeQueryOptions.AllowAllWildcards)
            .ToList();
    

    @yoliva 评论后更新:

    为了实现你想要的,我找到了一个解决方法,它包括在索引定义中用不同的字符替换所有空格,并且当你查询时也这样做。

    索引:

    public class OrdersIndex : Raven.Client.Documents.Indexes.AbstractIndexCreationTask<Order>
    {
         public OrdersIndex()
         {
               Map = orders => from order in orders
                               select new
                               {
                                   Property1 = order.Property1.Replace(" ", "-"),
                                   Property2 = order.Property2.Replace(" ", "-"),
                                   Property3 = order.Property3.Replace(" ", "-"),
                               };
         }
    }
    

    查询:

    var result = session.Query<Order, OrdersIndex>()
                        .Search(x => x.Property1, "*me product n*".Replace(" ", "-"))
                        .Search(x => x.Property2, "*me prod*".Replace(" ", "-"))
                        .Search(x => x.Property3, "*product*".Replace(" ", "-"))
                        .ToList();
    

    【讨论】:

    • 谢谢@embri。我正在使用 Raven 3.5。我有一个类似于您发布的代码并且工作正常,而搜索模式不包含空格。我也尝试使用完全匹配,但这也不起作用。我正在寻找像包含这样的行为。例如,我想按订单的ProductName 属性进行搜索。如果我有一个名为Some Product Name 的产品,我想通过me Pro 搜索得到搜索结果。通过我在上面发布的 lucene 查询,我可以获得预期的行为
    • @yoliva 更新了答案,也许有更好的解决方案..但它有效
    【解决方案2】:

    我已经有一段时间没有提出这个问题了,但在过去的几天里,我又重新审视了这个问题。我最终按照下面显示的方式进行了查询,一切正常。

                var search = $"\"*{term}*\"";
                var qOpt = EscapeQueryOptions.RawQuery;
    
                query = query
                    .Search(o => o.Property1, search, escapeQueryOptions: qOpt)
                    .Search(o => o.Property2, search, escapeQueryOptions: qOpt)
                    .Search(o => o.Property3, search, escapeQueryOptions: qOpt)
                    .Search(o => o.Property4, search, escapeQueryOptions: qOpt);
    

    【讨论】:

      猜你喜欢
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多