【问题标题】:Searching for multiple search terms in documentDb在 documentDb 中搜索多个搜索词
【发布时间】:2018-01-08 23:19:13
【问题描述】:

我有一个数据结构,我在其中标记了一组搜索词。

{
   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"]

因为“餐厅”不是匹配的搜索词。

【问题讨论】:

  • 也许不是您想要的,但这可以很容易地在运行服务器端的存储过程中实现
  • @JesseCarter 请详细说明。我不会反对存储过程,请做另一个答案。如果这是目前完成此任务的唯一方法,我将有兴趣了解您的方法。

标签: sql substring contains azure-cosmosdb


【解决方案1】:

2 种方法:

SQL 查询

如果你是通过数组中的完整标记搜索,你可以ARRAY_CONTAINSOR运算符

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

这是example query

Azure Cosmos DB 上的 Azure 搜索索引器

如果要进行富全文搜索(模糊文本搜索、拼写错误等),可以在 Azure Cosmos DB 容器顶部添加 Azure 搜索搜索索引器:https://docs.microsoft.com/en-us/azure/search/search-howto-index-documentdb

【讨论】:

  • 如果您正在搜索完整的标记,是否有传递字符串数组作为参数来搜索“n”个标记,或者我需要创建 n 个不同的查询(可能最多5 个搜索词)?您的意思是您不能使用字符串包含函数来使用 OR 运算符搜索多个匹配项,您确定吗?
  • ARRAY_CONTAINS 系统函数本质上是一个元素数组的相等匹配 - 因此可以在数据库索引上运行。 String CONTAINS 系统函数是子字符串匹配,因此无法针对集合内的索引查找进行优化。该空间中唯一可以针对索引检索进行优化的 String 函数是范围索引上的 STARTS_WITH(保留顺序)。请注意,如果查询过滤器中除了字符串 CONTAINS 之外没有其他谓词,则查询将需要扫描,并且 RU 成本可能会很高。
  • String CONTAINS 在技术上是可行的,但如果扫描大型集合,则可能不是最佳的。
  • 我发现这种方法的有趣之处在于 ARRAY_CONTAINS 实际上进行了子字符串匹配。当我搜索一个子字符串并发现它与整个单词匹配时,我感到非常惊喜。
猜你喜欢
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
相关资源
最近更新 更多