2017-08-01 77 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在技术上可行,但如果通过大型集合进行扫描可能不是最佳选择。 –