【问题标题】:Azure Search, mapping, merge collectionsAzure 搜索、映射、合并集合
【发布时间】:2018-01-04 08:54:39
【问题描述】:

我有以下数据:

来自SELECT c.addresses[0] address, [ c.name ] filenames FROM c

[
  {
    "address": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    "filenames": [
      "File 01.docx"
    ]
  },
  {
    "address": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    "filenames": [
      "File 02.docx"
    ]
  },
  {
    "address": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    "filenames": [
      "File 03.docx"
    ]
  }, ....

address 字段是关键,我有一个索引,其字段定义如下:

new Field()
{
    Name = "filenames",
    Type = DataType.Collection(DataType.String),
    IsSearchable = true,
    IsFilterable = true,
    IsSortable = false,
    IsFacetable = false
},

如您所见,我为带有[ c.name ] filenames 的文件名创建了一个数组。

当我索引上面显示的数据时,索引包含 filenames 集合中的一行,该行是已被索引的最后一行。我可以让它添加到集合(合并)而不是替换吗?

我也在考虑使用 Query 来解决这个问题,但是 CosmosDB 不支持子选择(目前),并且 UDF 只能看到传递给它的数据。

【问题讨论】:

    标签: azure azure-cognitive-search


    【解决方案1】:

    从根本上说,构建 Cosmos DB 集合的方式使此方案不可行,因为 Azure 搜索不支持合并到集合中。

    考虑将您的设计更改为使address 成为集合中的一个键(即唯一),并且所有filenames 都被收集在每个address 的单个文档中:

      {
        "address": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
        "filenames": [ "File 01.docx", "File 02.docx", "File 03.docx", ... ]
      }
    

    另外,请在Azure Search UserVoice site 上添加建议以添加对合并集合的支持,这将使您的方案更容易实现。

    【讨论】:

    • 我也是这么想的,我们的 CosmosDB 代表一个文件系统,我们通过使用单实例存储方式来降低存储成本。我们无法真正更改结构以允许将文件存储为数组,但我们可以创建另一个文档集合来满足索引要求。我们可以创建一个触发器来写出包含所有文件的文档。或者,放弃单实例存储,因为爬网所需的额外努力可能不值得。
    猜你喜欢
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2012-12-18
    • 2021-05-28
    • 2014-09-21
    相关资源
    最近更新 更多