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

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 Contributor

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