青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

學著站在巨人的肩膀上

金融數學,InformationSearch,Compiler,OS,

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  12 隨筆 :: 0 文章 :: 8 評論 :: 0 Trackbacks

#

由上一篇文章[原]自頂向下學搜索引擎——北大天網搜索引擎TSE分析及完全注釋[1]尋找搜索引擎入口 我們可以知道整個程序是從TSESearch.cpp 中的main函數開始的我們重點一下這段代碼

//TSESearch.cpp CQuery iQuery;
 iQuery.GetInputs();  //具體程序開始執行
 // current query & result page number
 iQuery.SetQuery();
 iQuery.SetStart();

 // begin to search
 //開始具體搜索程序
 gettimeofday(&begin_tv,&tz); //開始計時獲取程序運行時間差

 iQuery.GetInvLists(mapBuckets);  //將所有字符集存入映射變量中 瓶頸所在
 iQuery.GetDocIdx(vecDocIdx);  //將倒排索引存入向量中  瓶頸所在
 
 CHzSeg iHzSeg;  //include ChSeg/HzSeg.h
 iQuery.m_sSegQuery = iHzSeg.SegmentSentenceMM(iDict, iQuery.m_sQuery); //將get到的查詢變量分詞分成 "我/  愛/  你們/ 的/  格式"
 
 vector vecTerm;
 iQuery.ParseQuery(vecTerm);  //將以"/"劃分開的關鍵字一一順序放入一個向量容器中
 
 set setRelevantRst;
 iQuery.GetRelevantRst(vecTerm, mapBuckets, setRelevantRst);
 
 gettimeofday(&end_tv,&tz);
 // search end
 //搜索完畢按照順序我們首先深入進iQuery對象的類CQuery  

//Query.cpp

1、GetInputs

這個方法的功能是將前臺get過來的變量轉換到HtmlInputs結構體數組中如下例子和代碼:

//假設前臺查詢的關鍵字是"1"著HtmlInputs中內容輸出如下  //HtmlInputs[0].Name word  //HtmlInputs[0].Value 1  //HtmlInputs[1].Name www  //HtmlInputs[1].Value 搜索  //HtmlInputs[2].Name cdtype  //HtmlInputs[2].Value GB

 
/*
 * Get form information throught environment varible.
 * return 0 if succeed, otherwise exit.
 */
/**
 * 程序翻譯說明
 * 處理GET過來的表單
 *
 * @access  public
 * @return  string 0
 */
int CQuery::GetInputs()
{
    int i,j;
 char *mode = getenv("REQUEST_METHOD"); //返回環境變量的值 這里環境變量 REQUEST_METHOD 為 get 方法
    char *tempstr; //GET變量字符串或POST字符串內容
 char *in_line; 
 int length;  //GET變量串長度或POST內容長度

 cout << "Content-type: text/html\n\n";
 //cout << "Cache-Control: no-cache\n";
 //cout << "Expires: Tue, 08 Apr 1997 17:20:00 GMT\n";
 //cout << "Expires: 0\n";
 //cout << "Pragma: no-cache\n\n";

 cout << "\n";
 cout << "\n";
 //cout << "\n";
 //cout << "\n";
 //cout << "\n";
 cout << "\n";
 cout.flush(); //釋放輸出緩沖區 輸出頭部head和之前的html標簽內容
 //cout <<"" << endl;

 if (mode==NULL) return 1;

 if (strcmp(mode, "POST") == 0)
 {
  length = atoi(getenv("CONTENT_LENGTH")); //如果是POST方法著獲得環境變量CONTENT_LENGTH的整型值
  if (length==0 || length>=256)
   return 1;
  in_line = (char*)malloc(length + 1);
  read(STDIN_FILENO, in_line, length);
  in_line[length]='\0';
 }
 else if (strcmp(mode, "GET") == 0)
 {
  char* inputstr = getenv("QUERY_STRING"); //如果是GET方法著獲得環境變量QUERY_STRING的字符串值
  length = strlen(inputstr);
  if (inputstr==0 || length>=256)
   return 1;

  //獲取get內容長度并把get ?后面的參數賦值給變量in_line
  in_line = (char*)malloc(length + 1);
  strcpy(in_line, inputstr); //小心溢出攻擊
 }


 tempstr = (char*)malloc(length + 1); //獲取post內容或get內容長度
 if(tempstr == NULL)
 {
  printf("\n");
  printf("\n");
  printf("Major failure #1;please notify the webmaster\n");
  printf("\n");
  fflush(stdout); //輸出緩沖區
  exit(2); //錯誤返回
 }

 j=0;
 for (i=0; i char
   strcpy(HtmlInputs[HtmlInputCount].Name,tempstr);
   if (i == length - 1)
   {
    strcpy(HtmlInputs[HtmlInputCount].Value,"");
    HtmlInputCount++;
   }
   j=0;
  }
  else if ((in_line[i] == '&') || (i==length-1))
  {
   if (i==length-1)
   {
    if(in_line[i] == '+')tempstr[j]=' ';
    else tempstr[j] = in_line[i];
    j++;
   }
   tempstr[j]='\0';
   CStrFun::Translate(tempstr); //將URL編碼形式的參數轉換成字符型 %** -> char
   strcpy(HtmlInputs[HtmlInputCount].Value,tempstr);
   HtmlInputCount++;
   j=0;
  }
  else if (in_line[i] == '+')
  {
   tempstr[j]=' ';
   j++;
  }
  else
  {
   tempstr[j]=in_line[i]; //組合get中的變量如word www cdtype
   j++;
  }
  //cout<";
  //cout<";
  //cout.flush();
 }

 /*
 for (int kk = 0; kk < HtmlInputCount ; ++kk )
 {
  cout<<"Name="<";
  cout<<"Value="<";
 }
 //假設前臺查詢的關鍵字是"1"輸出如下
 //Name=word
 //Value=1
 //Name=www
 //Value= 搜索
 //Name=cdtype
 //Value=GB
 */

 if(in_line) free(in_line);
 if(tempstr) free(tempstr);

 return 0;
}
 
2、SetQuery
 
//Query.cpp
void CQuery::SetQuery()
{
 string q = HtmlInputs[0].Value;
 CStrFun::Str2Lower(q,q.size()); //大寫變小寫
 m_sQuery = q;  //準備查詢關鍵字
}
3、SetStart
void CQuery::SetQuery()
{
 string q = HtmlInputs[0].Value;
 CStrFun::Str2Lower(q,q.size()); //大寫變小寫word變量里的值
 m_sQuery = q;  //設置查詢關鍵字
}

4、GetInvLists
 bool CQuery::GetInvLists(map<string, string> &mapBuckets) const
{
 ifstream ifsInvInfo(INF_INFO_NAME.c_str(), ios::binary); //以二進制形式打開一個文件的輸入流緩沖,INF_INFO_NAME在頭文件Comm.h中定義了的, const string INF_INFO_NAME("./Data/sun.iidx");
 //倒排索引文件索引字和文檔好之間有一個制表符"\t"
 //朱德  14383 16151 16151 16151 1683 207 6302 7889 8218 8218 8637
 //朱古力  1085 1222
 
 if (!ifsInvInfo) {
  cerr << "Cannot open " << INF_INFO_NAME << " for input\n";
  return false;
 }
 string strLine, strWord, strDocNum;
 //以行讀取輸入流緩沖到字符串對象strLine中并做處理
 while (getline(ifsInvInfo, strLine)) {
  string::size_type idx;
  string tmp;
  idx = strLine.find("\t");
  strWord = strLine.substr(0,idx);
  strDocNum = strLine.substr(idx+1);
  mapBuckets.insert(map<string,string>::value_type (strWord, strDocNum)); //倒排表二項二維表存入映射中
 
  /*
  map<string, string>::iterator iter;
  int kkk = 0;
  for (iter = mapBuckets.begin(); kkk != 10; ++iter)
  {
   cout<<iter->first<<"  "<<iter->second<<"<br>";
   ++kkk;
  }
  cout.flush();
  */
 }
 return true;
}
 
5、GetDocIdx
 
bool CQuery::GetDocIdx(vector &vecDocIdx) const
{
 ifstream ifs(DOC_IDX_NAME.c_str(), ios::binary); 
 //0  0  bc9ce846d7987c4534f53d423380ba70
 //1  76760 4f47a3cad91f7d35f4bb6b2a638420e5
 //2  141624 d019433008538f65329ae8e39b86026c

 if (!ifs) {
  cerr << "Cannot open " << DOC_IDX_NAME << " for input\n"; //以二進制形式打開一個文件的輸入流緩沖,DOC_IDX_NAME在頭文件Comm.h中定義了的, const string INF_INFO_NAME("./Data/Doc.idx"); 
  return false;
 }

 string strLine, strDocid, strUrl;
 while (getline(ifs,strLine)){
  DocIdx di;

  sscanf( strLine.c_str(), "%d%d", &di.docid, &di.offset ); //只保留了前面兩項文檔號和偏移量
  vecDocIdx.push_back(di); //導入結構體向量中
 }

 return true;
}

 

posted @ 2009-12-10 22:52 學者站在巨人的肩膀上 閱讀(1074) | 評論 (0)編輯 收藏

由于百度博客http://hi.baidu.com/jrckkyy發表文章字數有限,以后原創文章全部都先發表到csdn和cu上,再發表到百度博客上,百度博客除了放原創的文章還主要放網上尋找到的優秀文章。

本著黑客精神我將陸續把最近分析注釋TSE搜索引擎的心得發布出來,老鳥,大蝦,大牛,高手飄過就是了,若愿意浪費指點下小弟的在下不甚感激,有問題的朋友直接留言討論。由于本人水平有限,分析和翻譯難免有錯大家見笑了。

上學期拜讀了James F.Kurose著的《計算機網絡-自頂向下方法與internet特色(第三版陰影)》,覺得寫得確實不錯(希望沒看的朋友一定要買來看看),自己也來搞個高自頂向下的學習方法,先從用戶看得到的東西出發分析研究搜索引擎,下面我們就來看看各大搜索引擎搜索界面的代碼,你所需要特別注意的是form表單中的action

雅虎http://www.yohoo.com/

<form name=s1 style="margin-bottom:0" action="<table cellpadding=0 cellspacing=0 border=0><tr><td>
<input type=text size=30 name=p title="enter search terms here">&nbsp;
<input type=submit value=Search>&nbsp;&nbsp;</td><td><font face=arial size=-2>·&nbsp;
<a href="
search</a><br>·&nbsp;
<a href="
popular</a></font></td></tr></table></form>
谷歌
http://www.g.cn

<form method=GET action=/search><tr><td nowrap>
<font size=-1><input type=text name=q size=41 maxlength=2048 value="jrckkyy" title="Google 搜索"> <input type=submit name=btnG value="Google 搜索"><input type=hidden name=complete value=1><input type=hidden name=hl value="zh-CN"><input type=hidden name=newwindow value=1><input type=hidden name=sa value="2"></font></td></tr></form>
百度http://www.baidu.com

<form name=f2 action="/s">
<tr valign="middle">
<td nowrap>
<input type=hidden name=ct value="0">
<input type=hidden name=ie value="gb2312">
<input type=hidden name=bs value="jrckkyy">
<input type=hidden name=sr>
<input type=hidden name=z value="">
<input type=hidden name=cl value=3>
<input type=hidden name=f value=8>
<input name=wd size="35" class=i value="jrckkyy" maxlength=100>
<input type=submit value=百度一下> <input type=button value=結果中找 onclick="return bq(f2,1,0);">&nbsp;&nbsp;&nbsp;</td>
<td nowrap><a href="</tr>
</form>
天網
http://www.tianwang.com/

<form name=f action="/cgi-bin/tw" method=get>
                <td valign=center width=634 background=images/index_image_02.gif>
                    <table height=46 cellspacing=0 cellpadding=0 width=600 align=right  border=0>
                        <tbody>
                            <tr>
                                <td height=50>
                                    <table cellspacing=0 cellpadding=0 width=600 border=0>
                                        <tbody>
                                            <tr>
                                  <td width="524" height="30" valign="bottom">
                                        <div align="center">                                  <input name="word" type="text" size="40" maxlength="255" onClick="this.focus();checkWord(this,1)" onblutesr='checkWord(this,0)' value='請輸入資源名稱'>
                                            <font color=#ffffff> &nbsp;
                                            <select onChange=reRange(this.selectedIndex) name=range>
                                                <script language=javascript>...
                           <!--
                           for(var i = 0; i < rescode.length; i++) ...{
                               if(i == 0) ...{
                                   document.write('<option value="0" selected>' + rescode[i][0] + '</option>');
                               } else ...{
                                   document.write('<option value="' + i + '">' + rescode[i][0] + '</option>');
                               }
                           }
                           document.f.range.selectedIndex = 0;
                           -->
                         </script>
                                            </select>
                                            </font>-<font color=#ffffff>
                                            <select name=cd>
                                                <script language=javascript>...
                           <!--
                           var ind = document.f.range.selectedIndex;
                           var len = (rescode[ind].length - 1) / 2;
                           var sel = 0;
                           for(var i = 0; i < len; i++) ...{
                               document.write('<option value="' + rescode[ind][2*i+1] + '">' + rescode[ind][2*i+2] + '</option>');
                               if(rescode[ind][2*i+1] == 0)
                                   sel = i;
                           }
                           document.f.cd.selectedIndex = sel;
                           -->
                 </script>
                                            </select>
                                            </font></div>
                                    </td>
                <td width="71" valign="bottom"><input id=submit2 type=image height=22 width=40 src="images/so2.gif" align=absMiddle name=submit></td>
              </tr>
                                            <tr>
                                                <td colspan=3 height=25 class=style16>
                                                    <div align=center></div>
                                                </td>
                                            </tr>
                                        </tbody>
                                    </table>
                                </td>
                            </tr>
                        </tbody>
                    </table>
                </td>
            </form>
測試服務器TSE:

<form method="get" action="/cgi-bin/index/TSESearch" name="tw">
        <td width="100%" height="25" align="center">                          
        <input type="text" name="word" size="55">
        <input type="submit" value=" 搜索" name="www">
        </td>                          
        <input type="hidden" name="cdtype" value="GB">                        
        </form>   
由以上幾個form的屬性可以看出全部采用的是get方法,CGI做為處理程序,也就是C/C++,CGI全稱是“公共網關界面”(Common Gateway Interface),HTTP服務器與你的或其它機器上的程序進行“交談”的一種工具,其程序須運行在網絡服務器上。CGI逐漸被近幾年來的PHP,JAVA,ASP,PERL,Python,Ruby等動態語言所取代。但是其在速度和運行效率上的優勢是無法取代的。

以下是TSE CGI入口程序注釋,其他搜索引擎的入口也應該類似

 

/**//**
 * 程序翻譯說明
 * @Copyright (c) 2008, 研發部
 * All rights reserved.
 *
 * @filesource  TSESearch.cpp
 * @author  jrckkyy <jrckkyy@163.com>
 *
 * Let's start
 *
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/time.h>
#include <unistd.h>

#include <iostream>
#include <fstream>
#include <list>

#include "Comm.h"    //包含2個索引和1個數據文件
#include "Query.h"    //包含數據查詢處理頭文件
#include "Document.h"    //html文檔處理頭文件
#include "StrFun.h"        //字符串處理頭文件
#include "ChSeg/Dict.h"    //字元字典處理頭文件
#include "ChSeg/HzSeg.h"   
#include "DisplayRst.h"    //返回查詢結果頁面頭文件,返回結果分為頭部,中部,底部

using namespace std;

/**//*
 * A inverted file(INF) includes a term-index file & a inverted-lists file.
 * A inverted-lists consists of many bucks(posting lists).
 * The term-index file is stored at vecTerm, and
 * the inverted-lists is sored at mapBuckets.
 */

/**//**
 * 程序翻譯說明
 * 搜索程序入口前臺關鍵字提交到該cgi程序 例如:./cgi-bin/index/TSESearch?word=123&start=1
 * 倒排文件包括一個記錄檢索詞文件和一個倒排列表文件。
 * 倒排列表包含很多標志(提交名單)。
 * 記錄檢索詞文件使用vecTerm來排序,和倒排列表是用mapBuckets來排序。
 *
 * @access  public
 * @param   int char 參數的漢字說明 用于接收前臺get傳遞的參數
 * @return  string 0
 */
int main(int argc, char* argv[])
...{
    struct timeval begin_tv, end_tv;
    struct timezone tz;

    CDict iDict;
    map<string, string> dictMap, mapBuckets;
    vector<DocIdx> vecDocIdx;    //Document。h

    CQuery iQuery;
    iQuery.GetInputs();        //具體程序開始執行
    // current query & result page number
    iQuery.SetQuery();
    iQuery.SetStart();

    // begin to search
    //開始具體搜索程序
    gettimeofday(&begin_tv,&tz);    //開始計時獲取程序運行時間差

    iQuery.GetInvLists(mapBuckets);        //將所有字符集存入映射變量中    瓶頸所在
    iQuery.GetDocIdx(vecDocIdx);        //將倒排索引存入向量中        瓶頸所在
   
    CHzSeg iHzSeg;        //include ChSeg/HzSeg.h
    iQuery.m_sSegQuery = iHzSeg.SegmentSentenceMM(iDict, iQuery.m_sQuery);    //將get到的查詢變量分詞分成 "我/        愛/        你們/    的/        格式"
   
    vector<string> vecTerm;
    iQuery.ParseQuery(vecTerm);        //將以"/"劃分開的關鍵字一一順序放入一個向量容器中
   
    set<string> setRelevantRst;
    iQuery.GetRelevantRst(vecTerm, mapBuckets, setRelevantRst);
   
    gettimeofday(&end_tv,&tz);
    // search end
    //搜索完畢

    //下面開始顯示
    CDisplayRst iDisplayRst;
    iDisplayRst.ShowTop();

    float used_msec = (end_tv.tv_sec-begin_tv.tv_sec)*1000
        +((float)(end_tv.tv_usec-begin_tv.tv_usec))/(float)1000;

    iDisplayRst.ShowMiddle(iQuery.m_sQuery,used_msec,
            setRelevantRst.size(), iQuery.m_iStart);

    iDisplayRst.ShowBelow(vecTerm,setRelevantRst,vecDocIdx,iQuery.m_iStart);

    return 0;

}

 

 

posted @ 2009-12-10 22:51 學者站在巨人的肩膀上 閱讀(2390) | 評論 (1)編輯 收藏

僅列出標題
共2頁: 1 2 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲福利精品| 国产精品久久久久一区二区三区共| 欧美人妖另类| 日韩午夜免费视频| 99国内精品久久| 国产精品美女久久久| 午夜一级久久| 欧美一区二区三区久久精品| 国内久久婷婷综合| 亚洲大胆人体视频| 欧美日韩一区二区在线观看视频| 亚洲与欧洲av电影| 国内成人精品2018免费看| 久久成人免费网| 免费观看成人鲁鲁鲁鲁鲁视频 | 欧美在线三级| 亚洲激情视频在线播放| 亚洲精品在线一区二区| 国产精品日韩久久久| 蜜臀久久99精品久久久久久9| 欧美99在线视频观看| 亚洲欧美日韩国产综合| 久久久久久久久综合| 中日韩高清电影网| 久久精品国产v日韩v亚洲 | 欧美日韩一区在线| 久久精品国产免费看久久精品| 免费观看成人| 久久精品人人爽| 欧美伦理一区二区| 久久久天天操| 国产精品第2页| 欧美黄色一区| 狠狠爱综合网| 中文一区字幕| 亚洲精品国产精品国自产在线 | 欧美精品久久天天躁| 久久av一区二区三区漫画| 欧美高清不卡| 老牛国产精品一区的观看方式| 欧美日韩一区二区三| 欧美aaa级| 国产亚洲福利一区| 中文亚洲欧美| 亚洲毛片一区二区| 久久久夜夜夜| 久久精品视频播放| 国产精品欧美在线| 99视频一区二区| 亚洲麻豆av| 欧美成人69| 欧美激情一区三区| 亚洲国产成人高清精品| 欧美中文字幕不卡| 久久本道综合色狠狠五月| 国产精品毛片va一区二区三区| 最新日韩在线视频| 亚洲精品偷拍| 欧美二区视频| 亚洲日本一区二区| 99国产精品久久久久老师| 欧美高清视频一二三区| 亚洲国产精品综合| 日韩亚洲欧美精品| 欧美国产日韩一区二区在线观看| 欧美暴力喷水在线| 亚洲国产天堂久久国产91| 久久亚洲一区二区三区四区| 老司机免费视频久久 | 欧美精品在欧美一区二区少妇| 欧美激情一区在线观看| 亚洲精品欧美极品| 欧美日韩国产欧| 一本色道久久综合亚洲精品小说| 一个色综合导航| 欧美性开放视频| 亚洲女女女同性video| 久久激情中文| 伊人久久亚洲热| 免费精品99久久国产综合精品| 亚洲第一福利视频| 亚洲天天影视| 亚洲日本成人女熟在线观看| 欧美日韩国产综合视频在线观看中文| 亚洲在线观看视频| 国产女主播一区| 久久亚洲午夜电影| 日韩午夜精品视频| 欧美在线三级| 亚洲人www| 国产精品三级久久久久久电影| 小黄鸭视频精品导航| 欧美成人免费在线| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产精品久久久久久久久久免费看| 亚洲欧美日韩综合| 亚洲成人直播| 欧美一区午夜视频在线观看| 在线观看福利一区| 国产精品www色诱视频| 欧美专区福利在线| 亚洲国产精品va在看黑人| 亚洲欧美日韩在线综合| 激情久久久久久久| 久久狠狠一本精品综合网| 欧美中文在线免费| 免费欧美在线| 亚洲图片激情小说| 欧美激情精品久久久久久变态| 亚洲一区在线直播| 亚洲国产福利在线| 国产精品自在在线| 欧美另类综合| 美女久久一区| 欧美亚洲一区| 亚洲午夜精品网| 亚洲精品无人区| 欧美黄色aaaa| 久久久欧美精品sm网站| 亚洲自拍偷拍色片视频| 亚洲精品中文在线| 亚洲高清在线观看| 国产伦精品一区二区三区视频孕妇 | 亚洲国产日韩在线| 国内精品久久久| 国产精品区一区二区三区| 欧美激情精品久久久久久久变态| 久久九九久精品国产免费直播 | 亚洲高清不卡在线| 久久久精品动漫| 欧美一区2区视频在线观看 | 国产精品一区二区久久国产| 欧美日韩大片| 欧美黄色日本| 欧美11—12娇小xxxx| 久久午夜视频| 久久亚洲国产精品一区二区| 久久电影一区| 久久国产日韩| 久久久91精品国产| 久久久久www| 久久夜色精品国产噜噜av| 久久成人免费网| 久久久蜜臀国产一区二区| 欧美中文在线免费| 久久久久一区二区| 鲁大师影院一区二区三区| 另类天堂av| 欧美激情aⅴ一区二区三区| 欧美激情一区二区三区 | 久久成人一区| 老司机一区二区三区| 美女黄毛**国产精品啪啪| 免费成人在线视频网站| 欧美激情在线有限公司| 欧美午夜视频网站| 国产欧美一区二区三区久久 | 中文在线不卡视频| 亚洲欧美激情视频在线观看一区二区三区| 亚洲天堂视频在线观看| 亚洲欧美视频| 久久久国产精品一区| 老牛国产精品一区的观看方式| 欧美激情bt| 99精品视频免费观看视频| 亚洲女ⅴideoshd黑人| 久久久噜噜噜| 欧美日本三区| 国产一级一区二区| 日韩网站免费观看| 欧美一级专区| 亚洲激情在线观看视频免费| 亚洲最新在线| 久久在线精品| 国产精品久久久久影院亚瑟 | 亚洲国产精品视频| 亚洲一区精品在线| 久久综合九色综合欧美就去吻| 亚洲第一狼人社区| 亚洲欧美另类国产| 欧美激情综合色| 韩国av一区二区三区| 中文日韩欧美| 欧美成人按摩| 午夜伦理片一区| 欧美极品在线观看| 尤物精品国产第一福利三区| 亚洲一区二区三区四区在线观看| 乱码第一页成人| 亚洲一区三区视频在线观看| 美女精品视频一区| 国产一区二区毛片| 亚洲综合国产激情另类一区| 欧美波霸影院| 欧美中文字幕在线视频| 国产精品久久久免费| 日韩亚洲欧美成人| 欧美激情视频在线播放| 久久国产精品久久久久久| 国产精品你懂得|