RavenDb搜索多个字符串属性

时间:2018-04-12 20:55:29

标签: c# lucene ravendb

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

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

2 个答案:

答案 0 :(得分: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文档:

  

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

还要考虑:

  

&#34; RavenDB允许您使用此类查询进行搜索,但您必须这样做   请注意,领先的通配符会大大减慢搜索速度。

     

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

在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();

答案 1 :(得分:0)

自从我问这个问题已经有一段时间了,但是在最近的几天里,我再次讨论了这个问题。我最终以下面显示的方式进行查询,一切正常。

            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);