RavenDb - 根据子集中的某些内容进行查询

时间:2013-07-09 16:22:57

标签: ravendb

考虑以下包含品牌的伪数据模型“Shop”:

Shop:
{
   Id ... etc ...
   Name: "General sports store",
   Brands: {"Adidas", "Nike", "Puma"}
}

鉴于某些品牌名单,我想找到销售类似产品的商店。

例如,鉴于以下商店:

  • Niketown:Nike
  • 其他一些商店:Nike,Adidas
  • 错误的商店:Hugo Boss

当我搜索“Nike,Adidas”时,我想找到“Niketown”和“其他商店”,因为他们有我们的品牌。

“其他商店”应该是第一个结果,因为它销售我们要求的大部分品牌。 (我可以使用助推吗?)

但是,不应该找到“错误的商店”,因为它没有我们要求的任何品牌......

我应该如何使用RavenDb来解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果您的输入是"Nike, Adidas"的单个字符串,那么您首先需要删除逗号,因为它不是数据库中令牌“Nike”的一部分。

但是你可以简单地搜索一下。您描述的行为是默认行为。不需要提升,因为多个匹配已经有更高的分数并被提升到最高位置。

var searchTerms = "Nike, Adidas";
searchTerms = searchTerms.Replace(",", "");
var results = session.Query<Shop>().Search(x => x.Brands, searchTerms);

然而,我注意到你有一些多个单词的术语(“Hugo Boss”)。这将摒弃搜索,因为它期待单字标记。换句话说,这不会返回任何结果:

var searchTerms = "Hugo Boss";
var results = session.Query<Shop>().Search(x => x.Brands, searchTerms);

您可以选择如何处理此问题。如果要继续使用Search方法,则需要确保输入字符串在多字词周围有引号。你还需要告诉乌鸦不要逃避这些字符串。所以这会奏效:

var searchTerms = "\"Hugo Boss\"";
var results = session.Query<Shop>().Search(x => x.Brands, searchTerms,
                                 escapeQueryOptions:EscapeQueryOptions.RawQuery);

但是在所有情况下让输入正确排列可能有点棘手。因此,您可能需要考虑的另一种技术是使用In运算符。如果您确定使用逗号分隔所描述的搜索字词,这将非常有效。

var searchTerms = "Adidas, Nike, Hugo Boss";
var items = searchTerms.Split(',').Select(x => x.Trim());
var results = session.Query<Shop>().Where(x => x.Brands.In(items));