
The Basic search help article covers all the most common issues , but sometimes you need a little bit more power . This document will highlight the more advanced features of Google Web Search . Have in mind though that even very advanced searchers , such as the members of the search group at Google , use these features less than 5 % of the time . Basic simple search is often enough . As always , we use square brackets [ ] to denote queries , so [ to be or not to be ] is an example of a query ; [ to be ] or [ not to be ] are two examples of queries . Phrase search ( " " ) By putting double quotes around a set of words , you are telling Google to consider the exact words in that exact order without any change . Google already uses the order and the fact that the words are together as a very strong signal and will stray from it only for a good reason , so quotes are usually unnecessary . By insisting on phrase search you might be missing good results accidentally . For example , a search for [ " Alexander Bell " ] ( with quotes ) will miss the pages that refer to Alexander G. Bell . Search within a specific website ( site : ) Google allows you to specify that your search results must come from a given website . For example , the query [ iraq site : nytimes . com ] will return pages about Iraq but only from nytimes . com . The simpler queries [ iraq nytimes . com ] or [ iraq New York Times ] will usually be just as good , though they might return results from other sites that mention the New York Times . You can also specify a whole class of sites , for example [ iraq site : . gov ] will return results only from a . gov domain and [ iraq site : . iq ] will return results only from Iraqi sites . Terms you want to exclude ( - ) Attaching a minus sign immediately before a word indicates that you do not want pages that contain this word to appear in your results . The minus sign should appear immediately before the word and should be preceded with a space . For example , in the query [ anti-virus software ] , the minus sign is used as a hyphen and will not be interpreted as an exclusion symbol ; whereas the query [ anti-virus -software ] will search for the words 'anti-virus ' but exclude references to software . You can exclude as many words as you want by using the - sign in front of all of them , for example [ jaguar -cars -football -os ] . The - sign can be used to exclude more than just words . For example , place a hyphen before the 'site : ' operator ( without a space ) to exclude a specific site from your search results . Fill in the blanks ( * ) The * , or wildcard , is a little-known feature that can be very powerful . If you include * within a query , it tells Google to try to treat the star as a placeholder for any unknown term(s ) and then find the best matches . For example , the search [ Google * ] will give you results about many of Google 's products ( go to next page and next page -- we have many products ) . The query [ Obama voted * on the * bill ] will give you stories about different votes on different bills . Note that the * operator works only on whole words , not parts of words . Search exactly as is ( + ) Google employs synonyms automatically , so that it finds pages that mention , for example , childcare for the query [ child care ] ( with a space ) , or California history for the query [ ca history ] . But sometimes Google helps out a little too much and gives you a synonym when you do n't really want it . By attaching a + immediately before a word ( remember , do n't add a space after the + ) , you are telling Google to match that word precisely as you typed it . Putting double quotes around a single word will do the same thing . The OR operator Google 's default behavior is to consider all the words in a search . If you want to specifically allow either one of several words , you can use the OR operator ( note that you have to type 'OR ' in ALL CAPS ) . For example , [ San Francisco Giants 2004 OR 2005 ] will give you results about either one of these years , whereas [ San Francisco Giants 2004 2005 ] ( without the OR ) will show pages that include both years on the same page . The symbol | can be substituted for OR . ( The AND operator , by the way , is the default , so it is not needed . ) Exceptions Search is rarely absolute . Search engines use a variety of techniques to imitate how people think and to approximate their behavior . As a result , most rules have exceptions . For example , the query [ for better or for worse ] will not be interpreted by Google as an OR query , but as a phrase that matches a ( very popular ) comic strip . Google will show calculator results for the query [ 34 * 87 ] rather than use the 'Fill in the blanks ' operator . Both cases follow the obvious intent of the query . Here is a list of exceptions to some of the rules and guidelines that were mentioned in this and the Basic Search Help article : Exceptions to 'Every word matters ' Words that are commonly used , like 'the , ' 'a , ' and 'for , ' are usually ignored ( these are called stop words ) . But there are even exceptions to this exception . The search [ the who ] likely refers to the band ; the query [ who ] probably refers to the World Health Organization -- Google will not ignore the word 'the ' in the first query . Synonyms might replace some words in your original query . ( Adding + before a word disables synonyms . ) A particular word might not appear on a page in your results if there is sufficient other evidence that the page is relevant . The evidence might come from language analysis that Google has done or many other sources . For example , the query [ overhead view of the bellagio pool ] will give you nice overhead pictures from pages that do not include the word 'overhead . ' Punctuation that is not ignored Punctuation in popular terms that have particular meanings , like [ C++ ] or [ C# ] ( both are names of programming languages ) , are not ignored . The dollar sign ( $ ) is used to indicate prices . [ nikon 400 ] and [ nikon $400 ] will give different results . The hyphen - is sometimes used as a signal that the two words around it are very strongly connected . ( Unless there is no space after the - and a space before it , in which case it is a negative sign . ) The underscore symbol _ is not ignored when it connects two words , e. g. [ quick_sort ] . 