Сопоставление обогащенных выходных данных с полями в индексе поиска в службе "Поиск ИИ Azure"

Этапы индексатора

В этой статье объясняется, как настроить сопоставления полей вывода, определяя путь к данным между структурами данных в памяти, созданными во время обработки набора навыков, и целевыми полями в индексе поиска. Сопоставление выходных полей определяется в индексаторе и содержит следующие элементы:

"outputFieldMappings": [
  {
    "sourceFieldName": "document/path-to-a-node-in-an-enriched-document",
    "targetFieldName": "some-search-field-in-an-index",
    "mappingFunction": null
  }
],

В отличие от fieldMappings определения, которое сопоставляет путь между двумя физическими структурами данных, outputFieldMappings определение сопоставляет обогащения в памяти с полями в индексе поиска.

Сопоставления полей выходных данных требуются, если у индексатора есть подключенный набор навыков, который создает новые сведения, такие как перевод текста или извлечение ключевых фраз. Во время выполнения индексатора данные, созданные ИИ, существуют только в памяти. Чтобы сохранить эти сведения в индексе поиска, необходимо сообщить индексатору, куда отправлять данные.

Сопоставления полей выходных данных также можно использовать для получения определенных узлов в сложном типе исходного документа. Например, может потребоваться только "FullName/LastName" в многокомпонентном свойстве FullName. Если вам не нужна полная сложная структура, вы можете расположить отдельные узлы в вложенных структурах данных, а затем использовать сопоставление полей вывода для отправки выходных данных в коллекцию строк в индексе поиска.

Сопоставления полей вывода применяются к:

  • Содержимое в памяти, созданное навыками или извлеченным индексатором. Исходное поле — это узел в обогащенном дереве документов.

  • Индексы поиска. Если вы заполняете хранилище знаний, используйте проекции для конфигурации пути к данным. Если вы заполняете векторные поля, сопоставления выходных полей не используются.

Сопоставления полей выходных данных применяются после выполнения набора навыков или после взлома документа, если нет связанного набора навыков.

Определение сопоставления выходных полей

Сопоставления полей выходных данных добавляются в outputFieldMappings массив в определении индексатора, обычно помещаются после массива fieldMappings . Сопоставление полей вывода состоит из трех частей.

"fieldMappings": []
"outputFieldMappings": [
  {
    "sourceFieldName": "/document/path-to-a-node-in-an-enriched-document",
    "targetFieldName": "some-search-field-in-an-index",
    "mappingFunction": null
  }
],
Свойство Description
sourceFieldName Обязательный. Указывает путь к обогащению содержимого. Например: /document/content. Сведения о синтаксисе пути и примерах см . в разделе "Справочные обогащения" в наборе навыков поиска ИИ Azure.
targetFieldName Необязательно. Указывает поле поиска, которое получает обогащенное содержимое. Целевые поля должны быть простыми полями верхнего уровня или коллекциями. Это не может быть путь к подфилду в сложном типе. Если вы хотите получить определенные узлы в сложной структуре, вы можете расположение отдельных узлов в памяти, а затем отправить выходные данные в коллекцию строк в индексе.
сопоставлениеFunction Необязательно. Добавляет дополнительную обработку, предоставляемую функциями сопоставления, поддерживаемыми индексаторами. Для узлов обогащения кодирование и декодирование являются наиболее часто используемыми функциями.

Rest API или Пакет SDK Azure можно использовать для определения сопоставлений полей вывода.

Совет

Индексаторы, созданные мастером импорта данных, включают сопоставления полей вывода, созданные мастером. Если вам нужны примеры, запустите мастер по источнику данных, чтобы просмотреть отрисованное определение.

Используйте создание индексатора (REST) или индексатора обновлений (REST), любой версии API.

В этом примере добавляются сущности и метки тональности, извлеченные из свойства содержимого большого двоичного объекта в поля в индексе поиска.

PUT https://[service name].search.windows.net/indexers/myindexer?api-version=[api-version]
Content-Type: application/json
api-key: [admin key]
{
    "name": "myIndexer",
    "dataSourceName": "myDataSource",
    "targetIndexName": "myIndex",
    "skillsetName": "myFirstSkillSet",
    "fieldMappings": [],
    "outputFieldMappings": [
        {
            "sourceFieldName": "/document/content/organizations/*/description",
            "targetFieldName": "descriptions",
            "mappingFunction": {
                "name": "base64Decode"
            }
        },
        {
            "sourceFieldName": "/document/content/organizations",
            "targetFieldName": "orgNames"
        },
        {
            "sourceFieldName": "/document/content/sentiment",
            "targetFieldName": "sentiment"
        }
    ]
}

Для каждого сопоставления поля выходных данных, задайте расположение данных в дереве обогащенного документа (sourceFieldName) и имя поля, как указано в индексе (targetFieldName). Назначьте все функции сопоставления, необходимые для преобразования содержимого поля, прежде чем он хранится в индексе.

Неструктурированные сложные структуры в коллекцию строк

Если исходные данные состоят из вложенных или иерархических JSON, для настройки путей к данным нельзя использовать сопоставления полей. Вместо этого индекс поиска должен зеркало структуру исходных данных для каждого уровня для полного импорта.

В этом разделе описывается процесс импорта, который создает комплексное отражение сложного документа как на исходной, так и целевой стороне. Затем он использует тот же исходный документ для иллюстрации извлечения и выравнивания отдельных узлов в коллекции строк.

Ниже приведен пример документа в Azure Cosmos DB с вложенным JSON:

{
   "palette":"primary colors",
   "colors":[
      {
         "name":"blue",
         "medium":[
            "acrylic",
            "oil",
            "pastel"
         ]
      },
      {
         "name":"red",
         "medium":[
            "acrylic",
            "pastel",
            "watercolor"
         ]
      },
      {
         "name":"yellow",
         "medium":[
            "acrylic",
            "watercolor"
         ]
      }
   ]
}

Если вы хотите полностью индексировать приведенный выше исходный документ, создайте определение индекса, в котором имена полей, уровни и типы отражаются как сложный тип. Так как сопоставления полей не поддерживаются для сложных типов в индексе поиска, определение индекса должно зеркало исходного документа.

{
  "name": "my-test-index",
  "defaultScoringProfile": "",
  "fields": [
    { "name": "id", "type": "Edm.String", "searchable": false, "retrievable": true, "key": true},
    { "name": "palette", "type": "Edm.String", "searchable": true, "retrievable": true },
    { "name": "colors", "type": "Collection(Edm.ComplexType)",
      "fields": [
        {
          "name": "name",
          "type": "Edm.String",
          "searchable": true,
          "retrievable": true
        },
        {
          "name": "medium",
          "type": "Collection(Edm.String)",
          "searchable": true,
          "retrievable": true,
        }
      ]
    }
  ]
}

Ниже приведено определение индексатора, которое выполняет импорт (обратите внимание, что сопоставления полей и набор навыков отсутствуют).

{
  "name": "my-test-indexer",
  "dataSourceName": "my-test-ds",
  "skillsetName": null,
  "targetIndexName": "my-test-index",

  "fieldMappings": [],
  "outputFieldMappings": []
}

Результатом является следующий пример документа поиска, аналогичный исходному в Azure Cosmos DB.

{
  "value": [
    {
      "@search.score": 1,
      "id": "240a98f5-90c9-406b-a8c8-f50ff86f116c",
      "palette": "primary colors",
      "colors": [
        {
          "name": "blue",
          "medium": [
            "acrylic",
            "oil",
            "pastel"
          ]
        },
        {
          "name": "red",
          "medium": [
            "acrylic",
            "pastel",
            "watercolor"
          ]
        },
        {
          "name": "yellow",
          "medium": [
            "acrylic",
            "watercolor"
          ]
        }
      ]
    }
  ]
}

Альтернативой отрисовки в индексе поиска является выравнивание отдельных узлов в вложенной структуре источника в коллекцию строк в индексе поиска.

Для выполнения этой задачи потребуется outputFieldMappings , чтобы сопоставить узел в памяти со строковой коллекцией в индексе. Хотя сопоставления полей выходных данных в основном применяются к выходным данным навыка, их также можно использовать для обращения к узлам после "взлома документов" , где индексатор открывает исходный документ и считывает его в память.

Ниже приведен пример определения индекса, использующий коллекции строк для получения неструктурированных выходных данных:

{
  "name": "my-new-flattened-index",
  "defaultScoringProfile": "",
  "fields": [
    { "name": "id", "type": "Edm.String", "searchable": false, "retrievable": true, "key": true },
    { "name": "palette", "type": "Edm.String", "searchable": true, "retrievable": true },
    { "name": "color_names", "type": "Collection(Edm.String)", "searchable": true, "retrievable": true },
    { "name": "color_mediums", "type": "Collection(Edm.String)", "searchable": true, "retrievable": true}
  ]
}

Ниже приведен пример определения индексатора, который используется outputFieldMappings для связывания вложенных JSON с полями коллекции строк. Обратите внимание, что исходное поле использует синтаксис пути для узлов обогащения, даже если набор навыков отсутствует. Обогащенные документы создаются в системе во время взлома документов, что означает, что вы можете получить доступ к узлам в каждом дереве документов до тех пор, пока эти узлы существуют при трещине документа.

{
  "name": "my-test-indexer",
  "dataSourceName": "my-test-ds",
  "skillsetName": null,
  "targetIndexName": "my-new-flattened-index",
  "parameters": {  },
  "fieldMappings": [   ],
  "outputFieldMappings": [
    {
       "sourceFieldName": "/document/colors/*/name",
       "targetFieldName": "color_names"
    },
    {
       "sourceFieldName": "/document/colors/*/medium",
       "targetFieldName": "color_mediums"
    }
  ]
}

Результаты из приведенного выше определения приведены следующим образом. Упрощение структуры теряет контекст в этом случае. Связь между заданным цветом и средой, в которую она доступна, больше не существует. Однако в зависимости от вашего сценария результат, аналогичный приведенному ниже, может быть именно тем, что вам нужно.

{
  "value": [
    {
      "@search.score": 1,
      "id": "240a98f5-90c9-406b-a8c8-f50ff86f116c",
      "palette": "primary colors",
      "color_names": [
        "blue",
        "red",
        "yellow"
      ],
      "color_mediums": [
        "[\"acrylic\",\"oil\",\"pastel\"]",
        "[\"acrylic\",\"pastel\",\"watercolor\"]",
        "[\"acrylic\",\"watercolor\"]"
      ]
    }
  ]
}

См. также