1

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

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

给定一定的品牌列表,我想找到卖类似东西的商店。

例如,给定以下商店:

  • 耐克城:耐克
  • 其他一些商店:耐克,阿迪达斯
  • 错误的商店:Hugo Boss

当我搜索“耐克、阿迪达斯”时,我想同时找到“耐克城”和“其他商店”,因为他们有我们的品牌。

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

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

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

4

1 回答 1

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方法,您需要确保输入字符串在多词术语周围有引号。您还需要告诉 raven 不要逃避这些字符串。所以这会起作用:

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));
于 2013-07-09T18:03:23.257 回答