Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

Add region field to knowledge article search results page

Joshuu
Kilo Sage

Hi All,

 

I have a requirement on the knowledge articles search page.

 

Below is the knowledge article homepage when we search for any article

 

priyarao_0-1741078477840.png

 

 

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.

4 REPLIES 4

Ramya V
Kilo Sage
Kilo Sage

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.

Renat Akhmedov
Tera Guru

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

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.

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