MC+A Stream

Our Blog and News Stream

Return on Information (ROI) Jumpstart

September 10th, 2009

A few weeks back Google announced a “Welcome Package” for new customers who purchase a Google Search Appliance with a 1 Million document license. As a Google Enterprise Partner we are excited to be participating in this promotion.

Return on Information
We believe very strongly in enabling clients to manage their technology solutions, and because of this have always offered and strongly suggested our Jumpstart services to all our clients. What is exciting about this promotion is that new customers will be getting 2 days of consultation on getting your Google solution up and running, for FREE.

The Specifics
From Google:
“With this ROI JumpStart, new GSA users will accelerate their onboarding experience, from purchasing to deploying to getting relevant results to end users. Our partners will work with your team on site for two days, at no cost to you, sharing proven expertise and the GSA’s out-of-the-box results and getting your new GSA indexing repositories across your organization.”

Interested in more information about the ROI Jumpstart Offer?
Contact MC+A and we’ll be happy to discuss the Jumpstart in detail.

Can the Google Mini index documents stored in Microsoft Sharepoint?

August 18th, 2009

Answer: Yes – The Google Mini Can Index documents stored in Micrsoft SharePoint!

The Google Mini along with the MC+A Google SharePoint Sitemap can effectively be configured to crawl Microsoft SharePoint sites.  The MC+A Google SharePoint Sitemap produces a dyanmic site map which the Mini can use to crawl deep within SharePoint.   You can further enhance this by adding a Content Web Part onto the search page which will allow you to have the Google Mini produce search results within SharePoint.

Here’s it working in our environment.
Search results page

and in edit mode:

The Search Result Page In Edit Mode

How is the integration achieved?

Step 1 – Navigate to the search results page
Step 2 – Switch the search results page to edit mode
Step 3 – Delete the SharePoint search web parts
Step 4 – Add content editor web part
Step 5 Add the following code(modify for your environment)
Content for web part

How does this work?
1) SharePoint search web part reads the k parameter query string and makes an ‘ajax’ type of request to the appliance.
2) The end use broswer communicates directly with the Mini.

If you purchase a Google Mini from MC+A, we offer a free GSS with support matching for the term of the Google Mini. Otherwise, the product lists for $500 and includes a 30 day trial support during the trial. MC+A professional services can be engaged to assist with the integration within SharePoint.

Google Search Appliance 6.0.0.G32 Release

August 10th, 2009

For models GB-1001 and GB-7007, there has been a software patch release. Current Google customers under support can go to:

https://support.google.com/enterprise/doc/gsa/00/update_index_page.html

Customers under current support contracts with MC+A will be contacted by MC+A Support.

Adding Google Search Appliance Suggest Search To Your Existing Page

July 28th, 2009

“Suggest” is a new beta feature on the Google Search Appliance 6.0.  Out of the box, it is designed to work with the default style sheet.  However, many of our clients have chosen to use a scripted page (asp/aspx/php/jsp).  In order to get this functionality working, additional coding is required.  This article describes wiring up the search box via a proxy and asp.

The Service

There is a new service located at /suggest.  When you type the queries are sent to it.  The response comes back as a simple JSON package.  It is not encoded in JSONP so if you develop a separate page and want to use it, you’re faced with  a cross site scripting issue.

The Solution

  1. Copy suggest_js.js to the site which you want to utilize the service.
  2. Create a proxy in your server (code below)
  3. suggest_js.js is obfuscated.  But you just need to replace “/suggest” with the location of your new service (has to be at the same domain
  4. Add the .ac-renderer, .ac-row, .ac-highlighted and .ac-active styles to your page
  5. reference the new suggest_js.js file is reference in your html
  6. call the function sgst(‘q’);
  7. Start typing!

Proxy Example:

dim srcFile
srcFile = "http://gsa.mcplusa.com/suggest?"
srcFile = srcFile & "token=" & Request("token") & "&max_matches=10"</div>
'Get the JSON
Response.Buffer = True
Dim objXMLHTTP, xml

'Create an xmlhttp object
Set xml = Server.CreateObject("Microsoft.XMLHTTP")
xml.Open "GET", srcFile, False
xml.Send

Response.Write xml.responseText
set xml= Nothing

The New Suggested Search running off the appliance.

Update!

Mahesh T published a java servlet here.

Google Apps Migration for Lotus Notes

July 14th, 2009

Google announced Google Apps Migration for Lotus Notes.

How To Daisy Chain Related Terms With The Google Search Appliance

July 14th, 2009

We recently encountered an issue with database content on a Google Search Appliance implementation.  The client had used wild cards to describe their data.  The system could interpret these into the particular items, but the sku 8% did not mean anything to the client.  This sku additional represented a brand name.  People are more likely to type in the brand name than a partial SKU.

Query Expansion

The Appliance has the feature to make terms related.  For example Apple and Apples can both mean the same thing.  In our case, we can make model 8A equal to the brand name.  However we can make 8% mean the brand name.  Also the appliance will not daisy chain query expansion related terms…ie. X means Y means Z.  So X means Z.  Also since it was a wild card X could mean A could mean B…and Z does not equal B.

The Solution

The solution was to employ a SEO trick.  We expanded the 8% in a feed to mean all of the possible combinations of the base Sku.  We then made those base SKUs related to their brands.  Simple, yet effective.

8% = “8A 8B 8C and so on

Google Search Appliance 6.0 New Features Video

July 13th, 2009

Google released a video overview of GSA 6.0 features. If you haven’t seen it, you should check it out.

Remotely Calling The Google Search Appliance RESTful Web Services When SAML is enabled

June 23rd, 2009

Calling the Google Search Appliance when a SAML interface or Forms Authentication security interface is enabled causes a bit of a challenge  from  SharePoint or ASP.NET.  The following is some code that we developed to handle all of the hand shaking from the redirects and cookie exchange.  This will be published shortly as a open source project.

public  string SecureSearch(string term)
        {
            try
            {
                StringBuilder defaultquery = new StringBuilder();
                defaultquery.Append(ConfigurationManager.AppSettings["GSADEVICEURL"]);
                defaultquery.Append("/search?q=" + term);
                defaultquery.Append("&client=" + ConfigurationManager.AppSettings["GSAFRONTEND"]);
                defaultquery.Append("&output=xml_no_dtd");
                defaultquery.Append("&site=" + ConfigurationManager.AppSettings["GSACOLLECTION"]);
                defaultquery.Append("&access=a");
                defaultquery.Append("&entqr=3&ud=1&oe=UTF-8&ie=UTF-8");
                defaultquery.Append("&filter=" + ConfigurationManager.AppSettings["GSASEARCHFILTER"]);
                defaultquery.Append("&num=" + ConfigurationManager.AppSettings["RESULTSPERPAGE"]);
               
                Regex cookieCheck = new Regex("googlecookiecheck", RegexOptions.IgnoreCase);

                log.Info("Step 1 Call GSA for secure query");
                string loginurl = callGSA(defaultquery.ToString(), false);

                //if the return url has the cookie check added, send the url back to the gsa
                //the cookie check cookie will be attached
                if (cookieCheck.Match(loginurl).Success)
                {
                    //send the url returned with cookiecheck back to GSA
                    log.Info("Step 2 Call GSA for secure doc, respond to cookiecheck request");
                    loginurl = callGSA(ConfigurationManager.AppSettings["GSADEVICEURL"] + loginurl, false);
                    if (!gsaResultsReturned)
                    {
                        log.Info("Step 3 Call GSA for secure only with redirect from cookiecheck request");
                        loginurl = callGSA(ConfigurationManager.AppSettings["GSADEVICEURL"] + loginurl, false);
                    }
                }

                if (!gsaResultsReturned)
                {
                    log.Info("Step 4 Call GSA to get result set");
                    loginurl = callGSA(loginurl, true);
                }
                log.Info("Step 5 COMPLETE");
               
               
            }
            catch (Exception ex)
            {
                log.Error("btnSearch_Click", ex);
            }

            return results.OuterXml.ToString();
        }

        private string callGSA(string url, bool allowredirect )
        {
            gsaResultsReturned = false;

            string returnURL = string.Empty;
            try
            {
                log.Error("callGSA() url ->" + url);
                HttpWebRequest HttpWReq = (HttpWebRequest)WebRequest.Create(url);
                HttpWReq.KeepAlive = true;
                HttpWReq.Accept = "*/*";
                HttpWReq.Headers.Add("Accept-Language", "en-us");
                HttpWReq.Headers.Add("Accept-Encoding", "gzip, deflate");
                HttpWReq.AllowAutoRedirect = allowredirect;
                HttpWReq.CookieContainer = cookieC;
                HttpWReq.Credentials = System.Net.CredentialCache.DefaultCredentials;
                HttpWReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; InfoPath.1; .NET CLR 2.0.50727)";
                if (allowredirect)
                {
                    HttpWReq.MaximumAutomaticRedirections = 10;
                }

                CookieCollection mycookies = HttpWReq.CookieContainer.GetCookies(new Uri(ConfigurationManager.AppSettings["GSACOOKIEURL"]));
               

                HttpWebResponse HttpWResp = (HttpWebResponse)HttpWReq.GetResponse();
                log.Info("......callGSA response http status = " + HttpWResp.StatusCode);
                //get header collection 
                WebHeaderCollection col = HttpWResp.Headers;
                if (HttpWResp.StatusCode.Equals(HttpStatusCode.Found))
                {
                    //get location and make request
                    string[] redirectURL = col.GetValues("Location");
                    returnURL = redirectURL[0];
                    log.Debug("......callGSA() found redirect URL from GSA to->" + redirectURL[0]);
                }
                //logHeader(col);
                CookieCollection csk = new CookieCollection();

                csk = HttpWResp.Cookies;
                for (int i = 0; i < csk.Count; i++)
                {
                    log.Debug("............. callGSA response cookies " + csk[i].Name + " value " + csk[i].Value);
                    log.Debug("............. callGSA response cook domain " + csk[i].Domain);
                    log.Debug("............. callGSA response cook Path " + csk[i].Path);
                    log.Debug("............. callGSA response cook expires " + csk[i].Expires.ToLongTimeString());
                    log.Debug("............. callGSA response cook secure " + csk[i].Secure.ToString());

                    String[] values = col.GetValues("Set-Cookie");
                    if (null != values && values.Length > 0)
                    {
                        for (int j = 0; j < values.Length; j++)
                        {
                            Uri cookuri = new UriBuilder("http", csk[i].Domain, 80).Uri;
                            log.Info("......callGSA moving cookie " + cookuri.ToString() + " " + values[j]);
                            cookieC.SetCookies(cookuri, values[j]);
                        }
                    }
                }

                //this is the final step, we have a result set from the GSA
                if (HttpWResp.StatusCode.Equals(HttpStatusCode.OK) ||
                    (returnURL.Equals(string.Empty)))
                {
                    gsaResultsReturned = true;
                    Stream receiveStream = HttpWResp.GetResponseStream();
                    Encoding UTF8_Encoding = System.Text.Encoding.GetEncoding("utf-8");
                    StreamReader readStream = new StreamReader(receiveStream, UTF8_Encoding);
                    //get the response and display
                    results.LoadXml(readStream.ReadToEnd());
                   
                }
            }
            catch (Exception ex)
            {
                log.Error("CallGSA ", ex);
            }

            return returnURL;
        }

Google Geo Api 3.0 released to Labs

May 28th, 2009

Yesterday on the Google Geo Developers blog, Google announced the availability of a new api for Google Geo mashups.  From the blog post, the major improvements are:

  • Chrome and iPhone Safari mobile added to our supported browsers. Your mashups will also work on Android-based phones with the recent update, but you may notice some issues, like the “View/Save Image” dialog showing unexpectedly. We’re working with the Android team to fix this and improve the end user’s experience in interacting with the map. We could’ve waited until it’s perfect, but we really wanted to get an early release in your hands and start getting feedback while we fix up a few remaining issues.
  • No keys required. You can now copy ‘n paste code easily or embed in RSS readers, for example, without getting key errors.
  • MVC-based architecture. This allowed us to significantly reduce the size of our initial JavaScript download. We found it to be simple and powerful.
  • Default UI is enabled automatically. We’ll provide default UI controls and behavior (and we’ll update them) so your mashup can keep up with the latest and greatest changes we make to Google Maps. Of course, if you’ve got customized controls you’re happy with, you can disable the default UI updates.
  • Namespaces. Everything is always in the google.maps.* namespace and there is no “G” prefixed variables in the global scope.
  • Geocoding API has been overhauled based on the feedback we’ve received with the existing implementation over the past three years

We’ll be incorporating this new API into our physican finder as soon as the API is a little more baked.

Google Apps to get scripting

May 27th, 2009

 Today Google posted on their enterprise blog an announcement  about a long awaited feature for scripting Google Apps.   You’ll have to sign up to be part of the beta before it’s released widely.

Here is a video describing the new feature:

Page 1 of 3123