- 24 May 2023
-
DarkLight
-
PDF
Search API
- Updated on 24 May 2023
-
DarkLight
-
PDF
The Search API provides a simple way to search the MongoDB databases long as your data is properly exposed to the Itential Automation Platform (IAP) search engine. This guide explains how to set indexes and expose your data collections with search objects.
Note: Only use this guide to modify custom applications. Do not modify or update the Pronghorn (Itential) applications.
Exposing an Application for Searching
A database collection may be searched if the collection is exposed with a search object. This search object is added to the pronghorn.json
file and consists of an object, or an array of objects, that follow the schema below.
Search Object Attributes
Attribute | Description |
---|---|
Label | The name of the application that is used when displaying search results. For example: "Mop Template" or "Workflow". |
Collection | The name of the collection to search. |
Fields | An array of objects containing fields to search. Name: The field name to search. Type: The type of data. Only type "string" is supported. |
Map | An object that will format the returned data in a specific way. Name: A field name reference. For example, if the title field is exposed to being searched, set the value to "title" to return the title value as the name for each result. Description: A field name reference. Can be null, as many database results will not have a description. URL: The absolute path used for users to access the content they have found. Uses a mustache template system; therefore, field values are available as variables using the mustache syntax {{variable}}. In addition to your exposed field values, you also have access to the mongo_id field . |
Examples
Use the following examples to set the search template and search exposure object.
Empty Search Template
// Place this in pronghorn.json.
"search": {
"label": "YOUR APP NAME",
"collection": "DATABASE COLLECTION NAME",
"fields": [
{
"name": "FIELD TITLE",
"type": "FIELD TYPE (only "string" supported currently)"
}
],
"map": {
"name": "FIELD REFERENCE NAME",
"description": "FIELD REFERENCE NAME (can be null or empty)",
"url": "/myapp/{{EXAMPLE_VAR}}?myvar={{EXAMPLE_VAR}}"
}
},
Search Exposure Object
"search": {
"label": "Mop",
"collection": "mop_templates",
"fields": [
{
"name": "name",
"type": "string"
}
],
"map": {
"name": "name",
"description": null,
"url": "/mop/template?name={{name}}"
}
},
Text Only - Currently, you can only search on text-based fields ("type": "string"). Other types may be supported in the future.
Create Index for Exposed Collections
You will need to create the proper indexes for your fields to be search enabled. For MongoDB, simple compound indexes are used. You list each field name followed by the number 1 as the field value. For more detailed information on creating indexes, refer to: MongoDB Method Reference db.collection.createIndex()
.
Index Must Match Fields - The compound index must match the fields in the search template. For example, if you want to search on name and type, you must have a compound index on name and type.
To create an index against a local instance for testing:
-
Run the following command in a MongoDB collection browser. This example creates an index on the MOP templates collection for
name
. This index will persist to the local database, but if it is dropped it will need to be recreated.db.getCollection('mop_templates').createIndex({ "name": 1 }, { background: true });
Note: Be careful when setting indexes and exposing items to search. If done incorrectly, it can have a profound negative impact. To avoid potential issues, adhere to the following guidelines.
- Be careful not to create too many indexes! Too many indexes will slow down inserts into the database, which is not good.
- Always verify
background
is set totrue
when creating indexes. This supports performance at scale. - Test the addition of search objects in a lab environment to monitor performance before they are released into production.
Making a Search Request
The following attributes are used to make a search request.
Search API Endpoint | POST | /search/find |
---|---|---|
POST Body | The post object consists of a data object with a text property that contains the value to search on. |
Examples
Use the following examples to set your search object.
Empty Request
Here is an empty request example.
{
"data": {
"text": "TEXT TO SEARCH ON"
}
}
Search Object
Here is an example search object, searching on the word workflow.
{
"data": {
"text": "workflow"
}
}
Search Results
The results that are returned follow the map object that was configured above, with the addition of the _id and tags fields. You can now display these results to the user, allowing them to find and navigate to content throughout the system.
{
"results": [
{
"label": "Mop",
"type": "mop_templates",
"results": [
{
"_id": "workflow helper",
"name": "workflow helper",
"description": "",
"url": "/mop/template?name=workflow%20helper",
"tags": [
{
"_id": "5c37ada0788ede01a2b62b47",
"name": "Awesome",
"description": "Sauce"
}
]
},
{
"_id": "workflow helper two",
"name": "workflow helper two",
"description": "",
"url": "/mop/template?name=workflow%20helper%20two",
"tags": []
}
],
"count": 2
},
{
"label": "Workflows",
"type": "workflows",
"results": [
{
"_id": "51fdc757-076a-41d6-9e51-bf7856aabb28",
"name": "Delay Workflow",
"description": "",
"url": "/workflow_builder/edit?name=Delay%20Workflow",
"tags": []
},
{
"_id": "b087eecc-15ab-490c-b592-42194c24584f",
"name": "Workflow Form",
"description": "",
"url": "/workflow_builder/edit?name=Workflow%20Form",
"tags": [
{
"_id": "5c35161afc3301a3d4c9505e",
"name": "Stage One",
"description": "Stage one related details"
},
{
"_id": "5c351628fc3301a3d4c9505f",
"name": "Stage Two",
"description": "Stage two related details"
}
]
}
],
"count": 2
}
],
"totalCount": 4
}
Top Level Result
Below are attributes for the top level fields of the example search result.
Field | Type | Value |
---|---|---|
results |
Array | An array of search results grouped by collection type. |
totalCount |
Number | Total count of all results. |
Result Group
The attributes of the result group are outlined in the table below.
Field | Type | Value |
---|---|---|
Label | String | Display name. |
Type | String | Collection name. |
Results | Array | Array of results. |
Count | Number | Total results count for this group. |
Individual Search Result Value
The field values for the individual results in the example are presented in the table below.
Field | Type | Value |
---|---|---|
_id |
String | The id of the search result. |
Name | String | Name of the result. |
Description | String | Description of the result. |
URL | String | URL path to access content. |
Tags | Array | List of tags for each result. |
Currently Supported Itential Applications
The following Itential applications already have search objects and indexes on the following fields.
Application | Search Enabled Fields |
---|---|
Workflow | Name |
Mop Templates | Name |
Forms | Name |
Golden Config | Name |
Additional Information
Currently, the Search REST API is only used by the site-wide search box that is available in the top navigation bar. You can, however, use the results in your own application, if needed.