GlideSPSearchAnalytics - 전역

  • 릴리스 버전: Xanadu
  • 업데이트 날짜 2024년 08월 01일
  • 읽기12분
  • GlideSPSearchAnalytics API는 사용자 지정 ServiceNow 검색 위젯에서 검색 분석을 생성하는 메서드를 제공합니다.

    기본적으로, 검색 이벤트 [sys_search_event]와 검색 소스 이벤트 [sys_search_source_event] 테이블은 기본 시스템 검색 위젯에서 검색 데이터를 수집합니다. 그러나 사용자 지정 검색 위젯은 이 기능을 활용하지 않습니다. 글로벌 환경에서 사용자 지정 검색 위젯의 서버 스크립트에 이 API를 사용하여 검색 데이터를 검색 이벤트 테이블로 보냅니다. 생성 사용자를 위한 관련 검색 제안과, 모니터 검색 분석으로 사용자들이 무엇을 검색하고 있고 필요한 것을 찾는지 여부를 이해합니다.

    이 API는 다음 검색 데이터를 수집합니다.
    • 검색어
    • 클릭한 항목의 순위
    • 검색 결과를 구체화하는 데 사용되는 필터
    • 검색 결과 첫 페이지의 테이블 이름 및 기록 식별자
    • 브라우저 및 위치를 포함한 클릭한 검색 결과

    검색 제안은 Now Platform 기능입니다. 자세한 내용은 검색 제안을 참조하십시오.

    GlideSPSearchAnalytics - 게시(문자열 페이로드)

    사용자가 검색 결과를 클릭하면 검색 데이터를 검색 이벤트 [sys_search_event], 소스별 검색 이벤트 [sys_search_source_event] 및 검색 신호 이벤트 [sys_search_signal_event] 테이블로 전송하거나, 검색 결과를 클릭하면 검색 결과 클릭 [sys_search_result_clicked] 및 검색 신호 결과 이벤트 [sys_search_signal_result_event] 테이블로 검색 데이터를 전송합니다.

    표 1. 매개변수
    이름 유형 설명
    페이로드 문자열 사용자가 검색 결과를 클릭할 때 검색 이벤트 [sys_search_event], 소스별 검색 이벤트 [sys_search_source_event] 및 검색 신호 이벤트 [sys_search_signal_event] 테이블이나 검색 결과 클릭된 검색 결과 [sys_search_result_clicked] 및 검색 신호 결과 이벤트 [sys_search_signal_result_event] 테이블로 보낼 검색 데이터를 포함하는 문자열 형식의 JSON 페이로드입니다. 수집하려는 검색 데이터의 유형에 따라 페이로드를 키-값 쌍으로 구성합니다.
    • 사용자가 용어를 검색할 때 데이터를 수집합니다.
      • query: 문자열. 검색 중인 쿼리입니다.
      • portal_id: 문자열. 서비스 포털 [sp_portal] 테이블의 포털 기록 Sys_id.
      • page_id: 문자열. 페이지 [sp_page] 테이블의 페이지 기록 Sys_id입니다.
      • results_per_source: 배열. 각 검색 소스에서 반환된 결과의 수입니다.
        • source_id: 문자열. 검색 소스 [sp_search_source] 테이블의 검색 소스 기록 Sys_id입니다.
        • number_of_results: 숫자. 특정 검색 소스에 대한 쿼리에서 반환된 결과 수입니다.
      • ais_profile: 문자열. 검색에 적용되는 검색 프로파일의 Sys_id입니다. 엔진으로 검색한 경우에만 적용할 수 있습니다 AI 검색 .
      • search_results: 배열. 검색 결과의 첫 페이지에 결과가 반환됩니다.
        • record_id: 문자열. 검색 결과 기록의 Sys_id입니다.
        • table_name: 문자열. 검색 결과 기록이 발견된 테이블의 이름입니다.
      • refinement_occurred: 부울. 사용자가 검색 결과를 필터링한 경우 True입니다. 그렇지 않으면 false입니다.
    • 사용자가 검색 결과를 구체화할 때 데이터를 수집합니다.
      • query: 문자열. 검색 중인 쿼리입니다.
      • portal_id: 문자열. 서비스 포털 [sp_portal] 테이블의 포털 기록 Sys_id.
      • page_id: 문자열. 페이지 [sp_page] 테이블의 페이지 기록 Sys_id입니다.
      • refinement_occurred: 부울. 사용자가 검색 결과를 필터링한 경우 True입니다. 그렇지 않으면 false입니다.
    • 사용자가 선택한 검색 결과의 순위를 수집합니다.
      • query: 문자열. 검색 중인 쿼리입니다.
      • portal_id: 문자열. 서비스 포털 [sp_portal] 테이블의 포털 기록 Sys_id.
      • click_rank: 숫자. 사용자가 선택한 항목의 순위입니다. 예를 들어 사용자가 검색 결과 목록에서 세 번째 항목을 클릭한 경우 값은 3입니다.
    • 사용자가 클릭하는 검색 결과에 대한 정보를 수집합니다. 클릭한 검색 결과 [sys_search_result_clicked] 테이블에 대한 데이터 로그입니다.
      • query: 문자열. 검색 중인 쿼리입니다.
      • portal_id: 문자열. 서비스 포털 [sp_portal] 테이블의 포털 기록 Sys_id.
      • page_id: 문자열. 페이지 [sp_page] 테이블의 페이지 기록 Sys_id입니다.
      • results_per_source: 배열. 각 검색 소스에서 반환된 결과의 수입니다.
        • source_id: 문자열. 검색 소스 [sp_search_source] 테이블의 검색 소스 기록 Sys_id입니다.
        • number_of_results: 숫자. 특정 검색 소스에 대한 쿼리에서 반환된 결과 수입니다.
      • refinement_occurred: 부울. 사용자가 검색 결과를 필터링한 경우 True입니다. 그렇지 않으면 false입니다.
      • click_rank: 숫자. 사용자가 선택한 항목의 순위입니다. 예를 들어 사용자가 검색 결과 목록에서 세 번째 항목을 클릭한 경우 값은 3입니다.
      • browser_info: 문자열. 브라우저 이름, 버전 및 플랫폼을 기록합니다.
      • 위치: 부동. 사용자 위치의 위도 및 경도 좌표를 기록합니다.
      • result_clicked_sys_id: 문자열. 사용자가 선택한 결과의 Sys_id입니다.
      • label_description: 문자열. 사용자가 선택한 결과에 대한 설명입니다.
      • source_table: 문자열. 선택한 결과가 포함된 소스 테이블의 이름입니다.
      • ais_doc_id: 문자열. 사용자가 선택한 각 결과에 대한 소스 테이블의 이름과 결과 기록의 sys_id 밑줄로 구분됩니다. 예를 들어, 사용자가 지식 [kb_knowledge] 테이블에서 결과를 클릭한 경우 값의 형식은 kb_knowledge_3020c9b14843210e9db4b5b08b9a712d입니다. 엔진으로 검색한 경우에만 적용할 수 있습니다 AI 검색 .
    • 사용자가 용어를 검색할 때 데이터를 수집하고 사용자가 클릭한 검색 결과의 순위를 수집합니다.
      • query: 문자열. 검색 중인 쿼리입니다.
      • portal_id: 문자열. 서비스 포털 [sp_portal] 테이블의 포털 기록 Sys_id.
      • page_id: 문자열. 페이지 [sp_page] 테이블의 페이지 기록 Sys_id입니다.
      • results_per_source: 배열. 각 검색 소스에서 반환된 결과의 수입니다.
        • source_id: 문자열. 검색 소스 [sp_search_source] 테이블의 검색 소스 기록 Sys_id입니다.
        • number_of_results: 숫자. 특정 검색 소스에 대한 쿼리에서 반환된 결과 수입니다.
      • ais_profile: 문자열. 검색에 적용되는 검색 프로파일의 Sys_id입니다. 엔진으로 검색한 경우에만 적용할 수 있습니다 AI 검색 .
      • search_results: 배열. 검색 결과의 첫 페이지에 반환된 기록의 요약입니다.
        • record_id: 문자열. 검색 결과 기록의 Sys_id입니다.
        • table_name: 문자열. 검색 결과 기록이 발견된 테이블의 이름입니다.
      • click_rank: 숫자. 사용자가 선택한 항목의 순위입니다. 예를 들어 사용자가 검색 결과 목록에서 세 번째 항목을 클릭한 경우 값은 3입니다.
      • ais_doc_id: 문자열. 사용자가 선택한 각 결과에 대한 소스 테이블의 이름과 결과 기록의 sys_id 밑줄로 구분됩니다. 예를 들어, 사용자가 지식 [kb_knowledge] 테이블에서 결과를 클릭한 경우 값의 형식은 kb_knowledge_3020c9b14843210e9db4b5b08b9a712d입니다. 엔진으로 검색한 경우에만 적용할 수 있습니다 AI 검색 .
    표 2. 반환
    유형 설명
    없음

    이 예에서는 직접 검색 데이터를 검색 분석 테이블에 전달합니다.

    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));

    이 예에서는 사용자 지정 검색 위젯에서 직접 검색 데이터를 동적으로 수집하여 검색 분석 테이블에 전달합니다.

    //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;
    }

    이 예에서는 사용자 지정 검색 위젯에서 직접 검색 결과 클릭 데이터를 수집하여 검색 분석 [sys_search_result_clicked] 테이블로 전달합니다.

    //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;
    }