我正在尝试搜索多个属性。我想获得至少其中一个属性包含指定 term 的所有项目。以下代码按预期工作,但我希望使用搜索而不是Lucene查询来实现此目的。
var t = Regex.Replace(term, " ", @"\ ");
var query = session.Advanced
.DocumentQuery<Order>()
.Where($"Property1:*{t}* OR Property2:*{t}* OR Property3:*{t}*");
答案 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);