ファセット検索結果のソートについて

masa16
Tera Contributor

ファセット検索のウィジェット(faceted_search)に
ソート処理をつけるにはどうしたら良いでしょうか。

1 件の受理された解決策

Community Alums
適用対象外

検索結果の表示順は "Frequency", "Sequence", "Weight" によって算出されたスコアによって定まり、OOTBの機能では並べ替え順序を制御することはできません。

https://support.servicenow.com/kb?id=kb_article_view&sysparm_article=KB0686128

 

ソート処理を追加したい場合には faceted_search をClone Widget し、ご自身でカスタマイズする必要があります。

カスタマイズには AngularJS の知識が必要です。私も詳しくはないですが、自前の環境(バージョンTokyo)で確認した内容を記載します。

 

Client Script(以下を5行目辺りに挿入する)

 

    // ソート順を指定するためのプルダウンを定義する
    $scope.sortOptions = [
      { label: '-', value: 'parseFloat(score)'},
      { label: 'A to Z', value: 'short_description' },
      { label: 'Z to A', value: '-short_description' }
    ];
    
    // デフォルトは一番目(スコア)の順にソートする
    $scope.selectedSortOrder = $scope.sortOptions[0].value;

 

 

HTML Templateその①(3行目以降の<div class="row header">〜</div>の部分を書き換える)

<div class="row header">
    <div class="col-md-6">
        <sp-widget widget="data.breadcrumbsWidget"></sp-widget>
     </div>
     <div class="col-md-2">
         <select ng-model="selectedSortOrder" ng-options="option.value as option.label for option in sortOptions"></select>
     </div>
     <div class="col-md-4" ng-if="data.showTypeaheadSearch">
         <sp-widget widget="data.typeaheadSearchWidget"></sp-widget>
     </div>
 </div>

 

HTML Templateその②(<div role="listitem" 〜> の行を書き換える)

<div role="listitem" ng-repeat="item in results | orderBy: selectedSortOrder" class="panel-body b-b result-item" ng-click="sendAnalytics(item, $index)">

 

以上を施したWidgetを既存のものと差し替えることで、Short Descriptionでソート可能なプルダウンメニューを検索窓の横に追加できます。
シンプルですが、カスタマイズのご参考までに。
スクリーンショット 2023-09-01 1.13.53.png

元の投稿で解決策を見る

2件の返信2

Community Alums
適用対象外

検索結果の表示順は "Frequency", "Sequence", "Weight" によって算出されたスコアによって定まり、OOTBの機能では並べ替え順序を制御することはできません。

https://support.servicenow.com/kb?id=kb_article_view&sysparm_article=KB0686128

 

ソート処理を追加したい場合には faceted_search をClone Widget し、ご自身でカスタマイズする必要があります。

カスタマイズには AngularJS の知識が必要です。私も詳しくはないですが、自前の環境(バージョンTokyo)で確認した内容を記載します。

 

Client Script(以下を5行目辺りに挿入する)

 

    // ソート順を指定するためのプルダウンを定義する
    $scope.sortOptions = [
      { label: '-', value: 'parseFloat(score)'},
      { label: 'A to Z', value: 'short_description' },
      { label: 'Z to A', value: '-short_description' }
    ];
    
    // デフォルトは一番目(スコア)の順にソートする
    $scope.selectedSortOrder = $scope.sortOptions[0].value;

 

 

HTML Templateその①(3行目以降の<div class="row header">〜</div>の部分を書き換える)

<div class="row header">
    <div class="col-md-6">
        <sp-widget widget="data.breadcrumbsWidget"></sp-widget>
     </div>
     <div class="col-md-2">
         <select ng-model="selectedSortOrder" ng-options="option.value as option.label for option in sortOptions"></select>
     </div>
     <div class="col-md-4" ng-if="data.showTypeaheadSearch">
         <sp-widget widget="data.typeaheadSearchWidget"></sp-widget>
     </div>
 </div>

 

HTML Templateその②(<div role="listitem" 〜> の行を書き換える)

<div role="listitem" ng-repeat="item in results | orderBy: selectedSortOrder" class="panel-body b-b result-item" ng-click="sendAnalytics(item, $index)">

 

以上を施したWidgetを既存のものと差し替えることで、Short Descriptionでソート可能なプルダウンメニューを検索窓の横に追加できます。
シンプルですが、カスタマイズのご参考までに。
スクリーンショット 2023-09-01 1.13.53.png

masa16
Tera Contributor
Yu Kikuchiさん
 
アイデアありがとうございました。
ヒントとして参考にさせていただきました。
カスタムテーブルではうまく行かなかったので
別の方法で実現できました。
以下が実現方法です。
自分で開発したとは言え
所有権は依頼者様にあるので
ヒントのみです。
申し訳ございません。
①検索ソースのデータソースをスクリプト化済みソースで自分で組む。
②ソート管理テーブルを作りソート項目からソート内容を取得し
 gr.orderByDesc('ソート項目');でソートする。
③ファセット検索ウィジェットにソートボタンを作る。
HTML:
      <div class="row header">
         <div class="col-md-8">
            <sp-widget widget="data.breadcrumbsWidget"></sp-widget>
         </div>
         <div class="col-md-4" ng-if="data.showTypeaheadSearch">
            <sp-widget widget="data.typeaheadSearchWidget"></sp-widget>
         </div>
      </div>
      <div class="row">
         <div class="col-sm-3 hidden-xs">
            <a class="skip-link sr-only" ng-click="skipToSearchResults()" href="javascript&colon;void(0)">${Skip to search results}</a>
            <sp-search-nav search-sources="data.searchSources" q="data.q" t="data.t"></sp-search-nav>
            <section ng-show="hasFacet" aria-label="${Search results filters}">
                <sp-facet-lists collapsed="collpaseFacets" list-title="c.data.facetTitle" search-sources="data.searchSources" t="data.t"></sp-facet-lists>
            </section>
         </div>
         <div class="col-sm-9">
            <div class="panel panel-default" role="region" aria-label="{{::data.SEARCH_RESULTS}}">
               <div ng-if="isLoading || results.length>0" class="panel-heading flex">
                  <h2 class="h4 panel-title results-heading" tabindex="-1">${{{t_label}} results for "{{data.q}}"}</h2>
                  <div>
                  <button type="button" ng-click="runClientControl('テーブル項目')">XXXの順</button>
クライアントコントローラー:
$scope.runClientControl = function(sType){
// スクリプトインクルードを実行する
var ga = new GlideAjax('テーブル');
ga.addParam('sysparm_name', 'ファンクション');
ga.addParam('sysparm_arg1', sType);
ga.getXML(callback);
function callback(response) {
var info = response.responseXML.documentElement.getAttribute("answer");
 
// 画面リフレッシュ
window.location.reload();
}
}
④スクリプトインクルードを作る。
 これはウィジェットのクライアントコントローラーでsTypeをソート管理テーブルに書き込む
 
結果画像の用意ができてなくて申し訳ございません。
(今は手元にプロジェクトのサンプルしかない為)