2013-07-09 42 views
1

考慮以下僞數據模型「商店」,其中包含品牌:RavenDb - 查詢由次東西數量是一個子集

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

鑑於品牌一定名單,我想找到的商店是出售類似的東西。

例如,給出以下店鋪

  • 耐克城:耐克
  • 其他一些店鋪:耐克,阿迪達斯
  • 錯誤店:波士

當我搜索「耐克,阿迪達斯「,我想找到」尼克敦「和」其他一些商店「,因爲他們有我們的品牌。

「一些其他商店」應該是第一個結果,因爲它銷售我們所要求的大部分品牌。 (我可以用拉動了這一點?)

然而,「錯誤的店」應該不會被發現,因爲它沒有任何我們所要求的品牌...

我應該如何看待這與RavenDb ?

回答

1

如果您的輸入是單個字符串"Nike, Adidas"那麼您首先需要刪除逗號,因爲它不屬於數據庫中的標記「Nike」的一部分。

但是,你可以簡單地正常搜索。你描述的行爲是默認行爲。提升並不是必需的,因爲多場比賽已經有了更高的分數並被提升到最高。

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

然而,我注意到,你有一些方面是多個單詞(「波士」)。這會甩掉搜索,因爲它期待單個詞的標記。換句話說,這不會返回任何結果:

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)); 
+0

考慮「In」方法。這是否也會在最上面展示最佳結果? (與最匹配的品牌) –

+0

是的。除非您更改順序,否則這是默認行爲。 –