考虑到包含品牌的下列伪数据模型“商店”:
Shop:
{
Id ... etc ...
Name: "General sports store",
Brands: {"Adidas", "Nike", "Puma"}
}给出一个特定的品牌清单,我想找到销售类似商品的商店。
例如,考虑到以下商店:
当我寻找“耐克,阿迪达斯”,我想找到“耐克镇”和“其他商店”,因为他们有我们的品牌。
“其他商店”应该是第一个结果,因为它销售我们所要求的大多数品牌。(我能用助推吗?)
但是,不应该找到“错店”,因为它没有我们要求的任何品牌.
我应该如何使用RavenDb来处理这个问题呢?
发布于 2013-07-09 18:03:23
如果输入是单个"Nike, Adidas"字符串,那么首先需要删除逗号,因为它不是数据库中标记"Nike“的一部分。
但这样你就可以正常搜索了。您描述的行为是默认的。提高是不需要的,因为多场比赛已经有一个更高的分数,并提高到顶端。
var searchTerms = "Nike, Adidas";
searchTerms = searchTerms.Replace(",", "");
var results = session.Query<Shop>().Search(x => x.Brands, searchTerms);然而,我注意到有些术语是多个单词("Hugo“)。这将抛出搜索,因为它期待的是单个单词标记。换句话说,这不会返回任何结果:
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));https://stackoverflow.com/questions/17553398
复制相似问题