Search code examples
google-custom-search

Implementing Google Custom Search with filtering


I have to implement a page with multiple google-powered search forms. We have a license from Google for CSE, and this is the situation:

  • I have a search form that's present at the top of every page that performs a simple search and displays the results in a separate page. This works.

  • I have a particular page that, in addition, shows another two search forms: one should filter articles by category, another should filter articles by category and restrict the result to a certain month. I have added a meta key with the publication date to each article for this.

I have gotten a bit lost in the documentation, though: if I add

<gcse:searchbox-only resultsUrl="/[site]/stat/search/google_search_results.html"></gcse:searchbox-only></div>

to the page, I can't filter the results. If I start to meddle with a CustomSearchObject, I don't see an option to show results on a different page.

For category-based filtering, I've tried appending

more:pagemap:metatags-taxonomies:news

to the query argument in the results page URL, and it does work, but I don't understand how to inject this to the form. For restricting based on dates, I tried adding

&sort=more:pagemap:metatags-pubdate:r:YYYYMMDD:YYYYMMDD

but haven't been able to make it work. Getting the XML does work:

http://www.google.com/search?q=intitle:[mysite]%20more:pagemap:metatags-taxonomies:News&sort=metatags-pubdate:r:20120401:20120830&cx=[mykey]client=google-csbe&output=xml

returns correct results.

Is there documentation that doesn't assume so much? All I find are code snippets without context. I've checked Filtering and sorting, Custom Search Element Control API, and of course this site, but I can't put all the pieces together.


Solution

  • I managed to implement what I wanted. In the search page, I built simple forms pointing to my results pages (this might not be doable if you must implement google branding), and in the results page I put the following:

    • (in the <head>)

      <script src="http://www.google.com/jsapi"></script>
      <script>
      // This function extracts the query from the URL (if GET) or builds a search query.
      // Code removed to simplify the example.
      function buildQuery () {
          return '<?php echo $_POST['q'];?> more:pagemap:metatags-taxonomias:News'); // injecting the taxonomy metatag filter
      }
      
      google.load('search', '1', {language : 'es'});
      google.setOnLoadCallback(function() {
          var customSearchOptions = {};
          customSearchOptions[google.search.Search.RESTRICT_EXTENDED_ARGS] = {'sort':'metatags-pubdate:d,metatags-pubdate:r:<?php echo $_POST['startdate'];?>:<?php echo $_POST['enddate'];?>'}; // these come from the POST request, are processed earlier in the script.
          var customSearchControl = new google.search.CustomSearchControl('XXXXXXXXXXX', customSearchOptions); // Put your own App key here.
          customSearchControl.setResultSetSize(google.search.Search.FILTERED_CSE_RESULTSET);
      
          var drawOptions = new google.search.DrawOptions();
          drawOptions.enableSearchResultsOnly(); // I don't want the search box here
      
          customSearchControl.draw('cse-results-press', drawOptions);
          var query = parseQuery();
          if (query) {
              customSearchControl.execute(query);
          }
      }, true);
      </script>
      
    • In the <body>:

      <div id="cse-results-press">Loading...</div>