谷歌浏览器的源码分析 11

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                上一次介绍到怎么样从其它地方返回搜索到的超级连接,现在就来分析一下使用搜索引擎去查找的类SearchProvider,它是通过搜索引擎来查找出来的,在这里是通过GOOGLE搜索引擎来查找出来。它的声明如下:

#001  // Autocomplete provider forsearches and suggestions from a search engine.

#002  //

#003  // After construction, theautocomplete controller repeatedly calls Start()

#004  // with some user input,each time expecting to receive a small set of the best

#005  // matches (eithersynchronously or asynchronously).

#006  //

#007  // Initially the providercreates a match that searches for the current input

#008  // text.  It also starts a task to query the Suggestservers.  When that data

#009  // comes back, the providercreates and returns matches for the best

#010  // suggestions.

 

SearchProvider类是继承AutocompleteProviderURLFetcher类,AutocompleteProvider提供一个自动完成的结果,URLFetcher主要提供从URL获取数据和状态。

#011  class SearchProvider :public AutocompleteProvider,

#012                        public URLFetcher::Delegate {

#013   public:

#014    SearchProvider(ACProviderListener*listener, Profile* profile)

#015        :AutocompleteProvider(listener, profile, "Search"),

#016         last_default_provider_(NULL),

#017          fetcher_(NULL),

#018         history_request_pending_(false),

#019          have_history_results_(false),

#020         suggest_results_pending_(false),

#021         have_suggest_results_(false) {

#022    }

#023 

 

 

开始获取。

#024    // AutocompleteProvider

#025    virtual void Start(constAutocompleteInput& input,

#026                       boolminimal_changes,

#027                       boolsynchronous_only);

 

停止查找。

#028    virtual void Stop();

#029 

 

当获取到数据回来时响应。

#030    // URLFetcher::Delegate

#031    virtual voidOnURLFetchComplete(const URLFetcher* source,

#032                                    const GURL& url,

#033                                   const URLRequestStatus& status,

#034                                   int response_code,

#035                                   const ResponseCookies& cookies,

#036                                    const std::string&data);

#037 

#038   private:

#039    struct NavigationResult {

#040      NavigationResult(conststd::wstring& url, const std::wstring& site_name)

#041          : url(url),

#042           site_name(site_name) {

#043      }

#044 

#045      // The URL.

#046      std::wstring url;

#047 

#048      // Name for the site.

#049      std::wstring site_name;

#050    };

#051 

 

保存返回的结果。

#052    typedefstd::vector<std::wstring> SuggestResults;

#053    typedefstd::vector<NavigationResult> NavigationResults;

#054    typedefstd::vector<history::KeywordSearchTermVisit> HistoryResults;

#055    typedefstd::map<std::wstring, AutocompleteMatch> MatchMap;

#056 

 

运行获取搜索引擎数据。

#057    // Called when timer_expires.

#058    void Run();

#059 

#060    // Determines whether anasynchronous subcomponent query should run for the

#061    // current input.  If so, starts it if necessary; otherwisestops it.

#062    // NOTE: These functionsdo not update |done_|.  Callers must doso.

#063    voidStartOrStopHistoryQuery(bool minimal_changes, bool synchronous_only);

#064    voidStartOrStopSuggestQuery(bool minimal_changes, bool synchronous_only);

#065 

#066    // Functions to stop theseparate asynchronous subcomponents.

#067    // NOTE: These functionsdo not update |done_|.  Callers must doso.

#068    void StopHistory();

#069    void StopSuggest();

#070 

#071    // Called back by thehistory system to return searches that begin with the

#072    // input text.

#073    voidOnGotMostRecentKeywordSearchTerms(

#074       CancelableRequestProvider::Handle handle,

#075        HistoryResults*results);

#076 

#077    // Parses the results fromthe Suggest server and stores up to kMaxMatches of

#078    // them inserver_results_.  Returns whether parsingsucceeded.

#079    boolParseSuggestResults(Value* root_val);

#080 

#081    // Converts the parsedserver results in server_results_ to a set of

#082    // AutocompleteMatches andadds them to |matches_|.  This also sets|done_|

#083    // correctly.

#084    voidConvertResultsToAutocompleteMatches();

#085 

#086    // Determines therelevance for a particular match.  We usedifferent scoring

#087    // algorithms for thedifferent types of matches.

#088    int CalculateRelevanceForWhatYouTyped()const;

#089    // |time| is the time atwhich this query was last seen.

#090    intCalculateRelevanceForHistory(const Time& time) const;

#091    // |suggestion_value| iswhich suggestion this is in the list returned from

#092    // the server; the bestsuggestion is suggestion number 0.

#093    intCalculateRelevanceForSuggestion(size_t suggestion_value) const;

#094    // |suggestion_value| issame as above.

#095    intCalculateRelevanceForNavigation(size_t suggestion_value) const;

#096 

#097    // Creates anAutocompleteMatch for "Search <engine> for |query_string|" with

#098    // the suppliedrelevance.  Adds this match to |map|; ifsuch a match already

#099    // exists, whichever onehas lower relevance is eliminated.

#100    void AddMatchToMap(conststd::wstring& query_string,

#101                       intrelevance,

#102                       intaccepted_suggestion,

#103                      MatchMap* map);

#104    // Returns anAutocompleteMatch for a navigational suggestion.

#105    AutocompleteMatchNavigationToMatch(const NavigationResult& query_string,

#106                                        intrelevance);

#107 

#108    // Trims "http:"and up to two subsequent slashes from |url|. Returns the

#109    // number of charactersthat were trimmed.

#110    // TODO(kochi): this is duplicate fromhistory_autocomplete

#111    static size_tTrimHttpPrefix(std::wstring* url);

#112 

#113    // Don't send any queriesto the server until some time has elapsed after

#114    // the last keypress, toavoid flooding the server with requests we are

#115    // likely to end upthrowing away anyway.

#116    static const intkQueryDelayMs;

#117 

#118    // The user's input.

#119    AutocompleteInput input_;

#120 

#121    TemplateURLdefault_provider_;  // Cached across thelife of a query so we

#122                                   // behave consistently even if the user

#123                                   // changes their default while the query is

#124                                    // running.

#125    const TemplateURL*last_default_provider_;

#126                                   // TODO(pkasting): http://b/1162970 We

#127                                   // shouldn't need this.

#128 

#129    // An object we can use tocancel history requests.

#130    CancelableRequestConsumerhistory_request_consumer_;

#131 

#132    // Searches in the user'shistory that begin with the input text.

#133    HistoryResultshistory_results_;

#134 

#135    // Whether history_results_is valid (so we can tell invalid apart from

#136    // empty).

#137    boolhave_history_results_;

#138 

#139    // Whether we are waitingfor a history request to finish.

#140    boolhistory_request_pending_;

#141 

#142    // True if we're expectingsuggest results that haven't yet arrived. This

#143    // could be because either|timer_| or |fetcher| is still running (see below).

#144    boolsuggest_results_pending_;

#145 

#146    // A timer to start aquery to the suggest server after the user has stopped

#147    // typing for long enough.

#148   base::OneShotTimer<SearchProvider> timer_;

#149 

#150    // The fetcher thatretrieves suggest results from the server.

#151   scoped_ptr<URLFetcher> fetcher_;

#152 

#153    // Suggestions returned bythe Suggest server for the input text.

#154    SuggestResultssuggest_results_;

#155 

#156    // Navigationalsuggestions returned by the server.

#157    NavigationResultsnavigation_results_;

#158 

#159    // Whether suggest_results_is valid.

#160    boolhave_suggest_results_;

#161 

#162   DISALLOW_EVIL_CONSTRUCTORS(SearchProvider);

#163  };

#164 

 

在这个类里先调用函数SearchProvider::Start来获取缺省的搜索引擎,然后停止以前的搜索,接着SearchProvider::Run()函数里使用URLFetcher获取数据回来,它的代码如下:

#001   void SearchProvider::Run(){

#002    // Start a new requestwith the current input.

#003    DCHECK(!done_);

 

获取搜索的URL

#004    const TemplateURLRef*const suggestions_url =

#005       default_provider_.suggestions_url();

 

建议代替的字符。

#006   DCHECK(suggestions_url->SupportsReplacement());

 

开始新的搜索。

#007    fetcher_.reset(newURLFetcher(GURL(suggestions_url->ReplaceSearchTerms(

#008        default_provider_,input_.text(),

#009       TemplateURLRef::NO_SUGGESTIONS_AVAILABLE, std::wstring())),

#010        URLFetcher::GET,this));

#011   fetcher_->set_request_context(profile_->GetRequestContext());

#012    fetcher_->Start();

#013  }

 

当前上面的搜索完成时,就会通知SearchProvider::OnURLFetchComplete函数来分析返回的结果,最后调用SearchProvider::ConvertResultsToAutocompleteMatches()函数来把结果转换自动完成的列表项。

 

通过上面的分析,就了解通过GOOGLE搜索引擎自动完成功能的实现。

 

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值