2017-08-01 74 views
0

我有一個數據結構,其中有一個搜索項數組標記。在documentDb中搜索多個搜索條目

{ 
    id: "some_id", 
    name: "Bob's diner and eatery", 
    searchTerms: ["bob", "bobs", "diner", "eatery"] 
} 

我可以使用下面的查詢

SELECT VALUE 
    restaurant 
FROM root 
    restaurant 
JOIN 
    word 
IN 
    restaurant.searchTerms 
WHERE 
    CONTAINS(word, @SearchTerm) 

我怎麼會去尋找在那裏我有,我想尋找多個搜索字詞,搜索一個詞?如果有多個搜索字詞,則只有當搜索字詞包含所有搜索字詞或搜索字詞的部分時,該文檔纔會匹配。下面將匹配,例如:

["bo", "eat"] 
["bobs", "diner"] 

但以下不會:

["bobs", "restaurant"] 

爲「餐廳」是不匹配的搜索字詞。

+0

也許不是你要找的東西,但這可以很容易地在運行服務器端的存儲過程中實現 –

+0

@JesseCarter請詳細說明這一點。我不會反對存儲過程,請做另一個答案。如果這是目前唯一能夠實現這一目標的方法,那麼我會對看到您的方法感興趣。 –

回答

3

2的方法:

SQL查詢

如果你是全令牌數組中搜索,你可以ARRAY_CONTAINSOR操作

SELECT * 
FROM c 
WHERE ARRAY_CONTAINS(c, token1) OR ARRAY_CONTAINS(c, token2) 

這裏是一個example query

Azure Search Ind在上面Azure的EXER宇宙DB

如果你想要做富全文搜索(模糊文本搜索,拼寫錯誤等),您可以在Azure的宇宙DB容器的頂部添加Azure的搜索搜索索引:https://docs.microsoft.com/en-us/azure/search/search-howto-index-documentdb

+0

如果您正在搜索完整令牌,那麼無論如何要傳遞一個字符串數組作爲參數來搜索'n'個令牌,或者我需要創建n個不同的查詢(可能最多5個搜索項)?你說的是,你不能使用字符串包含函數來搜索多個匹配的OR運算符,你確定嗎? –

+0

ARRAY_CONTAINS系統函數本質上是一個元素數組上的等式匹配 - 因此可以在數據庫索引上運行。 String CONTAINS系統函數是子字符串匹配項,因此無法針對集合中的索引查找進行優化。該空間中唯一可以針對索引檢索進行優化的字符串函數是在範圍索引(保留順序)上的STARTS_WITH。請注意,如果查詢過濾器中除字符串CONTAINS之外沒有其他謂詞,則查詢將需要掃描,並且RU成本可能很高。 –

+0

String CONTAINS在技術上可行,但如果通過大型集合進行掃描可能不是最佳選擇。 –