Add region field to knowledge article search results page
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-04-2025 12:55 AM
Hi All,
I have a requirement on the knowledge articles search page.
Below is the knowledge article homepage when we search for any article
Here, we can see Knowledge Base and Category fields, requirement is to include Region field also from knowledge article. How to achieve this?
Could you please assist.
Thanks & Regards.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-04-2025 02:56 AM
Hi @Joshuu,
As I cannot see the Region field available on the Knowledge article (kb_knowledge) table, we cannot directly include it in the search results. However, if you have the region field on the article (such as a custom field like u_region), you can duplicate the "Knowledge Result" widget and modify the server-side script accordingly.
Please mark this answer as Helpful if this solution works for you.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-04-2025 05:22 AM - edited 03-04-2025 05:24 AM
Hello @Joshuu,
To add the Region field to the Knowledge Articles Search Page, first, ensure that the u_region field exists in the kb_knowledge table under System Definition > Dictionary; if not, create it. Then, modify the Knowledge Base Search Widget (for Service Portal) by updating the server script to include u_region in the query. Navigate to Service Portal > Pages, open the kb_search or knowledge_home page, and modify the faceted search filter to display the Region field. Additionally, update Service Portal > Search Sources, locate the Knowledge Search Source, and ensure u_region is included in the search filters. If using Now Experience UI Builder, update the Search Configuration accordingly.
If it helped you - please mark it as helpful, thank you.
Best regards,
Renat Akhmedov
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-06-2025 03:40 AM - edited 03-06-2025 03:41 AM
Hi @Renat Akhmedov ,
Thank you for your response. yes, it is a custom field on the knowledge form. Could you please help me with the scripts.
I found the below script from Search Source "Knowledge Base". Please correct me if I am wrong. And please assist where do I need to update.
Data fetch script:
var indexGroup = (typeof indexGroup !== "undefined") ? indexGroup : "portal_index_group";
var queryLocation = queryLocation || 0;
var count = count || 30;
var facets = facets || {};
(function(query, queryLocation, count, facets, indexGroup) {
return doContextualSearch(query, count, facets, queryLocation);
function doContextualSearch(query, count, facets, queryLocation) {
var results = [];
var taxonomyId = $sp.getTaxonomies();
var displayAttachments = gs.getProperty('glide.knowman.search.attachment', 'LINK_SNIPPET');
var kbArray = [];
var variables = {
author: [facets.author]
};
if (!taxonomyId) {
if (facets.kb_knowledge_base)
kbArray.push(facets.kb_knowledge_base);
else {
var kbs = $sp.getKnowledgeBases();
if (!gs.nil(kbs))
kbArray = kbs.split(',');
}
variables.kb_knowledge_base = kbArray;
variables.kb_category = facets.category;
} else {
variables.taxonomy_topic = facets.topic;
}
// Set up request
var request = {
keyword: query,
language: "",
variables: variables,
resource: 'Knowledge',
context: gs.getProperty('glide.knowman.sp.search_context', 'Knowledge Search'),
kb_query: getFacetQuery(facets, taxonomyId),
social_query: "",
order: "relevancy,true",
start: queryLocation,
end: count,
attachment: displayAttachments != "NO_ATTACHMENT",
knowledge_fields: [
"number",
"sys_id",
"published"
],
index_group: indexGroup
};
if (JSUtil.notNil(data.limit) && !isNaN(data.limit))
request.end = data.limit + queryLocation;
// execute search return result
var response = new KBPortalServiceImpl().getResultData(request);
// Send results back ro UI
var kbCount = 0;
for (var i = 0; i < response.results.length; i++) {
result = response.results[i];
var article = {};
article.sys_id = result.meta.sys_id.display_value;
article.number = result.meta.number.display_value;
article.short_description = result.title;
article.published = result.meta.published.display_value;
article.publishedUTC = result.meta.published.value;
article.type = "kb";
article.text = result.snippet || "";
article.text = $sp.stripHTML(article.text) + "";
article.text = article.text.substring(0, 200);
article.score = result.meta.score;
article.label = article.short_description;
article.primary = article.short_description;
article.query_location = queryLocation + kbCount;
article.table = "kb_knowledge"; // populate the table name for analytics
article.link = result.link;
article.attachments = result.meta.attachments || [];
for (var list = 0; list < article.attachments.length; list++) {
if (article.attachments[list].terms)
article.attachments[list].terms = $sp.stripHTML(article.attachments[list].terms);
}
results.push(article);
kbCount++;
}
if (!data.includeFacets)
$sp.logSearch('kb_knowledge', query, kbCount, data.searchType, data.portal, data.page);
if (results.length == 0)
return results;
if (results.length < count) {
var lastResult = results.pop();
lastResult.isLastResult = true;
results.push(lastResult);
}
return results;
}
// Build the kb_query based on facets
function getFacetQuery(facets, taxonomyId) {
var kbFacetMap = {
// updated
"more_ago": "^sys_updated_onRELATIVEGT@year@ago@2",
"year_ago": "^sys_updated_onRELATIVEGT@year@ago@1",
"month_ago": "^sys_updated_onRELATIVEGT@month@ago@1",
"week_ago": "^sys_updated_onRELATIVEGT@dayofweek@ago@7",
"day_ago": "^sys_updated_onRELATIVEGT@dayofweek@ago@1",
// viewcount
"more_than_500": "^sys_view_count>500",
"more_than_200": "^sys_view_count>200",
"more_than_100": "^sys_view_count>100",
"more_than_50": "^sys_view_count>50",
"more_than_10": "^sys_view_count>10",
"less_than_10": "^sys_view_count<10"
};
// Fill in facet info into kbQuery
var kbQuery = "";
//If portal is assosiated to taxonomy then add topic and taxonomy Filter
if (taxonomyId)
kbQuery = "taxonomy_topic.active=true^taxonomy_topic.taxonomyIN" + taxonomyId;
if (facets.updated)
kbQuery += kbFacetMap[facets.updated];
if (facets.viewcount)
kbQuery += kbFacetMap[facets.viewcount];
// return built up query, stripping away leading ^
return (kbQuery.startsWith("^")) ? kbQuery.substring(1) : kbQuery;
}
})(query, queryLocation, count, facets, indexGroup);
Facet generation script:
(function(query, facetService, searchResults) {
/* Calculate your facets here using facetService */
/* var stateFacet = facetService.createFacet('State', 'state'); */
/* stateFacet.addFacetItem('Facet Item Label', '123'); */
// If no facets selected and no results, don't show any facets
if (searchResults.length == 0 && Object.keys(facets).length == 0)
return;
var kbLabelMap = {
more_than_500: "More Than 500",
more_than_200: "More Than 200",
more_than_100: "More Than 100",
more_than_50: "More Than 50",
more_than_10: "More Than 10",
less_than_10: "Less Than 10",
more_ago: "Past 2 Years",
year_ago: "Past Year",
month_ago: "Past Month",
week_ago: "Past Week",
day_ago: "Past 24 Hours"
};
var kbArray = [];
var kbQuery = '';
var kbQueryDataObj = {};
var kbQueryData = '';
var taxonomyId = $sp.getTaxonomies();
if (taxonomyId) {
kbQuery = "taxonomy_topic.active=true^taxonomy_topic.taxonomyIN" + taxonomyId;
kbQueryDataObj = {
value: 'kb',
dynamic: false,
filters: [{
id: 'kb',
label: 'Knowledge base',
order: 1,
query: [{
display_value: kbQuery,
table: 'kb_knowledge',
value: kbQuery
}]
}]
};
kbQueryData = JSON.stringify(kbQueryDataObj);
} else {
var kbs = $sp.getKnowledgeBases();
if (!gs.nil(kbs)) {
kbArray = kbs.split(',');
kbQuery = 'kb_knowledge_baseIN' + kbs;
kbQueryDataObj = {
value: 'kb',
dynamic: false,
filters: [{
id: 'kb',
label: 'Knowledge base',
order: 1,
query: [{
display_value: kbQuery,
table: 'kb_knowledge',
value: kbQuery
}]
}]
};
kbQueryData = JSON.stringify(kbQueryDataObj);
}
}
var honourSearchOrder = gs.getProperty('glide.sp.honour.kb.search.order', false);
var searchOrderBy = honourSearchOrder === 'true' ? '' : 'sys_view_count,true';
var kbFacets = new KBPortalServiceImpl().getAllFacets(query, '',
'{"kb_knowledge_base":{"aggregate":false,"include_null":false,"orderby":"label","table":"kb_knowledge","value":[]},"author":{"aggregate":false,"include_null":false,"orderby":"label","table":"kb_knowledge","value":[]},"kb_category":{"aggregate":false,"include_null":true,"orderby":"label","table":"kb_knowledge","value":[]},"taxonomy_topic":{"aggregate":false,"include_null":false,"orderby":"label","table":"kb_knowledge","value":[]}}',
'{' + (kbQueryData ? 'kb:' + kbQueryData + "," : "") + '"modified":{"dynamic":false,"filters":[{"id":"more_ago","label":"Past 2 Years","order":5,"query":[{"display_value":"sys_updated_onRELATIVEGT@year@ago@2^sys_updated_onRELATIVELT@year@ago@1","table":"","value":"sys_updated_onRELATIVEGT@year@ago@2"}]},{"id":"year_ago","label":"Past Year","order":4,"query":[{"display_value":"sys_updated_onRELATIVEGT@year@ago@1^sys_updated_onRELATIVELT@month@ago@1","table":"","value":"sys_updated_onRELATIVEGT@year@ago@1"}]},{"id":"month_ago","label":"Past Month","order":3,"query":[{"display_value":"sys_updated_onRELATIVEGT@month@ago@1^sys_updated_onRELATIVELT@dayofweek@ago@7","table":"","value":"sys_updated_onRELATIVEGT@month@ago@1"}]},{"id":"week_ago","label":"Past Week","order":2,"query":[{"display_value":"sys_updated_onRELATIVEGT@dayofweek@ago@2^sys_updated_onRELATIVELT@dayofweek@ago@1","table":"","value":"sys_updated_onRELATIVEGT@dayofweek@ago@7"}]},{"id":"day_ago","label":"Past 24 Hours","order":1,"query":[{"display_value":"sys_updated_onRELATIVEGT@dayofweek@ago@1","table":"","value":"sys_updated_onRELATIVEGT@dayofweek@ago@1"}]}],"value":""},"resources":{"dynamic":true,"filters":"","value":"Knowledge"},"view_count":{"dynamic":false,"filters":[{"id":"more_than_500","label":"More Than 500","order":6,"query":[{"display_value":"sys_view_count>500","table":"kb_knowledge","value":"sys_view_count>500"}]},{"id":"more_than_200","label":"More Than 200","order":5,"query":[{"display_value":"sys_view_count>200^sys_view_count<500","table":"kb_knowledge","value":"sys_view_count>200"}]},{"id":"more_than_100","label":"More Than 100","order":4,"query":[{"display_value":"sys_view_count>100^sys_view_count<200","table":"kb_knowledge","value":"sys_view_count>100"}]},{"id":"more_than_50","label":"More Than 50","order":3,"query":[{"display_value":"sys_view_count>50^sys_view_count<100","table":"kb_knowledge","value":"sys_view_count>50"}]},{"id":"more_than_10","label":"More Than 10","order":2,"query":[{"display_value":"sys_view_count>10^sys_view_count<50","table":"kb_knowledge","value":"sys_view_count>10"}]},{"id":"less_than_10","label":"Less Than 10","order":1,"query":[{"display_value":"sys_view_count<11","table":"kb_knowledge","value":"sys_view_count<11"}]}],"value":""}}',
searchOrderBy);
var kbFacetObj = JSON.parse(kbFacets);
if (taxonomyId) {
createMultiChoiceFacetFromKB("UppercaseTopic", "topic", kbFacetObj.taxonomy_topic, 'order');
} else {
if (kbFacetObj.kb_knowledge_base && kbFacetObj.kb_knowledge_base.length > 1)
createVariableFacetFromKB("Knowledge Base", "kb_knowledge_base", kbFacetObj.kb_knowledge_base, 'label');
createMultiChoiceFacetFromKB("Category", "category", kbFacetObj.kb_category, 'order');
}
createVariableFacetFromKB("Author", "author", kbFacetObj.author, 'label');
createVariableFacetFromKB("Last Modified", "updated", kbFacetObj.modified, 'order');
createVariableFacetFromKB("View Count", "viewcount", kbFacetObj.view_count, 'order');
function createVariableFacetFromKB(label, variable, values, orderBy) {
if (!values || values.length == 0)
return;
var kbFacet = facetService.createFacet(label, variable);
if (orderBy)
values.sort(function(a, b) {
if (a[orderBy] < b[orderBy])
return -1;
if (a[orderBy] > b[orderBy])
return 1;
return 0;
});
if (facets.author && variable == 'author')
kbFacet.addFacetItem(getLabel(values, facets[variable]), facets[variable]);
else if (facets.updated && variable == 'updated' && kbLabelMap[facets.updated])
kbFacet.addFacetItem(kbLabelMap[facets.updated], facets.updated);
else if (facets.viewcount && variable == 'viewcount' && kbLabelMap[facets.viewcount])
kbFacet.addFacetItem(kbLabelMap[facets.viewcount], facets.viewcount);
else if (facets.kb_knowledge_base && variable == 'kb_knowledge_base')
kbFacet.addFacetItem(getLabel(values, facets[variable]), facets[variable]);
else {
for (var i in values)
kbFacet.addFacetItem(values[i].label, values[i].id);
}
}
function createMultiChoiceFacetFromKB(label, variable, values, orderBy) {
if (!values || values.length == 0)
return;
var kbFacet = facetService.createMultiChoiceFacet(label, variable);
var kbMap = {};
for (var i in values) {
var key = values[i].label;
var value = values[i].id;
var parent = new KBParentData().getParentCategory(value, key);
key = parent.join(' > ');
kbMap[key] = value;
}
var labels = Object.keys(kbMap).sort();
for (i = 0; i < labels.length; i++) {
var currentLabel = labels[i];
kbFacet.addFacetItem(currentLabel, kbMap[currentLabel]);
}
}
function getLabel(values, id) {
for (var i in values) {
if (values[i].id == id)
return values[i].label;
}
return "";
}
})(query, facetService, searchResults);
Thanks & Regards.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-06-2025 04:06 AM
Hi @Joshuu,
1. Locate the knowledge_fields array and add "u_region" to ensure the field is retrieved:
knowledge_fields: [
"number",
"sys_id",
"published",
"u_region" // Add this line
],
Also, update the response object inside the loop:
article.region = result.meta.u_region.display_value; // Add region field
2. Add a new facet for Region similar to how other facets (e.g., Category, Author) are created:
createVariableFacetFromKB("Region", "u_region", kbFacetObj.u_region, 'label');
Ensure that the u_region field is included in the facet query inside the getAllFacets() function.
Please mark this answer as helpful if it's really helped you - no hard to you, big pleasure to me, thank you,
Best regards,
Renat Akhmedov