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