考虑以下包含品牌的伪数据模型“Shop”:
Shop:
{
Id ... etc ...
Name: "General sports store",
Brands: {"Adidas", "Nike", "Puma"}
}
鉴于某些品牌名单,我想找到销售类似产品的商店。
例如,鉴于以下商店:
当我搜索“Nike,Adidas”时,我想找到“Niketown”和“其他商店”,因为他们有我们的品牌。
“其他商店”应该是第一个结果,因为它销售我们要求的大部分品牌。 (我可以使用助推吗?)
但是,不应该找到“错误的商店”,因为它没有我们要求的任何品牌......
我应该如何使用RavenDb来解决这个问题?
答案 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));