From 7dca4a0dc7b647747acc1f85e31d6be8ba4e7520 Mon Sep 17 00:00:00 2001
From: Shane Hutchins <shane.hutchins@hitachivantara.com>
Date: Wed, 3 Apr 2024 14:21:49 +0000
Subject: [PATCH] doc update and pages publishing

---
 .gitlab-ci.yml                                |   4 +-
 docs/dashboard.md                             |  13 --
 docs/{tutorial => docs}/ArrayOfObjects.md     |  78 +++----
 .../PolicyService-Integration.md              |  22 +-
 docs/{tutorial => docs}/PreviewFeatures.md    |   5 +-
 .../SearchService.md => docs/api.md}          | 210 ++++++------------
 docs/{ => docs}/auditlogs.md                  |  14 +-
 docs/docs/index.md                            |  10 +
 docs/{setup.md => docs/running.md}            |  25 ++-
 docs/mkdocs.yml                               |  45 ++++
 publish.yml                                   |  30 +++
 11 files changed, 206 insertions(+), 250 deletions(-)
 rename docs/{tutorial => docs}/ArrayOfObjects.md (93%)
 rename docs/{tutorial => docs}/PolicyService-Integration.md (65%)
 rename docs/{tutorial => docs}/PreviewFeatures.md (92%)
 rename docs/{tutorial/SearchService.md => docs/api.md} (88%)
 rename docs/{ => docs}/auditlogs.md (63%)
 create mode 100644 docs/docs/index.md
 rename docs/{setup.md => docs/running.md} (52%)
 create mode 100644 docs/mkdocs.yml
 create mode 100644 publish.yml

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 9efa92959..7b1a2f163 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -62,10 +62,8 @@ include:
 
   - local: "devops/gc/pipeline/override-stages.yml"
 
-  - project: "osdu/platform/ci-cd-pipelines"
-    file: "publishing/pages.yml"
-
   - local: "devops/core-plus/pipeline/override-stages.yml"
+  - local: "/publish.yml"
 
 .maven:
   image: maven:3.9.3-eclipse-temurin-17
diff --git a/docs/dashboard.md b/docs/dashboard.md
index d6cff2b2b..84dcbd7e0 100644
--- a/docs/dashboard.md
+++ b/docs/dashboard.md
@@ -1,16 +1,3 @@
-Copyright 2017-2019, Schlumberger
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
 # Data Ecosystem Service Dashboard
 
 ## Links
diff --git a/docs/tutorial/ArrayOfObjects.md b/docs/docs/ArrayOfObjects.md
similarity index 93%
rename from docs/tutorial/ArrayOfObjects.md
rename to docs/docs/ArrayOfObjects.md
index 71ad45336..ca05e4bc9 100644
--- a/docs/tutorial/ArrayOfObjects.md
+++ b/docs/docs/ArrayOfObjects.md
@@ -1,39 +1,13 @@
-## Searching by an array of objects
-
-### Table of contents <a name="TOC"></a>
-- [Introduction](#introduction)
-- [Schemas](#schemas)
-    * [Indexing hints](#indexing-hints)
-      + [Default](#default-hint)
-      + [Flattened](#flattened-hint)
-      + [Nested](#nested-hint)
-- [Query](#query)
-    * [Default](#default-query)
-    * [Flattened](#flattened-query)
-    * [Nested](#nested-query)
-      + [Examples](#nested-query-examples)
-        - [Range query](#range-query-examples)
-        - [Text query](#text-query-examples)
-        - [Combination with non-nested queries](#combination-query-examples)
-        - [Multilevel-Nested query](#multilevel-query-examples)
-- [Sort](#sort)
-    * [Default](#default-sort)
-    * [Flattened](#flattened-sort)
-    * [Nested](#nested-sort)
-- [Aggregation](#aggregation)
-    * [Default](#default-aggregation)
-    * [Flattened](#flattened-aggregation)
-    * [Nested](#nested-aggregation)
-- [Make an array of objects searchable ](#update-schema)
-
-## Introduction <a name="introduction"></a>
+# Searching by an Array of Objects
+
+## Introduction
 Since 0.9.0 version the Search API provides a mechanism to search data structured in an array of objects. Search capabilities directly related to schema definitions,
 this tutorial describes how you can define an array of objects in schemas and how search should be performed for each definition. 
 
-## Schemas <a name="schemas"></a>
+## Schemas
 Since 0.8.0 version The indexer service supports special indexing hints in schemas that allow you to define different elasticsearch mapping types for an array of objects.
 
-### Indexing hints <a name="indexing-hints"></a> 
+### Indexing hints
 In this section, we will take a closer look at each type of array, how it can be defined in the schema, and how it will be represented in elasticsearch. 
 Special property `x-osdu-indexing` with values `nested` or ` flattened` used to define an array of objects representation in elasticsearch:
 ```json
@@ -183,7 +157,7 @@ curl --location --request GET 'https://<SCHEMA-API>/api/schema-service/v1/schema
 }
 ```
 
-#### Default <a name="default-hint"></a>
+#### Default
 By default, if there are no hints in the schema, such an array will show up as an `object` type in elasticsearch without any analysis.
 More about request options [Default query](#default-query)
 ```json
@@ -228,7 +202,7 @@ In elasticsearch this will look like:
                 },
 ```
 
-#### Flattened <a name="flattened-hint"></a>
+#### Flattened
 
 If the default behavior doesn't suit your needs, and you need to do searches, but you don't want to overcomplicate, `flattened` hint in schema may help.
 As you can see in this schema `FlattenedTest` array have `x-osdu-indexing` hint with `"type": "flattened"`.
@@ -281,7 +255,7 @@ In elasticsearch this will look like:
                 },
 ```
 
-#### Nested <a name="nested-hint"></a>
+#### Nested
 If you need maximum search capabilities a `nested` can suit your needs, this allows not only searching by properties of objects, but also taking advantage of their types.  
 Since the `nested` type treats all objects in the array as separate objects, it provides capabilities such as: 
 1. Search the array for a specific object that fully matches the search query.
@@ -387,9 +361,9 @@ In elasticsearch this will look like :
                 },
 ```
 
-## Queries <a name="query"></a>
+## Queries
 
-### Default <a name="default-query"></a>
+### Default
 Search queries for properties of `ObjectTest` cannot be executed, but it will return in response to other requests:
 
 ```
@@ -429,7 +403,7 @@ Response will be:
 }
 ```
 
-### Flattened queries <a name="flattened-query"></a>
+### Flattened queries
 Flattened type has its pros and cons, is easy to use for the end user, and the query syntax remains the same, but all properties in this type are "flattened", which means they are not treated as separate objects.
 Each property becomes a "leaf" of its parent index, and their types are ignored, properties treated as [keywords](https://www.elastic.co/guide/en/elasticsearch/reference/current/keyword.html).
 In short, this means that the benefits of the type cannot be used:
@@ -463,11 +437,11 @@ Query like:
 ```
 Will return such records, although `NumberTest` and `StringTest` doesn't relate to 1 specific object.
 
-### Nested queries <a name="nested-query"></a>
+### Nested queries
 Nested with advantages brings complexity, it has a serious impact on performance and produce separate documents e.g. 100 WellLog records with 100 Curves each will produce 100x100 documents under Elastic index.
 The nested query require the user to know the properties types, path, etc. due to their syntax.
 
-#### Nested query examples <a name="nested-query-examples"></a>
+#### Nested query examples
 
 The nested query has a special syntax, it must start with the key `nested`, then the `path` and the search property must be specified: 
 ```json
@@ -475,7 +449,7 @@ nested(<path>, (<property>:<value>))
 ```
 Brackets, commas, spaces are required. 
 
-##### Range query <a name="range-query-examples"></a>
+##### Range query
 ```json
 {
     "query":"nested(data.NestedTest, (NumberTest:(>1)))"
@@ -491,7 +465,7 @@ Brackets, commas, spaces are required.
     "query":"nested(data.NestedTest, (DateTimeTest:(>2019)))"
 }
 ```
-##### Text query <a name="text-query-examples"></a>
+##### Text query
 ```json
 {
     "query":"nested(data.NestedTest, (StringTest:(test*)))"
@@ -502,7 +476,7 @@ Brackets, commas, spaces are required.
     "query":"nested(data.NestedTest, (StringTest:\"test*\"))"
 }
 ```
-##### Combination with non-nested queries <a name="combination-query-examples"></a>
+##### Combination with non-nested queries
 Such combination will find record with specific objects in the array:
 ```json
 {
@@ -530,7 +504,7 @@ Nested can be combined with non-nested values in any order with operators `AND`
    "query": <nested> AND <not-nested> OR <nested> NOT <not-nested>....etc
 }
 ```
-##### Multilevel-Nested query <a name="multilevel-query-examples"></a>
+##### Multilevel-Nested query
 In example [schema](#indexing-hints) you may see that `NestedTest` contains another nested array of objects, those inner objects also can be found via search query:
 ```json
 {
@@ -543,12 +517,12 @@ nested(<root-path>, nested(<inner-path>, (<inner-property>:<value>)))
 ```
 Such query can also be combined with non-nested queries, other nested queries, etc. 
 
-### Sort <a name="sort"></a>
+### Sort
 
-#### Default <a name="default-sort"></a>
+#### Default
 Sorting by default array type is not possible, because elasticsearch is unaware about inner objects values.
 
-#### Flattened <a name="flattened-sort"></a>
+#### Flattened
 Flattened type can be used for sorting, since the elasticsearch `keyword` type is suitable for it, the syntax remains the same as for non-array properties :
 ```json
 {
@@ -565,7 +539,7 @@ Flattened type can be used for sorting, since the elasticsearch `keyword` type i
 ```
 More info at [fielddata](https://www.elastic.co/guide/en/elasticsearch/reference/7.8/fielddata.html)
 
-#### Nested <a name="nested-sort"></a>
+#### Nested
 Sorting by nested type is possible, but special syntax is required, similar to the syntax of nested queries:<br/>
 ```nested(path, field, mode)```<br/>
 It start with the keyword `nested` followed by `path` and `field`, `mode` attribute used to select which value of the nested field elasticsearch should sort by, possible values are:<br/>
@@ -633,12 +607,12 @@ Examples:
 ```
 More info at [nested-sorting](https://www.elastic.co/guide/en/elasticsearch/reference/7.8/sort-search-results.html#nested-sorting)
 
-### Aggregation <a name="aggregation"></a>
+### Aggregation
 
-#### Default <a name="default-aggregation"></a>
+#### Default
 Aggregation by default array type is not possible, because elasticsearch is unaware about inner objects values.
 
-#### Flattened <a name="flattened-aggregation"></a>
+#### Flattened
 Flattened type can be used for aggregation, the syntax remains the same:
 ```json
 {
@@ -662,7 +636,7 @@ Result:
     ],
 ```
 
-#### Nested <a name="nested-aggregation"></a>
+#### Nested
 Aggregation by nested array type possible, but a special syntax is required:
 ```
 nested(path, field)
@@ -695,7 +669,7 @@ Multilevel nested aggregation is also supported:
     "aggregateBy": "nested(data.NestedTest, nested(data.NestedTest.NestedInnerTest, NumberInnerTest))"
 }
 ```
-### Make an array of objects searchable  <a name="update-schema"></a>
+### Make an array of objects searchable
 
 It is possible that after defining the schema and loading the records, you realize that some array of object properties was introduced without the necessary hints in the schemas. 
 If they should be searchable but are currently not, this can be fixed in a few steps:
diff --git a/docs/tutorial/PolicyService-Integration.md b/docs/docs/PolicyService-Integration.md
similarity index 65%
rename from docs/tutorial/PolicyService-Integration.md
rename to docs/docs/PolicyService-Integration.md
index ba6fae5ec..dd3816fff 100644
--- a/docs/tutorial/PolicyService-Integration.md
+++ b/docs/docs/PolicyService-Integration.md
@@ -1,22 +1,24 @@
-Search service now supports data authorization checks via Policy service. Policy service allows dynamic policy evaluation on user requests and can be configured per partition.
+# Policy Service Integration
+
+Search service now supports data authorization checks via [Policy service](https://osdu.pages.opengroup.org/platform/security-and-compliance/policy/). Policy service allows dynamic policy evaluation on user requests and can be configured per data partition.
 
 Search service combines the user query with the Elasticsearch Query DSL translated from the evaluation policy in Policy service to do search in one operation against Elasticsearch index. CSP must opt-in to delegate data access to Policy Service.      
 
-Here are steps to enable Policy service for a provider:
+## Steps to enable Policy service for a provider:
 
-- Register policy for Search service, please look at policy service [documentation](https://community.opengroup.org/osdu/platform/security-and-compliance/policy#add-policy) for more details. The default evaluation policy("osdu.instance.search") in Policy service is based on the current data ACLs and the user groups.
+- Register policy for Search service, please look at policy service [documentation](https://osdu.pages.opengroup.org/platform/security-and-compliance/policy/) for more details. The default evaluation policy(data partition policy `osdu/partition/<data partition>/search.rego` or instance policy `osdu/instance/search.rego`) in Policy service is based on the current data ACLs and the user groups.
 
-- Add and provide values for following runtime configuration in `application.properties`
-  ```
+- Add and provide values for following runtime configuration in `application.properties`:
+```
   service.policy.enabled=true
   service.policy.id=${policy_id}
   service.policy.endpoint=${policy_service_endpoint}
   policy.cache.timeout=<timeout_in_minutes>
   PARTITION_API=${partition_service_endpoint}
-  ```
+```
 The policy id can be an instance based id (ie, osdu.instance.search) or partition based id (ie, osdu.partiton["%s"].search).
 
-### Known Limitation for Azure Http Header Size
+## Known Limitation for Azure Http Header Size
 
 In  Microsoft Azure, there is a limitation for the Http Header size in Azure. For more information, see: https://learn.microsoft.com/en-US/troubleshoot/developer/webapps/iis/www-administration-management/http-bad-request-response-kerberos#cause
 
@@ -32,8 +34,8 @@ This error body is translated as input query for ElasticSearch, which results in
 }
 ```
 
-#### Workaround
+### Workaround
 
-Delete any stale or test groups associated with the user via the Entitlements API, such that the number of data groups is within the limit of 2000. 
+Delete any stale or test groups associated with the user via the [Entitlements API](https://osdu.pages.opengroup.org/platform/security-and-compliance/entitlements/api/), such that the number of data groups is within the limit of 2000. 
 
-For more information, see: https://learn.microsoft.com/en-US/troubleshoot/developer/webapps/iis/www-administration-management/http-bad-request-response-kerberos#workaround-1-decrease-the-number-of-active-directory-groups
+For more information, see: https://learn.microsoft.com/en-US/troubleshoot/developer/webapps/iis/www-administration-management/http-bad-request-response-kerberos#workaround-1-decrease-the-number-of-active-directory-groups
\ No newline at end of file
diff --git a/docs/tutorial/PreviewFeatures.md b/docs/docs/PreviewFeatures.md
similarity index 92%
rename from docs/tutorial/PreviewFeatures.md
rename to docs/docs/PreviewFeatures.md
index 0c323b14f..d629434a8 100644
--- a/docs/tutorial/PreviewFeatures.md
+++ b/docs/docs/PreviewFeatures.md
@@ -1,7 +1,8 @@
+# Preview Features
 ## Phrase completion
 
 This feature is available on OSDU deployments with the autocomplete feature flag enabled
-and the bagOfWords feature enabled on the indexer service.
+and the `bagOfWords` feature enabled on the indexer service.
 
 By adding the json element **suggestPhrase** to the search query,
 users can retrieve phrase completions along with or instead of the results that may
@@ -44,4 +45,4 @@ Field attributes which have the indexing hint to be flattened will not appear
 in auto-complete suggestions.
 
 Same thing for all the meta attributes (e.g. kind, id, acls, tags etc.) as well,
-completion suggester won't return.
+completion suggester won't return.
\ No newline at end of file
diff --git a/docs/tutorial/SearchService.md b/docs/docs/api.md
similarity index 88%
rename from docs/tutorial/SearchService.md
rename to docs/docs/api.md
index 51b99fff9..a605a59ee 100644
--- a/docs/tutorial/SearchService.md
+++ b/docs/docs/api.md
@@ -1,63 +1,19 @@
-## Search service
-
-### Table of contents <a name="TOC"></a>
-
-- [Introduction](#introduction)
-- [Search API access](#search-api-access)
-- [Permissions](#permissions)
-- [Normalization](#normalization)
-- [Query API](#query)
-  - [Query by `kind`](#query-by-kind)
-  - [Additional `kind` attributes](#additional-kind-attributes)
-  - [`kind` case sensitivity](#kind-case-sensitivity)
-  - [Text queries](#text-queries)
-    - [Examples](#examples)
-    - [`text` field indexing](#text-field-indexing)
-    - [Exact match](#exact-match)
-    - [Query `null` or `empty` values](#query-null-values)
-    - [Exists query](#exists-query)
-    - [Reserved characters](#reserved-characters)
-    - [Wildcards](#wildcards)
-  - [Grouping](#grouping)
-  - [Date Format](#date-format)
-  - [Query `nested` arrays objects](#nested-queries)
-  - [Aggregation](#aggregate-queries)
-    - [Aggregation by `nested` arrays objects](#nested-aggregation)
-  - [Sort](#sort-queries)
-    - [Sort on `text` fields](#text-field-sort)
-    - [Sort on `nested` `text` fields](#nested-text-field-sort)
-  - [Range queries](#range-queries)
-  - [Geo-spatial queries](#geo-spatial-queries)
-    - [Geo distance](#geo-distance)
-      - [Distance units](#distance-units)
-    - [Bounding box](#bounding-box)
-    - [Geo polygon](#geo-polygon)
-    - [Geo polygon intersection query](#geo-polygon-intersection)
-- [Query with cursor API](#query-with-cursor)
-- [Cross `kind` queries](#cross-kind-queries)
-- [Common discovery within and across `kind` via `VirtualProperties`](#common-discovery-within-and-across-kind)
-- [Exclude kinds with authority as "system-meta-data" in wildcard query](#exclude-system-meta-data-kinds)
-- [Version info API](#version-info)
-- [Get indexing status](#get-indexing-status)
-- [Known issues/limitations](#known-limitations)
-
-## Introduction <a name="introduction"></a>
-
-The Search API provides a mechanism for indexing documents that contain structured data. You can search an index and organize and present search results. Documents and indexes are saved in a separate persistent store optimized for search operations. The Search API can index any number of documents.
-
-The API supports full-text search on string fields, range queries on dates, numeric or string fields, etc., along with geo-spatial search.
-
-[Back to table of contents](#TOC)
-
-## Search API access <a name="search-api-access"></a>
-
-- Required roles
-
-  The Search service requires that users have dedicated roles in order to use it. Users must be a member of `users.datalake.viewers`, `users.datalake.editors`, or `users.datalake.admins`. Roles can be assigned using the [Entitlements service](https://community.opengroup.org/osdu/platform/security-and-compliance/entitlements). Please look at the API documentation for specific requirements.
+# API
+## Search API access
+
+### Required roles
+
+  The Search service requires that users have dedicated roles in order to use it. Users must be a member of:
+
+  - `users.datalake.viewers`,
+  - `users.datalake.editors`, or 
+  - `users.datalake.admins`.
+
+  Roles can be assigned using the [Entitlements service](https://osdu.pages.opengroup.org/platform/security-and-compliance/entitlements/). Please look at the API documentation for specific requirements.
 
   In addition to service roles, users __must__ be a member of data groups to access the data.
 
-- Required headers
+### Required headers
 
   The OSDU Data Platform stores data in different partitions, depending on the different accounts in the OSDU system.
 
@@ -78,18 +34,14 @@ The API supports full-text search on string fields, range queries on dates, nume
 
 If the service is initiating the request, an ID should be generated. If the Correlation-Id is not provided, then a new ID will be generated by the service so that the request will be traceable.
 
-[Back to table of contents](#TOC)
-
-## Permissions <a name="permissions"></a>
+## Permissions
 
 | **Endpoint URL** | **Method** | **Minimum permissions required** | **Data permissions required** |
 | --- | --- | --- | --- |
 | /search/v2/query | POST | users.datalake.viewers | Yes |
 | /search/v2/query_with_cursor | POST | users.datalake.viewers | Yes |
 
-[Back to table of contents](#TOC)
-
-## Normalization <a name="normalization"></a>
+## Normalization
 
 Retrieved data from the OSDU Data Platform is normalized to a common standard that allows for comparison from multiple data sources. We currently support conversion for only Unit, CRS, and DateTime, whose common standards are in SI, WGS84, and UTC respectively.
 
@@ -99,7 +51,7 @@ For any attribute that has a [`AbstractSpatialLocation`](https://community.openg
 When enabled, search queries can use a range query on the FirstPoint X and Y coordinates (staring with release M22).
 
 
-The Indexer service uses Storage service's frame of reference conversion API (<code>/records:batch</code> API) for conversion. If the Storage API returns with a valid converted <code>WGS84Coordinates</code> for the <code>AsIngestedCoordinates</code>, then the converted coordinates will be indexed. If the conversion fails, then the Indexer will not index the shape in the <code>WGS84Coordinates</code> attribute. Indexer service will index conversion error for the record with `400` error code instead. Please refer to [Get indexing status](#get-indexing-status) for details on index status. Only the <code>WGS84Coordinates</code> are returned in the search response.
+The Indexer service uses [Storage service's](https://osdu.pages.opengroup.org/platform/system/storage/) frame of reference conversion API (<code>/records:batch</code> API) for conversion. If the Storage API returns with a valid converted <code>WGS84Coordinates</code> for the <code>AsIngestedCoordinates</code>, then the converted coordinates will be indexed. If the conversion fails, then the Indexer will not index the shape in the <code>WGS84Coordinates</code> attribute. Indexer service will index conversion error for the record with `400` error code instead. Please refer to [Get indexing status](#get-indexing-status) for details on index status. Only the <code>WGS84Coordinates</code> are returned in the search response.
 
 ### How conversion is handled for `AsIngestedCoordinates` and `WGS84Coordinates`:
 
@@ -109,9 +61,7 @@ The Indexer service uses Storage service's frame of reference conversion API (<c
 
 >__NOTE__: If a storage record has correct frame of reference conversion information (`meta` block), then records are <em>always</em> normalized and indexed according to common standard mentioned above. Users can only perform queries on Search service on standardized indexed records.
 
-[Back to table of contents](#TOC)
-
-## Query <a name="query"></a>
+## Query
 
 The OSDU Data Platform search provides a JSON-style domain-specific language that you can use to execute queries. The Query request URL and example follow:
 
@@ -214,30 +164,30 @@ Example response:
 }
 ```
 
-> __Note:__ : Once the records have been successfully ingested by the Storage service, it can take *at least 30 seconds* to become searchable via Search service in the OSDU Data Platform. Record level indexing status can be retrieved via [index status](#get-indexing-status).
+> __Note:__ : Once the records have been successfully ingested by the [Storage service](https://osdu.pages.opengroup.org/platform/system/storage/), it can take *at least 30 seconds* to become searchable via Search service in the OSDU Data Platform. Record level indexing status can be retrieved via [index status](#get-indexing-status).
 
-### Parameters <a name="parameters"></a>
+### Parameters
 
 | Parameter | Description |
 | :--- | :--- |
-| kind | The kind of records to query. kind is unique identifier (or a tag) given to the schema. Kind is case-insensitive. For details about the schema, refer to [Schema Service](https://community.opengroup.org/osdu/platform/system/schema-service). In the query, kind is a __required__ field, and its value can be a single schema identity or a list of schema identities, such as `"osdu:wks:master-data--Well:1.0.0"` or `["osdu:wks:master-data--Well:1.0.0", "osdu:wks:master-data--Wellbore:1.0.0"]`. |
+| kind | The kind of records to query. kind is unique identifier (or a tag) given to the schema. Kind is case-insensitive. For details about the schema, refer to [Schema Service](https://osdu.pages.opengroup.org/platform/system/schema-service/). In the query, kind is a __required__ field, and its value can be a single schema identity or a list of schema identities, such as `"osdu:wks:master-data--Well:1.0.0"` or `["osdu:wks:master-data--Well:1.0.0", "osdu:wks:master-data--Wellbore:1.0.0"]`. |
 | query | The Query string is based on Lucene query string syntax, supplemented with a specific format for describing queries to fields of object arrays indexed with the `nested` hint. The maximum number of clauses on a query can be __1024__.|
 | offset | The starting offset from which to return results. |
 | limit | The maximum number of results to return from the given offset. If no limit is provided, then it returns __10__ items. The minimum & maximum number of items that the query can fetch are __1__ & __1000__ respectively. (If you wish to fetch a larger set of items, use the [query_with_cursor](#query-with-cursor) API). |
-| sort | Allows you to add one or more sorts on specific fields. The length of fields and the length of order must match. The order value must be either ASC or DESC (case insensitive). For more details and limitations about this feature, refer to [Sort](#sort-queries). |
+| sort | Allows you to add one or more sorts on specific fields. The length of fields and the length of order must match. The order value must be either ASC or DESC (case insensitive). For more details and limitations about this feature, refer to [Sort](#sort). |
 | queryAsOwner | If true, the result only contains the records that the user owns. If false, the result contains all records that the user is entitled to see. The default value is false. | 
 | spatialFilter | A spatial filter to apply. See [Geo-spatial queries](#geo-spatial-queries) for details. |
 | trackTotalCount | Tracks the accurate record count matching the query if 'true'; otherwise it is a partial count. Partial count queries are more performant. The default is 'false' and returns 10000 if matching records are higher than 10000. |
-| aggregateBy | Allows you to get a unique value of a given field, see [Aggregate Queries](#aggregate-queries) for details. |
+| aggregateBy | Allows you to get a unique value of a given field, see [Aggregate Queries](#aggregation)
 | returnedFields | Specifies the fields on which to project the results. |
 
 __Important:__ Field names in request parameters are case-sensitive. Field values are case-insensitive, unless you are querying for  an [exact match](#exact-match) with a `keyword` subfield for the attribute.
 
 __Note:__ The Offset + Limit can not be more than 10,000. See the [Query with cursor](#query-with-cursor) topic for more efficient ways to do deep scrolling.
 
-### Query by kind <a name="query-by-kind"></a>
+### Query by kind
 
-`kind` can be formatted as authority/data-partition-id:data-source-id:entity-type:schema-version and a __required__ field. You can retrieve the available list of `kind` by using the Storage service(GET /query/kinds API). Users can make search documents by providing `kind` as shown:
+`kind` can be formatted as authority/data-partition-id:data-source-id:entity-type:schema-version and a __required__ field. You can retrieve the available list of `kind` by using the [Storage service](https://osdu.pages.opengroup.org/platform/system/storage/api/#query)(`GET /query/kinds API`). Users can make search documents by providing `kind` as shown:
 
 * Search documents just by providing a single `kind`:
 
@@ -293,7 +243,7 @@ The query returns up to 10 (default limit) documents for the `kind`.
 
 Wildcard queries on `kind` are also supported, refer to [Cross `kind` queries](#cross-kind-queries) for more information.
 
-### Additional `kind` attributes <a name="additional-kind-attributes"></a>
+### Additional `kind` attributes
 
 The OSDU Data Platform indexer splits `kind` value and add few new fields (`authority`, `source`, `namespace` & `type`) on indexed record. These terms can then be queried with the `query` request parameter.
 
@@ -310,7 +260,7 @@ For example `osdu:wks:master-data--Wellbore:1.0.0` will add following new indexe
 
 The OSDU Data Platform can be now queried to search based on one of these attributes.
 
-### `kind` case sensitivity <a name="kind-case-sensitivity"></a>
+### `kind` case sensitivity
 
 Search does not differentiate `kind` request parameter case sensitivity while querying records across kinds differing in case.
 
@@ -323,7 +273,7 @@ POST /search/v2/query HTTP/1.1
 }
 ```
 
-### Text queries <a name="text-queries"></a>
+### Text queries
 
 The OSDU Data Platform provides comprehensive query options in [Lucene query syntax](https://lucene.apache.org/core/2_9_4/queryparsersyntax.html). The query string is parsed into a series of terms and operators. A term can be a single word, such as "producing" or "well", or a phrase, surrounded by double quotes, such as "producing well", which searches for all the words in the phrase, in the same order. The default operator for the query is __OR__.
 
@@ -333,7 +283,7 @@ The query language is quite comprehensive and can be intimidating at first glanc
 
 __Note:__ __`kind`__ is a required parameter and is omitted for brevity in following examples. Also, all storage record properties are in `data` block. Any reference to a field inside the block should be prefixed with `data`.
 
-#### Examples <a name="examples"></a>
+#### Examples
 
 - Search all fields that contain the text 'well':
 
@@ -387,7 +337,7 @@ The Search service offers additional query patterns to query `precise` values. F
 }
 ```
 
-#### `text` field indexing <a name="text-field-indexing"></a>
+#### `text` field indexing
 
 By default, search back-end server analyzes the values of `text` fields & `text` array fields (including `text` fields with `nested` `x-osdu-indexing` hints) during indexing. The Indexer service analyzer changes text field values as follows:
 
@@ -401,7 +351,7 @@ __Note 1:__ The `keyword` and `keywordLower` field value can have a maximum of 2
 
 __Note 2__: `text` array fields indexed with `flattened` indexing hint are non-analyzed during indexing by default and do not require `keyword` subfield. Exact match, aggregations and sort queries on such fields do not require `keyword` suffix.
 
-#### Exact match <a name="exact-match"></a>
+#### Exact match
 
 Use the exact match query to search records based on a `precise` value using `keyword` subfield mentioned [here](#text-field-indexing), such as well ID, name, etc. on `text` fields.
 
@@ -423,7 +373,7 @@ The `keywordLower` (OSDU Data Platform deployment with keywordLower feature enab
 }
 ```
 
-#### Query `null` or empty values <a name="query-null-values"></a>
+#### Query `null` or empty values
 
 `text` field's `keyword` subfield can also be utilized to query records by `null` or empty value on `text` attributes. `null` value search/index workflows are only supported on `text` fields.
 
@@ -445,7 +395,7 @@ Here is an example query to search `empty` value:
 }
 ```
 
-#### Exists query <a name="exists-query"></a>
+#### Exists query
 
 Returns documents that contain an indexed value for a field. Use the \_exists\_ prefix for a field to search to see if the field exists.
 
@@ -466,7 +416,7 @@ Example request:
 }
 ```
 
-#### Reserved characters <a name="reserved-characters"></a>
+#### Reserved characters
 
 If you need to use any of the characters which function as operators in your query itself (and not as operators), then you must escape them with a leading backslash. For example, to search for (1+1)=2, you would need to write your query as \\(1\\+1\\)\\=2.
 
@@ -476,7 +426,7 @@ Failing to escape these special characters correctly could lead to a syntax erro
 
 __Note:__ < and > can’t be escaped at all. The only way to prevent them from attempting to create a [range query](#range-queries) is to remove them from the query string entirely.
 
-#### Wildcards <a name="wildcards"></a>
+#### Wildcards
 
 Wildcard searches can be run on individual terms using ? to replace a single character and * to replace zero or more characters.
 
@@ -490,9 +440,7 @@ Be aware that wildcard queries can use an enormous amount of memory and therefor
 
 __Note:__ Leading wildcards are disabled by the OSDU Data Platform Search service. Allowing a wildcard at the beginning of a word, such as "*ean", is particularly heavy because all the terms in the index need to be examined, just in case they match.
 
-[Back to table of contents](#TOC)
-
-### Grouping <a name="grouping"></a>
+### Grouping
 
 Multiple terms or clauses can be grouped together with parentheses to form sub-queries.
 
@@ -502,9 +450,7 @@ Multiple terms or clauses can be grouped together with parentheses to form sub-q
 }
 ```
 
-[Back to table of contents](#TOC)
-
-### Date Format <a name="date-format"></a>
+### Date Format
 
 If you need to use the date in your query, it must be in one of the following formats:
 
@@ -537,9 +483,7 @@ If you need to use the date in your query, it must be in one of the following fo
 
 For more information, refer to [Date format](http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateOptionalTimeParser--).
 
-[Back to table of contents](#TOC)
-
-## Query `nested` arrays objects <a name="nested-queries"></a>
+## Query `nested` arrays objects
 
 Starting with OSDU's [M6 release](https://community.opengroup.org/osdu/governance/project-management-committee/-/wikis/M6-Release-Notes), you can set `nested` hints in a data scheme's object array nodes. It leads to accurate indexing of those arrays objects in the underlying search backend.
 
@@ -643,7 +587,7 @@ We can combine both types of queries in one request, such as in the following ex
 
 __Note__: Supported boolean operators for `nested` queries are `AND`, `OR`, `NOT`. These operators are case-sensitives.
 
-#### Filtering using grouping with nested syntax <a name="groupnested"></a>
+#### Filtering using grouping with nested syntax
 
 The nested query parser throws an exception if using a grouping with nested syntax due to the current nested query parser. As a workaround, you can rewrite the query so that it does not involve grouping.
 
@@ -689,9 +633,7 @@ Use:
 }
 ```
 
-[Back to table of contents](#TOC)
-
-## Aggregation <a name="aggregate-queries"></a>
+## Aggregation
 
 Allows user to get the unique value of a field specified by the `aggregateBy` request parameter. It supports `text`, `numeric`, and `boolean` fields. A maximum of `1000` unique values can be returned by this request.
 
@@ -749,9 +691,9 @@ Example Response:
 }
 ```
 
-Please see [Aggregation by `nested` arrays objects](#nested-aggregation) & [Aggregation on `text` fields](#text-field-aggregation) sections for more details on aggregations.
+Please see [Aggregation by `nested` arrays objects](#aggregation-by-nested-arrays-objects) & [Aggregation on `text` fields](#aggregation-on-text-fields) sections for more details on aggregations.
 
-### Aggregation by `nested` arrays objects <a name="nested-aggregation"></a>
+### Aggregation by `nested` arrays objects
 
 `nested` attributes can be aggregated by using the `nested(<path-to-root-nested-array-node>, <root-nested-array-object-fields-query>)` function.
 
@@ -762,7 +704,7 @@ Please see [Aggregation by `nested` arrays objects](#nested-aggregation) & [Aggr
 }
 ```
 
-### Aggregation on `text` fields <a name="text-field-aggregation"></a>
+### Aggregation on `text` fields
 
 As mentioned on [`text` field indexing](#text-field-indexing) section, a non-analyzed subfield is added on each `text` field (including fields decorated with `nested` indexing hints on schema) to enable aggregations workflow. This can be utilized to perform aggregation query on `text` fields.
 
@@ -794,8 +736,6 @@ Fields decorated with `flattened` indexing hints on schema are by default non-an
 
 __Caution__: `aggregations` on response may be empty if correct field is not supplied on aggregation query e.g. missing `keyword` suffix on a `text` field inside `data` block etc.
 
-[Back to table of contents](#TOC)
-
 ## Highlight
 
 Specifying optional field `highlightedFields` will add to each result additional dictionary under key `highlight` with phrases from selected fields which matched the query.
@@ -861,9 +801,7 @@ Search response:
 }
 ```
 
-[Back to table of contents](#TOC)
-
-## Sort <a name="sort-queries"></a>
+## Sort
 
 The sort query allows you to add one or more sorts on specific fields. Each sort can be reversed as well.
 
@@ -909,13 +847,13 @@ curl --request POST \
 
 </details><br> 
 
-The above request payload asks the Search service to sort on `data.Id` in an ascending order, and the expected response will have "totalCount: 10" instead of 20. Note that the 10 returned records are only from `opendes:welldb:wellbore:1.0.0` because the `data.Id` in `opendes:welldb:well:1.0.0` is of data type `text` will not be returned (see [Sort on `text` fields](#text-field-sort) for details), and it should list the 5 records which have an empty `data.Id` value at last.
+The above request payload asks the Search service to sort on `data.Id` in an ascending order, and the expected response will have "totalCount: 10" instead of 20. Note that the 10 returned records are only from `opendes:welldb:wellbore:1.0.0` because the `data.Id` in `opendes:welldb:well:1.0.0` is of data type `text` will not be returned (see [Sort on `text` fields](#sort-on-text-fields) for details), and it should list the 5 records which have an empty `data.Id` value at last.
 
 __Note:__ The Search service does not validate the provided sort field, whether it exists or is of the supported data types. Different kinds may have attributes with the same names, but are different data types. Therefore, it is user's responsibility to be aware and validate this in their own workflow.
 
 The sort query could be very expensive, especially if the given `kind` is too broad, such as `"kind": "*:*:*:*"`. The current time-out threshold is 60 seconds. A 504 error, "Request timed out after waiting for 1m" will be returned if the request times out. Consider making the `kind` parameter as narrow as possible while using the sort feature.
 
-### Sort on `text` fields <a name="text-field-sort"></a>
+### Sort on `text` fields
 
 As mentioned on [`text` field indexing](#text-field-indexing) section, a non-analyzed subfield is added on each `text` field to enable sort workflow. This can be utilized to perform sort query on `text` fields.
 
@@ -952,7 +890,7 @@ curl --request POST \
 ```
 </details><br> 
 
-### Sort on `nested` `text` fields <a name="nested-text-field-sort"></a>
+### Sort on `nested` `text` fields
 
 Sorting on `text` field decorated with `nested` indexing hints requires following syntax:
 
@@ -1011,11 +949,9 @@ curl --request POST \
 ```
 </details><br> 
 
-Please take a look at `nested` sort [documentation](https://community.opengroup.org/osdu/platform/system/search-service/-/blob/master/docs/tutorial/ArrayOfObjects.md#sort) for more details & examples.
-
-[Back to table of contents](#TOC)
+Please take a look at `nested` sort [documentation](ArrayOfObjects.md#sort) for more details & examples.
 
-## Range queries <a name="range-queries"></a>
+## Range queries
 
 Ranges can be specified for `date`, `numeric`, or `text` fields. Inclusive ranges are specified with square brackets `[min TO max]` and exclusive ranges with curly brackets `{min TO max}`. Here are some of the examples:
 
@@ -1067,19 +1003,17 @@ Ranges can be specified for `date`, `numeric`, or `text` fields. Inclusive range
 }
 ```
 
-[Back to table of contents](#TOC)
-
-## Geo-spatial queries <a name="geo-spatial-queries"></a>
+## Geo-spatial queries
 
 The OSDU Data Platform supports geo-point (lat/lon pairs) & geo-shape based on [GeoJson standard](https://www.rfc-editor.org/rfc/rfc7946). The `spatialFilter` and `query` groups in the request have an AND relationship. If both of the criteria are defined in the query, then the Search service will return results which match both clauses.
 
-The queries in this group are [Geo distance](#geo-distance), [Geo polygon](#geo-polygon), and [Bounding box](#bounding-box). Only __one__ spatial criteria can be used while defining the filter.
+The queries in this group are [Geo distance](#geo-distance-query), [Geo polygon](#geo-polygon-query), and [Bounding box](#bounding-box-query). Only __one__ spatial criteria can be used while defining the filter.
 
 __Note 1:__ Geo-spatial fields, which are indexed with GeoJSON FeatureCollection payload, in the Search service query response have a different structure compared to storage records and are optimized for search use-case. These are no valid GeoJSON. To retrieve a valid GeoJSON, use the Storage service's record API.
 
 __Note 2:__ Search backend requires all geo-shape to be [GeoJSON](http://geojson.org/) and [OGC](https://www.ogc.org/standard/sfa/) standard complaint. User may see indexing issues if geo-shapes are not complaint. Most common issue violating these standards are geo-shapes with duplicate coordinates or self-intersecting polygon etc. Once users have retrieved record level indexing status or error message via [index status](#get-indexing-status), they are expected to fix the geo-shape and re-try ingestion to address such issues.
 
-### Geo distance query <a name="geo-distance"></a>
+### Geo distance query
 
 Filters documents that include only hits that exist *within* a specific distance from a geo point.
 
@@ -1137,13 +1071,13 @@ curl --request POST \
 | point.latitude | Latitude of field. |
 | point.longitude | Longitude of field. |
 
-### Distance units <a name="distance-units"></a>
+### Distance units
 
 If no unit is specified, then the default unit of the distance parameter is meter. Distance can be specified in other units, such as "1km" or "2mi" (2 miles).
 
 __Note:__ In the current version, the Search API only supports distance in meters. In future versions, distance in other units will be made available. The maximum value of distance is 1.5E308.
 
-### Bounding box query <a name="bounding-box"></a>
+### Bounding box query
 
 A query allowing you to filter hits based on a point location *within* a bounding box.
 
@@ -1208,7 +1142,7 @@ curl --request POST \
 | bottomRight.latitude | The latitude of bottom right corner of bounding box. |
 | bottomRight.longitude | The longitude of bottom right corner of bounding box. |
 
-### Geo polygon query <a name="geo-polygon"></a>
+### Geo polygon query
 
 A query allowing you to filter hits that only fall *within* a closed polygon.
 
@@ -1268,7 +1202,7 @@ curl --request POST \
 | field | The `geo-point` or `geo-shape` field in the index on which filtering will be performed. |
 | points | The list of `geo-point` describing polygon. |
 
-### Geo polygon intersection query <a name="geo-polygon-intersection"></a>
+### Geo polygon intersection query
 
 A query allowing you to filter hits *intersecting* a closed polygon.
 
@@ -1337,9 +1271,7 @@ curl --request POST \
 | field | The `geo-point` or `geo-shape` field in the index on which filtering will be performed. |
 | points | The list of `geo-point` describing polygon. |
 
-[Back to table of contents](#TOC)
-
-## Phrase completion (autocomplete) preview <a name="autocomplete"></a>
+## Phrase completion (autocomplete) preview
 
 Feature available on OSDU deployments with autocomplete feature flag enabled and bagOfWords indexer feature enabled. 
 Users can retrieve phrase completions along with or instead of the results that may help them build more accurate queries.
@@ -1365,7 +1297,7 @@ Response:
 
 ```
 
-## Query with cursor <a name="query-with-cursor"></a>
+## Query with cursor
 
 While a search request returns a single `page` of results, the `query_with_cursor` API can be used to retrieve large numbers of results, or even all results, from a single search request, in much the same way as you would use a cursor on a traditional database.
 
@@ -1463,9 +1395,7 @@ __Caution:__ As next batches of results are retrieved by the `query_with_cursor`
 
 __Note:__ To process the next `query_with_cursor` request, the Search service keeps the search context alive for 1 minute, which is the time required to process the next batch of results. Each cursor request sets a new expiry time. The cursor will expire after 1 minute and will not return any more results if the requests are not made within the specified time.
 
-[Back to table of contents](#TOC)
-
-## Cross `kind` queries <a name="cross-kind-queries"></a>
+## Cross `kind` queries
 
 The OSDU Data Platform search supports cross `kind` queries. A typical `kind` can be formatted as authority/data-partition-id:data-source-id:entity-type:schema-version. Each text partitioned by ':' can be replaced with wildcard characters to support cross `kind` search.
 
@@ -1544,9 +1474,7 @@ curl --request POST \
 
 </details><br> 
 
-[Back to table of contents](#TOC)
-
-## Common discovery within and across `kind` via `VirtualProperties` <a name="common-discovery-within-and-across-kind"></a>
+## Common discovery within and across `kind` via `VirtualProperties`
 
 A single schema can define multiple properties for geo-spatial data. For example `Wellbore` schema defines both the `GeographicBottomHoleLocation` and `ProjectedBottomHoleLocation` properties. The json key used for spatial data is also not consistent across schemas.
 
@@ -1609,9 +1537,7 @@ More information on supported default VirtualProperties can be found on [Data de
 
 __Note:__ The virtual property declared is never added to the Storage record and used by Indexer service to index new attribute and make the data discoverable based on this property.
 
-[Back to table of contents](#TOC)
-
-## Exclude kinds with authority as `system-meta-data` in wildcard query <a name="exclude-system-meta-data-kinds"></a>
+## Exclude kinds with authority as `system-meta-data` in wildcard query
 Some applications or systems may need to have its system meta-data searchable via OSDU search but 
 the system meta-data are not expected to be included in the search results of normal keyword search. In order to 
 exclude the system meta-data in normal search, OSDU community proposed "system-meta-data" as the reserved authority 
@@ -1641,9 +1567,7 @@ References to OSDU data-definitions documents:
 - [Appendix D.1.3 Schema Identifier `kind` Limitations](https://community.opengroup.org/osdu/data/data-definitions/-/blob/master/Guides/Chapters/93-OSDU-Schemas.md#appendix-d13-schema-identifier-kind-limitations)
 
 
-[Back to table of contents](#TOC)
-
-## Version info API <a name="version-info"></a>
+## Version info API
 
 Provides build and git related information for Search service.
 
@@ -1692,9 +1616,7 @@ This endpoint takes information from files generated by `spring-boot-maven-plugi
 - `version.info.buildPropertiesPath`
 - `version.info.gitPropertiesPath`
 
-[Back to table of contents](#TOC)
-
-## Get indexing status <a name="get-indexing-status"></a>
+## Get indexing status
 
 The Indexer service adds internal metadata to each record which registers the status of the indexing. The metadata includes the status and the last indexing date and time. This additional meta block helps to see the details of indexing. The format of the index meta block is as follows:
 
@@ -1771,15 +1693,13 @@ __Note__: By default, the API response excludes the `index` attribute block. You
 
 The above query returns all records which had problems due to fields mismatch.
 
-[Back to table of contents](#TOC)
-
-## Known issues/limitations <a name="known-limitations"></a>
+## Known issues/limitations
 
 ### `nested` query
 
 - The following features are not functional with the current `nested` implementation:
   - The `nested` fields sort query filter can now be only attached to top level nested field. Lack of control of attachment level may impact some rare use cases on structures nested multiple times, however this would require completely new different syntax that is very hard to understand.
-  - The current nested query parser throws an exception if using a grouping with nested syntax due to the current nested query parser. As a workaround, you can rewrite the query so that it does not involve grouping. An example can be found [here](#groupnested).
+  - The current nested query parser throws an exception if using a grouping with nested syntax due to the current nested query parser. As a workaround, you can rewrite the query so that it does not involve grouping. An example can be found [here](#grouping).
 
 ### Cursor query
 
@@ -1788,5 +1708,3 @@ The above query returns all records which had problems due to fields mismatch.
 ### All queries
 
 - The maximum size of the response is `100MB`. If the response size exceeds `100MB`, a `413` status code response will be returned without any search results.
-
-[Back to table of contents](#TOC)
diff --git a/docs/auditlogs.md b/docs/docs/auditlogs.md
similarity index 63%
rename from docs/auditlogs.md
rename to docs/docs/auditlogs.md
index a98367fd1..b1124ff08 100644
--- a/docs/auditlogs.md
+++ b/docs/docs/auditlogs.md
@@ -1,17 +1,5 @@
-Copyright 2017-2019, Schlumberger
+# Search Service Audit Logs
 
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-# Search service audit logs
 This document presents the expected audit logs for each of API in Search service. __One and only one__ audit log is expected per request.
 It is important to note audit logs __must not__ include technical information such as response codes, exceptions, stack trace, etc. 
 
diff --git a/docs/docs/index.md b/docs/docs/index.md
new file mode 100644
index 000000000..53ceb4aeb
--- /dev/null
+++ b/docs/docs/index.md
@@ -0,0 +1,10 @@
+# Search service
+## Introduction
+
+The Search API provides a mechanism for searching indexes.
+
+[Indexer service](https://osdu.pages.opengroup.org/platform/system/indexer-service/) provides a mechanism for indexing documents that contain structured data. Documents and indexes are saved in a separate persistent store optimized for search operations. It can index any number of documents.
+Once indexed, you can search an index, organize and present search results via [Search Service API](api.md). It provides rich query capabilities on indexed data.
+
+
+The [Search Service API](api.md) supports full-text search on string fields, range queries on dates, numeric or string fields, etc., along with geo-spatial search.
\ No newline at end of file
diff --git a/docs/setup.md b/docs/docs/running.md
similarity index 52%
rename from docs/setup.md
rename to docs/docs/running.md
index cb09a1207..3e4ac8edb 100644
--- a/docs/setup.md
+++ b/docs/docs/running.md
@@ -1,16 +1,19 @@
-Copyright 2017-2019, Schlumberger
+# Running Search Service
 
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
+The Search Service is a Maven multi-module project with each cloud implementation placed in its submodule.
 
-     http://www.apache.org/licenses/LICENSE-2.0
+## AWS
 
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
+Instructions for running the AWS implementation can be found [here](https://community.opengroup.org/osdu/platform/system/search-service/-/blob/master/provider/search-aws/README.md).
+
+## Azure
+
+Instructions for running the Azure implementation can be found [here](https://community.opengroup.org/osdu/platform/system/search-service/-/blob/master/provider/search-azure/README.md).
+
+
+## Google
+
+Instructions for running the Google implementation can be found [here](https://community.opengroup.org/osdu/platform/system/search-service/-/tree/master/provider/search-gc).
 
 ## BYOC Environment Setup
 Checkout the code and perform the following actions: 
@@ -40,4 +43,4 @@ If you search for
   "kind": "common:ihs:well:1.0.0"
 }
 ```
-you will get a 404 which means there is no data found for that kind. 
+you will get a 404 which means there is no data found for that kind. 
\ No newline at end of file
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
new file mode 100644
index 000000000..dec368e1f
--- /dev/null
+++ b/docs/mkdocs.yml
@@ -0,0 +1,45 @@
+site_name: OSDU Search Service Documentation
+site_description: OSDU Search Service
+site_author: Shane Hutchins
+
+# Repository
+repo_url: https://community.opengroup.org/osdu/platform/system/search-service
+repo_name: Search
+
+# Copyright
+copyright: Copyright &copy; 2024 Open Subsurface Data Universe Software
+
+theme:
+  name: material
+  palette:
+    - scheme: default
+      primary: indigo
+      accent: indigo
+      toggle:
+        icon: material/brightness-7
+        name: Switch to dark mode
+    - scheme: slate
+      primary: indigo
+      accent: indigo
+      toggle:
+        icon: material/brightness-4
+        name: Switch to light mode
+  font:
+    text: Roboto
+    code: Roboto Mono
+
+markdown_extensions:
+  - admonition
+  - sane_lists
+
+plugins:
+  - search
+  - git-revision-date
+
+#nav:
+#  - OSDU Legal (Compliance) Service: 'index.md'
+#  - Ingestion Workflow: 'ingestion.md'
+#  - API: 'api.md'
+#  - Configuration:
+#      - Allow Data Ingestion from Specific Country of Origin: 'AllowDataIngestionFromCertainCOO.md'
+#      - Feature Flags: 'features.md'
diff --git a/publish.yml b/publish.yml
new file mode 100644
index 000000000..43510ace1
--- /dev/null
+++ b/publish.yml
@@ -0,0 +1,30 @@
+run-test-pages:
+  stage: build
+  image: python:latest
+  script:
+    - cd docs
+    - pip install mkdocs-material
+    - pip install mkdocs-git-revision-date-plugin
+    - mkdocs build --site-dir ../test
+  allow_failure: true
+  artifacts:
+    paths:
+    - test
+  when: manual
+
+pages:
+  stage: publish
+  image: python:latest
+  tags: ["osdu-medium"]
+  script:
+    - cd docs
+    - pip install --default-timeout=1000 mkdocs-material
+    - pip install mkdocs-git-revision-date-plugin
+    - mkdocs build --site-dir ../public
+  allow_failure: true
+  needs: []
+  artifacts:
+    paths:
+      - public
+#  rules:
+#    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
\ No newline at end of file
-- 
GitLab