{"id":330,"date":"2020-10-02T01:18:48","date_gmt":"2020-10-02T01:18:48","guid":{"rendered":"https:\/\/machine-learning.webcloning.com\/2020\/10\/02\/creating-a-multi-department-enterprise-search-using-custom-attributes-in-amazon-kendra\/"},"modified":"2020-10-02T01:18:48","modified_gmt":"2020-10-02T01:18:48","slug":"creating-a-multi-department-enterprise-search-using-custom-attributes-in-amazon-kendra","status":"publish","type":"post","link":"https:\/\/salarydistribution.com\/machine-learning\/2020\/10\/02\/creating-a-multi-department-enterprise-search-using-custom-attributes-in-amazon-kendra\/","title":{"rendered":"Creating a multi-department enterprise search using custom attributes in Amazon Kendra"},"content":{"rendered":"<div id=\"\">\n<p>An enterprise typically houses multiple departments such as engineering, finance, legal, and marketing, creating a growing number of documents and content that employees need to access. Creating a search experience that intuitively delivers the right information according to an employee\u2019s role, and the department is critical to driving productivity and ensuring security.<\/p>\n<p><a href=\"https:\/\/aws.amazon.com\/kendra\/\" target=\"_blank\" rel=\"noopener noreferrer\">Amazon Kendra<\/a>\u00a0is a highly accurate and easy-to-use enterprise search service powered by machine learning. Amazon Kendra delivers powerful natural language search capabilities to your websites and applications. These capabilities help your end-users easily find the information they need within the vast amount of content spread across your company.<\/p>\n<p>With Amazon Kendra, you can index the content from multiple departments and data sources into one Amazon Kendra index. To tailor the search experience by user role and department, you can add metadata to your documents and FAQs using Kendra\u2019s built-in attributes and custom attributes and apply user context filters.<\/p>\n<p>For search queries issued from a specific department\u2019s webpage, you can set Kendra to only return content from that department filtered by the employee\u2019s access level. For example, an associate role may only access a subset of restricted documents. In contrast, the department manager might have access to all the documents.<\/p>\n<p>This post provides a solution to indexing content from multiple departments into one Amazon Kendra index. To manage content access, the organization can create restrictions based on an employee\u2019s role and department or provide page-level filtering of search results. It demonstrates how content is filtered based on the web page location and individual user groups.<\/p>\n<h2>Solution architecture<\/h2>\n<p>The following architecture is comprised of two primary components: document ingestion into Amazon Kendra and document query using <a href=\"https:\/\/aws.amazon.com\/api-gateway\" target=\"_blank\" rel=\"noopener noreferrer\">Amazon API Gateway<\/a>.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-16469 size-full\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/09\/29\/1-Architecture-3.jpg\" alt=\"Architecture diagram depicting a pattern for multi-department enterprise search\" width=\"900\" height=\"747\"><\/p>\n<p>The preceding diagram depicts a fictitious enterprise environment with two departments: Marketing and Legal. Each department has its own webpage on their internal website. Every department has two employee groups: associates and managers. Managers are entitled to see all the documents, but associates can only see a subset.<\/p>\n<p>When employees from Marketing issue a search query on their department page, they only see the documents they are entitled to within their department (pink documents without the key). In contrast, the Marketing Manager sees all Marketing documents (all pink documents).<\/p>\n<p>When employees from Legal search on a Marketing department page, they don\u2019t see any documents. When all employees search on the internal website\u2019s main page, they see the public documents common to all departments (yellow).<\/p>\n<p>The following table shows the types of documents an employee gets for the various query combinations of webpage, department, and access roles.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-16491\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/09\/30\/Screen-Shot-2020-09-29-at-9.15.31-PM.png\" alt=\"Access Control Table\" width=\"1400\" height=\"372\"><\/p>\n<h2>Ingesting documents into Amazon Kendra<\/h2>\n<p>The document ingestion step consists of ingesting content and metadata from different departments\u2019 specific S3 buckets, indexed by Amazon Kendra. Content can\u00a0comprise structured data like FAQs and unstructured content like HTML, Microsoft PowerPoint, Microsoft Word, plain text, and PDF documents. For ingesting FAQ documents into Amazon Kendra, you can provide the questions, answers, and optional custom and access control attributes either in a CSV or JSON format.<\/p>\n<p>You can add metadata to your documents and FAQs using the built-in attributes in Amazon Kendra, custom attributes, and user context filters. You can filter content using a combination of these custom attributes and user context filters. For this post, we index each document and FAQ with:<\/p>\n<ol>\n<li>Built-in attribute <code>_category<\/code> to represent the web page.<\/li>\n<li>User context filter attribute for the employee access level.<\/li>\n<li>Custom attribute <code>department<\/code> representing the employee department.<\/li>\n<\/ol>\n<p>The following code is an example of the FAQ document for the Marketing webpage:<\/p>\n<div class=\"hide-language\">\n<pre class=\"unlimited-height-code\"><code class=\"lang-json\">{\r\n\"SchemaVersion\": 1,\r\n\"FaqDocuments\": [{\r\n\"Question\": \"What is the reimbursement policy for business related expenses?\",\r\n\"Answer\": \"All expenses must be submitted within 2 weeks.\",\r\n\"Attributes\": {\r\n\"_category\": \"page_marketing\",\r\n\"department\": \"marketing\"\r\n},\r\n\"AccessControlList\": [{\r\n\"Name\": \"associate\",\r\n\"Type\": \"GROUP\",\r\n\"Access\": \"ALLOW\"\r\n},{\r\n\"Name\": \"manager\",\r\n\"Type\": \"GROUP\",\r\n\"Access\": \"ALLOW\"\r\n}\r\n]\r\n},\r\n{\r\n\"Question\": \"What are the manager guidelines for employee promotions ?\",\r\n\"Answer\": \"Guidelines for employee promotions can be found on the manager portal.\",\r\n\"Attributes\": {\r\n\"_category\": \"page_marketing\",\r\n\"department\": \"marketing\"\r\n},\r\n\"AccessControlList\": [{\r\n\"Name\": \"manager\",\r\n\"Type\": \"GROUP\",\r\n\"Access\": \"ALLOW\"\r\n}]\r\n}\r\n]\r\n}\r\n<\/code><\/pre>\n<\/div>\n<p>The following code is an example of the metadata document for the Legal webpage:<\/p>\n<div class=\"hide-language\">\n<pre class=\"unlimited-height-code\"><code class=\"lang-json\">{\r\n\"DocumentId\": \"doc1\",\r\n\"Title\": \"What is the immigration policy?\",\r\n\"ContentType\": \"PLAIN_TEXT\",\r\n\"Attributes\": {\r\n\"_category\": \"page_legal\",\r\n\"department\": \"legal\"\r\n},\r\n\"AccessControlList\": [\r\n{\r\n\"Name\": \"associate\",\r\n\"Type\": \"GROUP\",\r\n\"Access\": \"ALLOW\"\r\n}\r\n]\r\n}<\/code><\/pre>\n<\/div>\n<h2>Document search by department<\/h2>\n<p>The search capability is exposed to the client application using an API Gateway endpoint. The API accepts an optional path parameter for the webpage on which the query was issued. If the query comes from the Marketing-specific page, the query looks like <code>\/search\/dept\/marketing<\/code>. For a comprehensive website search covering all the departments, you will leave out the path parameter. The query looks like <code>\/search<\/code><strong>.\u00a0<\/strong>Every API request also has two header values:<strong>\u00a0<\/strong><code>EMP_ROLE<\/code>, representing the employee access level, and <code>EMP_DEPT<\/code>, representing the department name. In this post, we don\u2019t describe how to authenticate users. We assume that you populate these two header values after authenticating the user with\u00a0<a href=\"http:\/\/aws.amazon.com\/cognito\" target=\"_blank\" rel=\"noopener noreferrer\">Amazon Cognito<\/a>\u00a0or your custom solutions.<\/p>\n<p>The\u00a0<a href=\"http:\/\/aws.amazon.com\/lambda\" target=\"_blank\" rel=\"noopener noreferrer\">AWS Lambda<\/a>\u00a0function that serves the API Gateway parses the path parameters and headers and issues an Amazon Kendra query call with <code>AttributeFilters<\/code> set to the category name from the path parameter (if present), the employee access level, and department from the headers. Amazon Kendra returns the FAQs and documents for that particular category and filters them by the employee access level and department. The Lambda function constructs a response with these search results and sends the FAQ and document search results back to the client application.<\/p>\n<h2>Deploying the AWS CloudFormation template<\/h2>\n<ol>\n<li>You can deploy this architecture using the provided <a href=\"http:\/\/aws.amazon.com\/cloudformation\" target=\"_blank\" rel=\"noopener noreferrer\">AWS CloudFormation<\/a> template in <code>us-east-1<\/code>. Please click to get started.<\/li>\n<\/ol>\n<p><a href=\"https:\/\/console.aws.amazon.com\/cloudformation\/home?region=us-east-1#\/stacks\/create\/template?stackName=kendrablog&amp;templateURL=https:\/\/aws-ml-blog.s3.amazonaws.com\/artifacts\/kendra-multi-department-search-blog\/template.yaml\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-16174 size-full\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/09\/22\/LaunchStack.jpg\" alt=\"CloudFormation Stack \" width=\"144\" height=\"27\"><\/a><\/p>\n<ol start=\"2\">\n<li>Choose <strong>Next<\/strong>.<\/li>\n<li>Provide a stack name and choose <strong>Next<\/strong>.<\/li>\n<li>In the\u00a0<strong>Capabilities and transforms\u00a0<\/strong>section, select all three check-boxes to provide acknowledgment to AWS CloudFormation to create IAM resources and expand the template. <img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-16470 size-full\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/09\/29\/2-Screenshot-7.jpg\" alt=\"Acknowledgement section of CloudFormation template\" width=\"900\" height=\"311\">\n<\/li>\n<li>Choose\u00a0<strong>Create stack<\/strong><strong>.<\/strong>\n<\/li>\n<\/ol>\n<p>This process might take 15 minutes or more to complete and creates the following resources:<\/p>\n<ul>\n<li>An Amazon Kendra index<\/li>\n<li>Three S3 buckets representing the departments: Legal, Marketing, and Public<\/li>\n<li>Three Amazon Kendra data sources that connect to the S3 buckets<\/li>\n<li>A Lambda function and an API Gateway endpoint that is called by the client application<\/li>\n<\/ul>\n<p>After the CloudFormation template finishes deploying the above infrastructure, you will see the following Outputs.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-16472 size-full\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/09\/29\/4-Screenshot-5.jpg\" alt=\"CloudWatch Outputs Section\" width=\"900\" height=\"494\"><\/p>\n<p><strong>API Key and Usage Plan<\/strong><\/p>\n<ol>\n<li>The KendraQueryAPI will require an API key. The CloudFormation output <code>ApiGWKey<\/code>\u00a0refers to the name of the API key. Currently, this API key is associated with a usage plan that allows 2000 requests per month.<\/li>\n<li>Click the link in the <strong>Value<\/strong> column corresponding to the <strong>Key<\/strong> <code>ApiGWKey<\/code>. This will open the API Keys section of the <a href=\"https:\/\/console.aws.amazon.com\/apigateway\" target=\"_blank\" rel=\"noopener noreferrer\">API Gateway console<\/a>.<\/li>\n<li>Click <strong>Show <\/strong>next to the<strong> API key.<\/strong>\n<\/li>\n<li>Copy the <strong>API key<\/strong>.\u00a0We will use this when testing the API.<img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-16473 size-full\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/09\/29\/5-Screenshot-6.jpg\" alt=\"API Key section in API Gateway Console\" width=\"900\" height=\"438\">\n<\/li>\n<li>You can manage the usage plan by following the instructions on, <a href=\"https:\/\/docs.aws.amazon.com\/apigateway\/latest\/developerguide\/api-gateway-create-usage-plans-with-console.html\" target=\"_blank\" rel=\"noopener noreferrer\">Create, configure, and test usage plans with the API Gateway console.<\/a>\n<\/li>\n<li>You can also add fine-grained authentication and authorization to your APIs. For more information on securing your APIs, you can follow instructions on <a href=\"https:\/\/docs.aws.amazon.com\/apigateway\/latest\/developerguide\/apigateway-control-access-to-api.html\" target=\"_blank\" rel=\"noopener noreferrer\">Controlling and managing access to a REST API in API Gateway.<\/a>\n<\/li>\n<\/ol>\n<h2>Uploading sample documents and FAQ<\/h2>\n<p>Add your documents and FAQs file to their corresponding S3 buckets. We\u2019ve also provided you with some <a href=\"https:\/\/aws-ml-blog.s3.amazonaws.com\/artifacts\/kendra-multi-department-search-blog\/s3data.zip\" target=\"_blank\" rel=\"noopener noreferrer\">sample document files<\/a> and <a href=\"https:\/\/aws-ml-blog.s3.amazonaws.com\/artifacts\/kendra-multi-department-search-blog\/faqs.json\" target=\"_blank\" rel=\"noopener noreferrer\">sample FAQs file<\/a> to download.<\/p>\n<p>Upload all the document files whose file name prefix corresponds to the S3 buckets created as part of the CloudFormation. For example, all Marketing documents and their corresponding metadata files go into the <code>kendra-blog-data-source-marketing-<span><em>[STACK_NAME]<\/em><\/span><\/code> bucket<strong>.<\/strong> Upload the FAQ document into to the<code> kendra-blog-faqs-<span><em>[STACK_NAME]<\/em><\/span><\/code>bucket<strong>.<\/strong><\/p>\n<h2>Creating the facet definition for custom attributes<\/h2>\n<p>In this step, you add a facet definition to the index.<\/p>\n<ol>\n<li>On the Amazon Kendra console, choose the index created in the previous step.<\/li>\n<li>Choose <strong>Facet definition<\/strong>.<\/li>\n<li>Choose the <strong>Add <\/strong>\n<\/li>\n<li>For <strong>Field name<\/strong>, enter <code>department<\/code>.<\/li>\n<li>For <strong>Data type<\/strong>, choose <strong>String<\/strong>.<\/li>\n<li>For <strong>Usage types<\/strong>, select <strong>Facetable<\/strong>, <strong>Searchable<\/strong>, <strong>Displayable<\/strong>, and <strong>Sortable<\/strong>.<\/li>\n<li>Choose <strong>Add<\/strong>.<\/li>\n<\/ol>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-16474 size-full\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/09\/29\/6-Screenshot-5.jpg\" alt=\"Adding a Facet to Kendra index\" width=\"900\" height=\"568\"><\/p>\n<ol start=\"8\">\n<li>On the Amazon Kendra console, choose the newly created index.<\/li>\n<li>Choose <strong>Data sources<\/strong>.<\/li>\n<li>Sync <code>kendra-blog-data-source-legal-<span><em>[STACK_NAME]<\/em><\/span><\/code>, <code>kendra-blog-data-source-marketing-<span><em>[STACK_NAME]<\/em><\/span><\/code>, and <code>kendra-blog-data-source-public-<span><em>[STACK_NAME]<\/em><\/span><\/code> by selecting the data source name and choosing <strong>Sync now<\/strong>. You can sync multiple data sources simultaneously.<\/li>\n<\/ol>\n<p>This should start the indexing process of the documents in the S3 buckets.<\/p>\n<h2>Adding FAQ documents<\/h2>\n<p>After you create your index, you can add your FAQ data.<\/p>\n<ol>\n<li>On the Amazon Kendra console, choose the new index.<\/li>\n<li>Choose <strong>FAQs<\/strong>.<\/li>\n<li>Choose <strong>Add FAQ<\/strong>.<\/li>\n<li>For <strong>FAQ name<\/strong>, enter a name, such as <code>demo-faqs-with-metadata<\/code>.<\/li>\n<li>For <strong>FAQ file format<\/strong>, choose <strong>JSON file<\/strong>.<\/li>\n<li>For <strong>S3<\/strong>, browse Amazon S3 to find <code>kendra-blog-faqs-<span><em>[STACK_NAME]<\/em><\/span><\/code>, and choose the <code>faqs.json<\/code> file.<\/li>\n<li>For <strong>IAM role<\/strong>, choose <strong>Create a new role<\/strong> to allow Amazon Kendra to access your S3 bucket.<\/li>\n<li>For <strong>Role name<\/strong>, enter a name, such as <code>AmazonKendra-blog-faq-role<\/code>.<\/li>\n<li>Choose <strong>Add<\/strong>.<\/li>\n<\/ol>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-16475 size-full\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/09\/29\/7-Screenshot-2.jpg\" alt=\"Setting up FAQs in Amazon Kendra\" width=\"900\" height=\"1017\"><\/p>\n<h2>Testing the solution<\/h2>\n<p>You can test the various combinations of page and user-level attributes on the API Gateway console. You can refer to Test a method with API Gateway console to learn about how to test your API using the\u00a0API Gateway console.<\/p>\n<p>The following screenshot is an example of testing the scenario where an associate from the Marketing department searches on the department-specific page.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-16494\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/09\/30\/Screen-Shot-2020-09-29-at-14.55.48.png\" alt=\"\" width=\"2988\" height=\"1532\"><\/p>\n<p>You will have to pass the following parameters while testing the above scenario.<\/p>\n<ol>\n<li>\n<strong>Path<\/strong>: <code>page_marketing<\/code>\n<\/li>\n<li>\n<strong>Query String<\/strong>: <code>queryInput=\"financial targets\"<\/code>\n<\/li>\n<li>\n<strong>Headers<\/strong>: <\/p>\n<ol>\n<li><code><strong>x-api-key<\/strong>: &lt;&lt; Your API Key copied earlier from the CloudFormation step &gt;&gt;<\/code><\/li>\n<li><code><strong>EMP_ROLE<\/strong>:associate<\/code><\/li>\n<li><code><strong>EMP_DEPT<\/strong>:marketing<\/code><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>You will see a JSON response with a FAQ result matching the above conditions.<\/p>\n<div class=\"hide-language\">\n<pre class=\"unlimited-height-code\"><code class=\"lang-json\">\u2026\r\n\"DocumentExcerpt\": {\"Text\": \"Please work with your manager to understand the goals for your department.\", \r\n\u2026\r\n<\/code><\/pre>\n<\/div>\n<p>You can keep the <code>queryInput=\"financial targets\"<\/code> but change the <code><strong>EMP_ROLE<\/strong><\/code>\u00a0from <code>associate<\/code> to <code>manager<\/code>, and you should see a different answer.<\/p>\n<div class=\"hide-language\">\n<pre class=\"unlimited-height-code\"><code class=\"lang-json\">\u2026\r\n\"DocumentExcerpt\": { \"Text\": \"The plan is achieve 2x the sales in the next quarter.\", \r\n\u2026.\r\n<\/code><\/pre>\n<\/div>\n<h2>Cleaning up<\/h2>\n<p>To remove all resources created throughout this process and prevent additional costs, complete the following steps:<\/p>\n<ol>\n<li>Delete all the files from the S3 buckets.<\/li>\n<li>On the AWS CloudFormation console, delete the stack you created. This removes the resources the CloudFormation template created.<\/li>\n<\/ol>\n<h2>Conclusion<\/h2>\n<p>In this post, you learned how to use Amazon Kendra to deploy a cognitive search service across multiple departments in your organization and filter documents using custom attributes and user context filters. To enable, Amazon Kendra you don\u2019t need to have any previous ML or AI experience. Use Amazon Kendra to provide your employees with faster access to information that is spread across your organization.<\/p>\n<hr>\n<h3>About the Authors<\/h3>\n<p><strong><img decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-16217 alignleft\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/09\/23\/Kesharaju.jpg\" alt=\"\" width=\"101\" height=\"116\">Shanthan Kesharaju<\/strong> is a Senior Architect in the AWS ProServe team. He helps our customers with AI\/ML strategy, architecture, and develop products with a purpose. Shanthan has an MBA in Marketing from Duke University and an MS in Management Information Systems from Oklahoma State University.<\/p>\n<p>\u00a0<\/p>\n<p>\u00a0<\/p>\n<p><strong><img decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-16663 alignleft\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/f1f836cb4ea6efb2a0b1b99f41ad8b103eff4b59\/2020\/10\/01\/Marty-Jiang.jpg\" alt=\"\" width=\"100\" height=\"135\">Marty Jiang<\/strong> is a Conversational AI Consultant with AWS Professional Services. Outside of work, he loves spending time outdoors with his family and exploring new technologies.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>https:\/\/aws.amazon.com\/blogs\/machine-learning\/creating-a-multi-department-enterprise-search-using-custom-attributes-in-amazon-kendra\/<\/p>\n","protected":false},"author":0,"featured_media":331,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/posts\/330"}],"collection":[{"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/comments?post=330"}],"version-history":[{"count":0,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/posts\/330\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/media\/331"}],"wp:attachment":[{"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/media?parent=330"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/categories?post=330"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/salarydistribution.com\/machine-learning\/wp-json\/wp\/v2\/tags?post=330"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}