Click here to Skip to main content
15,867,453 members
Articles / Web Development / ASP.NET

Using Google Co-op's Custom Search Engine

Rate me:
Please Sign up or sign in to vote.
4.86/5 (23 votes)
19 Dec 2013CPOL5 min read 300.4K   5.8K   101   72
This article shows how easy it is to use ASP.NET and Google Co-op's Custom Search Engine to build your own search engine.

Sample Image - CustomSearchEngine.jpg

Introduction

This article shows how easy it is to create your own custom search engine using ASP.NET and Google Co-op’s Custom Search Engine feature. 

Creating Your Search Engine

The very first step you must take is to visit http://www.google.com/coop/cse. (Note that you must have a Google Account. If you don’t have one, ask around. GMail invites are a dime a dozen these days.) Once there, follow the instructions to create your custom search engine.

For this article, I used the following settings:

Sites to Search

Sites to search:www.codeproject.com
How to search these sites:Search only these sites.

Collaborate with others

Who can collaborate:Only people I invite may contribute to this search engine.

Where to Host the Custom Search Engine

You have two options on how you can display your search engine to users: Google can host it for you, or you can host the search box and results on your site. For this article, I opted for the latter.

To configure this option:

  1. Return to the Google Co-op Custom Search Engine site’s home page (http://www.google.com/coop/cse).
  2. Click on the My Search Engines link.
  3. When the list of your custom search engines shows up, click on the link that says “Control Panel”.
  4. Next, click on the link that says “Code”.
  5. Select the radio button next to the option that says “Host a search box and search results on your own site…”.
  6. Also, specify the URL of the page on your site where you want the search results to appear.
  7. Finally, after you select the location where you want to display the AdSense ads in your search results, click the Save Changes button.

Search Box Code and Search Results Code

On that same “Code” page in your custom search engine control panel, you will see two multi-line text boxes containing JavaScript code. The first contains a small form that contains your search box, the second is pure JavaScript that aids in the rendering of your search results.

Using the Google-generated Search Box Code Outside of the Server-side FORM Tag

You can use the search box code generated by Google, provided you place it outside of your web form’s server-side FORM tag. I tested this locally, and it worked beautifully. However, I’m sure I’m not alone in wanting the ability to put the search box somewhere inside the server-side FORM tag and still have my custom search engine operate correctly.

Using ASP.NET Server Controls and HtmlControls to Emulate Google's Search Box Inside the Server-side FORM Tag

I solved this problem by using ASP.NET server controls and HtmlControls to emulate the behavior of Google’s search box form, while still providing the server-side capabilities that we all know and love.

You’ll need to reference the search box JavaScript/HTML code from the Custom Search Engine control panel. I simply included it in my ASPX page in an HTML comment. This is what it looks like:

ASP.NET
<!-- SAMPLE CODE ONLY - REPLACE WITH YOUR OWN -->
<!-- Google CSE Search Box Begins -->
<form id="searchbox_014373149466545347614:dygl7dqicp4" action="Default.aspx">
  <input type="hidden" name="cx" value="014373149466545347614:dygl7dqicp4" />
  <input name="q" type="text" size="40" />
  <input type="submit" name="sa" value="Search" />
  <input type="hidden" name="cof" value="FORID:9" />
</form>
<script type="text/javascript" 
  src="http://www.google.com/coop/cse/brand?form=
       searchbox_014373149466545347614%3Adygl7dqicp4"></script>
<!-- Google CSE Search Box Ends -->

You’ll need four ASP.NET controls to mimic the functionality of this form:

  • A HiddenField control to mimic cx
  • A TextBox control to mimic q
  • Another HiddenField control to mimic cof
  • A Button control to mimic sa

I also added a RequiredFieldValidator to prevent postbacks from happening when the user tries to submit the search query with an empty TextBox.

Here are the control declarations from the ASPX file:

ASP.NET
<asp:TextBox ID="q" MaxLength="512" Width="275px" AutoPostBack="false" runat="server" />
<asp:Button ID="_btnSearch" Text="Google Search" 
     OnClick="_btnSearch_Click" runat="server" />
<asp:RequiredFieldValidator ID="_rfvQ" ControlToValidate="q" runat="server" />

<asp:HiddenField ID="cx" Value="014373149466545347614:dygl7dqicp4" runat="server" />
<asp:HiddenField ID="cof" Value="FORID:9" runat="server" />

The “dummyHidden” Input Control

You’ll notice in the ASPX page that there is a plain HTML input control called dummyHidden that is never visible to the user. This is necessary in order to force the search button’s Click event to fire on the server side when the search text box has focus and the user hits the Enter key. This only works when there are two or more text boxes in the form. Based on my research, this appears to be an Internet Explorer-specific problem, and it was the only available workaround I could find. If you have a better solution, please let me know.

Finally, you’ll need to copy the SCRIPT include and place it somewhere in your ASPX page.

The Search Results

For this article, the search results are displayed on the same page as the search box. No ASP.NET emulation is necessary here. Simply copy the JavaScript code and paste it into your ASPX file where you want the search results to appear. Here is what it looks like in my ASPX file:

ASP.NET
<!-- SAMPLE CODE ONLY - REPLACE WITH YOUR OWN -->
<!-- Google Search Result Snippet Begins -->
<div id="results_014373149466545347614:dygl7dqicp4"></div>
<script type="text/javascript">
  var googleSearchIframeName = "results_014373149466545347614:dygl7dqicp4";
  var googleSearchFormName = "searchbox_014373149466545347614:dygl7dqicp4";
  var googleSearchFrameWidth = 600;
  var googleSearchFrameborder = 0;
  var googleSearchDomain = "www.google.com";
  var googleSearchPath = "/cse";
</script>
<script type="text/javascript" 
  src="http://www.google.com/afsonline/show_afs_search.js"></script>
<!-- Google Search Result Snippet Ends -->

Code-behind: Button.Click

This is where the magic happens. Mercifully, Google uses the GET method to send form data, so we merely need to append our search parameters to the query string and redirect the user to the search results page. For this article, that means simply redirecting the user back to the same page, though the results could easily be displayed on a separate physical page.

The search query from the q TextBox and the HiddenField values are all needed in the query string. See the code below:

C#
protected void _btnSearch_Click (Object sender, EventArgs e)
{
    if (!IsValid)
        return;

    Response.Redirect (
        String.Format(
            "Default.aspx?q={0}&cx={1}&cof={2}",
            HttpUtility.UrlEncode (SanitizeUserInput (q.Text.Trim ())),
            HttpUtility.UrlEncode (cx.Value),
            HttpUtility.UrlEncode (cof.Value)
            ),
        false
        );

    Context.ApplicationInstance.CompleteRequest ();
}

Important: Be sure to take the time to sanitize and URL-encode the user’s input. I have provided a basic function for doing so, but it is your responsibility to ensure that your applications are safe.

Code-behind: Page.Load

The last bit of code is in the page’s Load event handler. All it does is look for the querystring parameter q, and if it exists, it puts that value in the TextBox q so that the user can see the term for which they last searched. Note that this only happens when the request is not a postback. Because of the redirect, we can’t use ViewState to keep track of the last search term.

Again: Remember to sanitize all user input. Your application’s safety is your responsibility!

C#
protected void Page_Load (Object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        String query = Request.QueryString["q"];
        if (!String.IsNullOrEmpty (query))
        {
            q.Text = SanitizeUserInput (HttpUtility.UrlDecode (query.Trim ()));
        }
    }
}

Conclusion

Well, there you have it. With one simple ASP.NET form, we have created a custom search engine that searches only pages on The Code Project. Google Co-op has done an extraordinary job in making this such a simple task for us end users.

History

  • 2006-10-27: Initial release.
  • 2013-12-19: Removed the link to the live demo. 

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior) Sagara Software, Inc.
United States United States
Jon is a senior software developer who loves using .NET to solve problems.

When he's not fooling around with computers or reading, he's busy spending time with his super wife, Kelly, and his three boys. He also likes to take his mountain bike for a spin.

Visit my blog

Comments and Discussions

 
AnswerRe: How it will be in vb.net? Pin
Nika Asgari7-Sep-08 2:06
Nika Asgari7-Sep-08 2:06 
GeneralThanks Pin
snashter26-Jan-08 5:59
snashter26-Jan-08 5:59 
GeneralAnother way of doing it is Javascript Pin
YanDav24-Jan-08 21:31
YanDav24-Jan-08 21:31 
GeneralKeep redirecting to result page after click Back button Pin
kunthea16-Jan-08 23:30
kunthea16-Jan-08 23:30 
GeneralThanks! Pin
abidur9-Jan-08 6:48
abidur9-Jan-08 6:48 
Questioncan we modify code? Pin
pravin parmar28-Nov-07 23:11
pravin parmar28-Nov-07 23:11 
GeneralThank You! Pin
KinnMirr4-Oct-07 10:24
KinnMirr4-Oct-07 10:24 
GeneralSearch works only for first time only Pin
Aamir Bashir12-Sep-07 20:55
Aamir Bashir12-Sep-07 20:55 
Thanks for the very helpful article.

I am using search in my personal website. Whenever I search something, search results page flicker two times. Means search results are displayed once and page refreshes again.

2nd issue is search works only first time. For example I search for "yahoo" when I open the page first time, and later I search "Hotmail" it always shows the search results against keyword "Yahoo".

Anybody help please !

Aamir Bashir

GeneralProblem with code Pin
The Apocalypse7-Aug-07 23:58
The Apocalypse7-Aug-07 23:58 
GeneralRe: Problem with code Pin
Jerode27-Sep-07 10:22
Jerode27-Sep-07 10:22 
GeneralExport Result to Excel file Pin
Ortiga23-Jul-07 6:03
Ortiga23-Jul-07 6:03 
GeneralNo results are shown Pin
Lord of Scripts26-Jun-07 23:36
Lord of Scripts26-Jun-07 23:36 
GeneralRequest Validation Pin
Lord of Scripts26-Jun-07 22:51
Lord of Scripts26-Jun-07 22:51 
GeneralSearch box disables other buttons on same page Pin
KennyGZ25-Jun-07 11:32
KennyGZ25-Jun-07 11:32 
AnswerRe: Search box disables other buttons on same page Pin
KennyGZ26-Jun-07 8:42
KennyGZ26-Jun-07 8:42 
Generalsearch results page url Pin
pathless1-Jun-07 16:40
pathless1-Jun-07 16:40 
QuestionPassword Protected Sites Pin
kengineer17-May-07 6:48
kengineer17-May-07 6:48 
QuestionWhat if the search box is in a usercontrol? Pin
orengold5-Mar-07 17:13
orengold5-Mar-07 17:13 
GeneralMasterpage problem [modified] Pin
kemall28-Feb-07 4:12
kemall28-Feb-07 4:12 
GeneralRe: Masterpage problem Pin
Jon Sagara28-Feb-07 4:40
Jon Sagara28-Feb-07 4:40 
GeneralRe: Masterpage problem Pin
kemall28-Feb-07 5:49
kemall28-Feb-07 5:49 
GeneralRe: Masterpage problem Pin
Jon Sagara28-Feb-07 7:01
Jon Sagara28-Feb-07 7:01 
QuestionResult page reloads twice Pin
Jes M George19-Feb-07 23:34
Jes M George19-Feb-07 23:34 
AnswerRe: Result page reloads twice Pin
orengold5-Mar-07 17:03
orengold5-Mar-07 17:03 
GeneralRe: Result page reloads twice Pin
Bordi7-May-07 7:26
Bordi7-May-07 7:26 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.