GlideSPSearchAnalytics - Global
- UpdatedAug 1, 2024
- 6 minutes to read
- Xanadu
- API reference
The GlideSPSearchAnalytics API provides methods to generate search analytics from custom ServiceNow search widgets.
By default, the Search Events [sys_search_event] and Search Source Events [sys_search_source_event] tables collect search data from base system search widgets. However, custom search widgets do not benefit from this feature. Use this API in the server script of custom search widgets in global environments to send search data to the search events tables. Generate relevant search suggestions for your users and monitor search analytics to understand what your users are searching for and whether they're finding what they need.
- Searched terms
- Rank of clicked items
- Filters used to refine search results
- Table names and record identifiers from the first page of search results
- Search results clicked, including browser and location
Search Suggestions is a ServiceNow AI Platform feature. For more information, see Search Suggestions.
GlideSPSearchAnalytics - publish(String payload)
Sends search data to the Search Event [sys_search_event], Search Event per source [sys_search_source_event], and Search Signal Event [sys_search_signal_event] tables for search results, or to the Search Result Clicked [sys_search_result_clicked] and Search Signal Result Event [sys_search_signal_result_event] tables when a user clicks a search result.
| Name | Type | Description |
|---|---|---|
| payload | String | JSON payload in String format containing the search data to send to the Search
Event [sys_search_event], Search Event per source [sys_search_source_event], and
Search Signal Event [sys_search_signal_event] tables for search results, or to the
Search Result Clicked [sys_search_result_clicked] and Search Signal Result Event
[sys_search_signal_result_event] tables when a user clicks a search result.
Structure the payload as key-value pairs according to the type of search data you
would like to collect.
|
| Type | Description |
|---|---|
| None |
Example
This example passes direct search data to the search analytics tables.
var searchObject = new GlideSPSearchAnalytics();
var payload = {
'query': 'how do i get a new computer',
'portal_id': '81b75d3147032100ba13a5554ee4902b',
'page_id': '87466b63c3223100c8b837659bba8feb',
'results_per_source': [{
'source_id': 'bf2c4c15b3a31300e64be12b86a8dcb7',
'number_of_results': 2,
}, {
'source_id': 'c96eb1686721220023c82e08f585efff',
'number_of_results': 1
}],
'refinement': false,
'search_results': [{
'record_id': 'KB Article 1',
'table_name': 'knowledge'
}, {
'record_id': 'KB Article 2',
'table_name': 'knowledge'
}, {
'record_id': 'Employee Help',
'table_name': 'userportal'
}]
};
var directSearchData = searchObject.publish(JSON.stringify(payload));
Example
This example dynamically collects direct search data from a custom search widget and passes it to the search analytics tables.
//client script
var payload = {
query: this.data.query,
portal_id: this.data.portalID,
page_id: this.data.pageID,
results_per_source: getSearchSources(),
refinement_occurred: false,
};
var payloadObject = {
action: "TestAction",
payload: payload,
};
c.server.get(payloadObject);
//server script
if (input && input.action === "TestAction") {
input.action = "";
var textSearchAnalytics = new GlideSPSearchAnalytics().publish(JSON.stringify(input.payload));
return;
}
Example
This example collects direct search-results-clicked data from a custom search widget and passes it to the search analytics [sys_search_result_clicked] table.
//client script
function setUserLocationCoords(cb) {
var onSuccess = function(pos) {
return cb({
latitude: pos.coords.latitude,
longitude: pos.coords.longitude,
});
};
var onError = function() {
return cb({
latitude: null,
longitude: null,
});
};
return window.navigator.geolocation.getCurrentPosition(onSuccess, onError, {
enableHighAccuracy: true,
});
}
function trackSearchResultClicked(resultClicked, rank) {
if (!rank || rank < 1) return;
var c = $scope;
var query = _.get(c.data, "q");
var results = _.get(c.data, "results", []);
var result = results.find(function(e) {
return e.primary.trim() === resultClicked.trim();
});
var description = result.name != null ? result.name : result.primary;
var sourceTable = result.table != null ? result.table : null;
var payloadObject = {
action: "TestAction",
payload: {
query: query,
portal_id: c.portal.sys_id,
page_id: $scope.page && $scope.page.id,
results_per_source: getSearchSources(c),
refinement_occurred: false,
click_rank: rank,
browser_info: $window.navigator.userAgent,
location: {},
result_clicked_sys_id: result.sys_id,
label_description: description,
source_table: sourceTable,
},
};
setUserLocationCoords(function(coords) {
payloadObject.payload.location.latitude = coords.latitude;
payloadObject.payload.location.longitude = coords.longitude;
$window.spSearchAnalytics = {
query: query,
refinement_occurred: false,
};
c.server.get(payloadObject);
});
}
// Event delegation for Updating click rank
$(".panel").on("click", ".result-item a", function(e) {
var index = $(e.currentTarget).parent().parent().data("index");
var resultClicked = e.currentTarget.innerText;
trackSearchResultClicked(resultClicked, index + 1);
});
// server script
if (input && input.action === "TestAction") {
input.action = "";
var textSearchAnalytics = new GlideSPSearchAnalytics().publish(JSON.stringify(input.payload));
return;
}