精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

用Python實現一個大數據搜索引擎

開發 后端 大數據
搜索是大數據領域里常見的需求。Splunk和ELK分別是該領域在非開源和開源領域里的領導者。本文利用很少的Python代碼實現了一個基本的數據搜索功能,試圖讓大家理解大數據搜索的基本原理。

[[211336]]

搜索是大數據領域里常見的需求。Splunk和ELK分別是該領域在非開源和開源領域里的***。本文利用很少的Python代碼實現了一個基本的數據搜索功能,試圖讓大家理解大數據搜索的基本原理。

布隆過濾器 (Bloom Filter)

***步我們先要實現一個布隆過濾器。

布隆過濾器是大數據領域的一個常見算法,它的目的是過濾掉那些不是目標的元素。也就是說如果一個要搜索的詞并不存在與我的數據中,那么它可以以很快的速度返回目標不存在。

讓我們看看以下布隆過濾器的代碼:

  1. class Bloomfilter(object): 
  2.     ""
  3.     A Bloom filter is a probabilistic data-structure that trades space for accuracy 
  4.     when determining if a value is in a set.  It can tell you if a value was possibly 
  5.     added, or if it was definitely not added, but it can't tell you for certain that 
  6.     it was added. 
  7.     ""
  8.     def __init__(self, size): 
  9.         """Setup the BF with the appropriate size""" 
  10.         self.values = [False] * size 
  11.         self.size = size 
  12.   
  13.     def hash_value(self, value): 
  14.         """Hash the value provided and scale it to fit the BF size""" 
  15.         return hash(value) % self.size 
  16.   
  17.     def add_value(self, value): 
  18.         """Add a value to the BF""" 
  19.         h = self.hash_value(value) 
  20.         self.values[h] = True 
  21.   
  22.     def might_contain(self, value): 
  23.         """Check if the value might be in the BF""" 
  24.         h = self.hash_value(value) 
  25.         return self.values[h] 
  26.   
  27.     def print_contents(self): 
  28.         """Dump the contents of the BF for debugging purposes""" 
  29.         print self.values 
  • 基本的數據結構是個數組(實際上是個位圖,用1/0來記錄數據是否存在),初始化是沒有任何內容,所以全部置False。實際的使用當中,該數組的長度是非常大的,以保證效率。
  • 利用哈希算法來決定數據應該存在哪一位,也就是數組的索引
  • 當一個數據被加入到布隆過濾器的時候,計算它的哈希值然后把相應的位置為True
  • 當檢查一個數據是否已經存在或者說被索引過的時候,只要檢查對應的哈希值所在的位的True/Fasle

看到這里,大家應該可以看出,如果布隆過濾器返回False,那么數據一定是沒有索引過的,然而如果返回True,那也不能說數據一定就已經被索引過。在搜索過程中使用布隆過濾器可以使得很多沒有***的搜索提前返回來提高效率。

我們看看這段 code是如何運行的:

  1. bf = Bloomfilter(10) 
  2. bf.add_value('dog'
  3. bf.add_value('fish'
  4. bf.add_value('cat'
  5. bf.print_contents() 
  6. bf.add_value('bird'
  7. bf.print_contents() 
  8. # Note: contents are unchanged after adding bird - it collides 
  9. for term in ['dog''fish''cat''bird''duck''emu']: 
  10.     print '{}: {} {}'.format(term, bf.hash_value(term), bf.might_contain(term)) 

結果:

 

  1. [FalseFalseFalseFalseTrueTrueFalseFalseFalseTrue
  2. [FalseFalseFalseFalseTrueTrueFalseFalseFalseTrue
  3. dog: 5 True 
  4. fish: 4 True 
  5. cat: 9 True 
  6. bird: 9 True 
  7. duck: 5 True 
  8. emu: 8 False 

首先創建了一個容量為10的的布隆過濾器

然后分別加入 ‘dog’,‘fish’,‘cat’三個對象,這時的布隆過濾器的內容如下:

然后加入‘bird’對象,布隆過濾器的內容并沒有改變,因為‘bird’和‘fish’恰好擁有相同的哈希。

***我們檢查一堆對象(’dog’, ‘fish’, ‘cat’, ‘bird’, ‘duck’, ’emu’)是不是已經被索引了。結果發現‘duck’返回True,2而‘emu’返回False。因為‘duck’的哈希恰好和‘dog’是一樣的。

分詞

下面一步我們要實現分詞。 分詞的目的是要把我們的文本數據分割成可搜索的最小單元,也就是詞。這里我們主要針對英語,因為中文的分詞涉及到自然語言處理,比較復雜,而英文基本只要用標點符號就好了。

下面我們看看分詞的代碼:

 

  1. def major_segments(s): 
  2.     ""
  3.     Perform major segmenting on a string.  Split the string by all of the major 
  4.     breaks, and return the set of everything found.  The breaks in this implementation 
  5.     are single characters, but in Splunk proper they can be multiple characters. 
  6.     A set is used because ordering doesn't matter, and duplicates are bad. 
  7.     ""
  8.     major_breaks = ' ' 
  9.     last = -1 
  10.     results = set() 
  11.   
  12.     # enumerate() will give us (0, s[0]), (1, s[1]), ... 
  13.     for idx, ch in enumerate(s): 
  14.         if ch in major_breaks: 
  15.             segment = s[last+1:idx] 
  16.             results.add(segment) 
  17.   
  18.             last = idx 
  19.   
  20.     # The last character may not be a break so always capture 
  21.     # the last segment (which may end up being "", but yolo)     
  22.     segment = s[last+1:] 
  23.     results.add(segment) 
  24.   
  25.     return results 

主要分割

主要分割使用空格來分詞,實際的分詞邏輯中,還會有其它的分隔符。例如Splunk的缺省分割符包括以下這些,用戶也可以定義自己的分割符。

] < >( ) { } | ! ; , ‘ ” * \n \r \s \t & ? + %21 %26 %2526 %3B %7C %20 %2B %3D — %2520 %5D %5B %3A %0A %2C %28 %29

  1. def minor_segments(s): 
  2.     ""
  3.     Perform minor segmenting on a string.  This is like major 
  4.     segmenting, except it also captures from the start of the 
  5.     input to each break. 
  6.     ""
  7.     minor_breaks = '_.' 
  8.     last = -1 
  9.     results = set() 
  10.   
  11.     for idx, ch in enumerate(s): 
  12.         if ch in minor_breaks: 
  13.             segment = s[last+1:idx] 
  14.             results.add(segment) 
  15.   
  16.             segment = s[:idx] 
  17.             results.add(segment) 
  18.   
  19.             last = idx 
  20.   
  21.     segment = s[last+1:] 
  22.     results.add(segment) 
  23.     results.add(s) 
  24.   
  25.     return results 

次要分割

次要分割和主要分割的邏輯類似,只是還會把從開始部分到當前分割的結果加入。例如“1.2.3.4”的次要分割會有1,2,3,4,1.2,1.2.3

  1. def segments(event): 
  2.     """Simple wrapper around major_segments / minor_segments""" 
  3.     results = set() 
  4.     for major in major_segments(event): 
  5.         for minor in minor_segments(major): 
  6.             results.add(minor) 
  7.     return results 

分詞的邏輯就是對文本先進行主要分割,對每一個主要分割在進行次要分割。然后把所有分出來的詞返回。

我們看看這段 code是如何運行的:

  1. for term in segments('src_ip = 1.2.3.4'): 
  2.         print term 

 

  1. src 
  2. 1.2 
  3. 1.2.3.4 
  4. src_ip 
  5. 1.2.3 
  6. ip 

搜索

好了,有個分詞和布隆過濾器這兩個利器的支撐后,我們就可以來實現搜索的功能了。

上代碼:

  1. class Splunk(object): 
  2.     def __init__(self): 
  3.         self.bf = Bloomfilter(64) 
  4.         self.terms = {}  # Dictionary of term to set of events 
  5.         self.events = [] 
  6.      
  7.     def add_event(self, event): 
  8.         """Adds an event to this object""" 
  9.   
  10.         # Generate a unique ID for the event, and save it 
  11.         event_id = len(self.events) 
  12.         self.events.append(event) 
  13.   
  14.         # Add each term to the bloomfilter, and track the event by each term 
  15.         for term in segments(event): 
  16.             self.bf.add_value(term) 
  17.   
  18.             if term not in self.terms: 
  19.                 self.terms[term] = set() 
  20.             self.terms[term].add(event_id) 
  21.   
  22.     def search(self, term): 
  23.         """Search for a single term, and yield all the events that contain it""" 
  24.          
  25.         # In Splunk this runs in O(1), and is likely to be in filesystem cache (memory) 
  26.         if not self.bf.might_contain(term): 
  27.             return 
  28.   
  29.         # In Splunk this probably runs in O(log N) where N is the number of terms in the tsidx 
  30.         if term not in self.terms: 
  31.             return 
  32.   
  33.         for event_id in sorted(self.terms[term]): 
  34.             yield self.events[event_id] 
  • Splunk代表一個擁有搜索功能的索引集合
  • 每一個集合中包含一個布隆過濾器,一個倒排詞表(字典),和一個存儲所有事件的數組
  • 當一個事件被加入到索引的時候,會做以下的邏輯
    • 為每一個事件生成一個unqie id,這里就是序號
    • 對事件進行分詞,把每一個詞加入到倒排詞表,也就是每一個詞對應的事件的id的映射結構,注意,一個詞可能對應多個事件,所以倒排表的的值是一個Set。倒排表是絕大部分搜索引擎的核心功能。
  • 當一個詞被搜索的時候,會做以下的邏輯
    • 檢查布隆過濾器,如果為假,直接返回
    • 檢查詞表,如果被搜索單詞不在詞表中,直接返回
    • 在倒排表中找到所有對應的事件id,然后返回事件的內容

我們運行下看看把:

  1. s = Splunk() 
  2. s.add_event('src_ip = 1.2.3.4'
  3. s.add_event('src_ip = 5.6.7.8'
  4. s.add_event('dst_ip = 1.2.3.4'
  5.   
  6. for event in s.search('1.2.3.4'): 
  7.     print event 
  8. print '-' 
  9. for event in s.search('src_ip'): 
  10.     print event 
  11. print '-' 
  12. for event in s.search('ip'): 
  13.     print event 
  14.  
  15. src_ip = 1.2.3.4 
  16. dst_ip = 1.2.3.4 
  17. src_ip = 1.2.3.4 
  18. src_ip = 5.6.7.8 
  19. src_ip = 1.2.3.4 
  20. src_ip = 5.6.7.8 
  21. dst_ip = 1.2.3.4 

是不是很贊!

更復雜的搜索

更進一步,在搜索過程中,我們想用And和Or來實現更復雜的搜索邏輯。

上代碼:

  1. class SplunkM(object): 
  2.     def __init__(self): 
  3.         self.bf = Bloomfilter(64) 
  4.         self.terms = {}  # Dictionary of term to set of events 
  5.         self.events = [] 
  6.      
  7.     def add_event(self, event): 
  8.         """Adds an event to this object""" 
  9.   
  10.         # Generate a unique ID for the event, and save it 
  11.         event_id = len(self.events) 
  12.         self.events.append(event) 
  13.   
  14.         # Add each term to the bloomfilter, and track the event by each term 
  15.         for term in segments(event): 
  16.             self.bf.add_value(term) 
  17.             if term not in self.terms: 
  18.                 self.terms[term] = set() 
  19.              
  20.             self.terms[term].add(event_id) 
  21.   
  22.     def search_all(self, terms): 
  23.         """Search for an AND of all terms""" 
  24.   
  25.         # Start with the universe of all events... 
  26.         results = set(range(len(self.events))) 
  27.   
  28.         for term in terms: 
  29.             # If a term isn't present at all then we can stop looking 
  30.             if not self.bf.might_contain(term): 
  31.                 return 
  32.             if term not in self.terms: 
  33.                 return 
  34.   
  35.             # Drop events that don't match from our results 
  36.             results = results.intersection(self.terms[term]) 
  37.   
  38.         for event_id in sorted(results): 
  39.             yield self.events[event_id] 
  40.   
  41.   
  42.     def search_any(self, terms): 
  43.         """Search for an OR of all terms""" 
  44.         results = set() 
  45.   
  46.         for term in terms: 
  47.             # If a term isn't present, we skip it, but don't stop 
  48.             if not self.bf.might_contain(term): 
  49.                 continue 
  50.             if term not in self.terms: 
  51.                 continue 
  52.   
  53.             # Add these events to our results 
  54.             results = results.union(self.terms[term]) 
  55.   
  56.         for event_id in sorted(results): 
  57.             yield self.events[event_id] 

利用Python集合的intersection和union操作,可以很方便的支持And(求交集)和Or(求合集)的操作。

運行結果如下:

  1. s = SplunkM() 
  2. s.add_event('src_ip = 1.2.3.4'
  3. s.add_event('src_ip = 5.6.7.8'
  4. s.add_event('dst_ip = 1.2.3.4'
  5.   
  6. for event in s.search_all(['src_ip''5.6']): 
  7.     print event 
  8. print '-' 
  9. for event in s.search_any(['src_ip''dst_ip']): 
  10.     print event 
  11.  
  12. src_ip = 5.6.7.8 
  13. src_ip = 1.2.3.4 
  14. src_ip = 5.6.7.8 
  15. dst_ip = 1.2.3.4 

 

責任編輯:龐桂玉 來源: 計算機與網絡安全
相關推薦

2024-02-27 07:33:32

搜索引擎Rust模型

2021-09-13 06:03:42

CSS 技巧搜索引擎

2019-07-10 13:17:07

大數據搜索代碼

2020-12-31 09:20:51

Redis搜索引擎

2020-10-28 11:40:08

MySQL索引數據庫

2016-08-18 00:54:59

Python圖片處理搜索引擎

2024-11-05 16:40:24

JavaScript搜索引擎

2021-08-24 10:02:21

JavaScript網頁搜索 前端

2022-02-25 09:41:05

python搜索引擎

2011-06-20 18:23:06

SEO

2020-12-10 11:18:47

Redis搜索引擎Java

2018-07-05 22:38:23

大數據搜索引擎SEO

2010-03-10 09:28:41

Python標準庫

2021-08-09 10:36:49

Python搜索引擎命令

2014-06-23 15:12:29

大數據

2017-08-07 08:15:31

搜索引擎倒排

2020-03-20 10:14:49

搜索引擎倒排索引

2012-09-07 13:22:21

搜索搜狗

2022-10-08 09:13:18

搜索引擎?站

2010-04-20 11:43:46

點贊
收藏

51CTO技術棧公眾號

免费高清一区二区三区| 91嫩草国产在线观看| 久久精品无码一区| 在线日韩三级| 欧美日韩精品在线视频| 亚洲第一导航| 色欲久久久天天天综合网| 琪琪一区二区三区| 国内精品小视频在线观看| 国产精品h片在线播放| 久久精品国产亚洲av麻豆色欲 | 欧美在线free| 大桥未久一区二区三区| 九色在线视频蝌蚪| 成人免费看的视频| 成人激情视频免费在线| 国产精品自拍99| 重囗味另类老妇506070| 一本色道久久88精品综合| 麻豆精品国产传媒av| 天堂久久一区| 欧美色爱综合网| 18岁网站在线观看| 黑人玩欧美人三根一起进| 国产精品久久网站| 日本最新一区二区三区视频观看| 亚洲成人一级片| 国产在线国偷精品免费看| 精品久久久久久久久久国产| 亚洲欧美日产图| 欧美女v视频| av亚洲精华国产精华精| 亚洲bt天天射| 91av久久久| 麻豆成人在线观看| 国产精品高潮呻吟久久av黑人| 日韩欧美三级视频| 在线欧美日韩| 久久久天堂国产精品女人| www.毛片com| 久久精品亚洲欧美日韩精品中文字幕| 在线电影av不卡网址| 香蕉视频久久久| 久久av导航| 亚洲欧洲第一视频| 性欧美13一14内谢| 一区三区在线欧| 日韩精品免费在线观看| 手机在线看片日韩| 偷拍精品福利视频导航| 日韩精品中文字| 性高潮久久久久久久| 伊人精品一区| 国产亚洲精品久久久久久| 蜜桃传媒一区二区亚洲| 欧美一区二区三区高清视频| 尤物精品国产第一福利三区 | 97精品久久久| 欧美三日本三级少妇99| 久久av在线| 国产成人亚洲综合青青| 中文字幕在线日亚洲9| 老色鬼精品视频在线观看播放| 国产欧美日韩高清| 国产成人精品白浆久久69| 高清视频一区二区| 就去色蜜桃综合| 成人性爱视频在线观看| 中文字幕一区二区三区视频| 中文字幕色一区二区| 天堂av在线电影| 午夜精品一区二区三区电影天堂| 国产超级av在线| 成人不卡视频| 在线综合视频播放| 一级欧美一级日韩片| 国产一区日韩| 欧美大尺度激情区在线播放| 日本一级一片免费视频| 日本在线不卡视频一二三区| 成人www视频在线观看| 亚洲精品久久久久久无码色欲四季 | 外国精品视频在线观看| 欧美国产综合一区二区| 亚洲成人动漫在线| 中文一区一区三区高中清不卡免费 | 日韩av中文字幕第一页| 在线免费日韩片| 7777精品久久久大香线蕉| 成人免费看片载| 国产影视一区| 久久久久久久久久久久av| 69亚洲精品久久久蜜桃小说| 精品一区二区三区在线视频| 精品国产乱码久久久久软件| 欧美13一16娇小xxxx| 亚洲成人777| 国产一伦一伦一伦| 日韩深夜福利| 欧美成在线视频| 中文在线观看av| 成人av电影免费在线播放| 亚洲国产高清国产精品| 国产理论在线| 91麻豆精品国产91| 人人人妻人人澡人人爽欧美一区| 欧美成人高清| 国产日产欧美a一级在线| 天天综合网在线| 亚洲男帅同性gay1069| 成人在线观看黄| 成人免费在线电影网| 久久精品视频导航| 夜夜躁日日躁狠狠久久av| 成人美女视频在线观看| 香蕉视频在线网址| 欧美日韩激情电影| 亚洲国产精品yw在线观看| 男女男精品视频网站| 久久99伊人| 国产在线播放一区二区| 少女频道在线观看高清 | 久久久综合色| 国产精品成人播放| 视频一区二区三区在线看免费看| 亚洲午夜免费视频| 永久看看免费大片| 国产电影一区二区在线观看| 国产精品黄色影片导航在线观看| 日韩精品视频无播放器在线看| 亚洲图片欧美综合| 中文字幕在线观看91| 亚洲精品成人无限看| 91精品久久久久久久久中文字幕 | 午夜精品久久久久久久99热浪潮 | 日韩 欧美 视频| 国产成人免费视频网站视频社区| 中文字幕一区二区三区电影| 成人一二三四区| 欧美国产禁国产网站cc| 99草草国产熟女视频在线| 美日韩中文字幕| 日韩免费在线看| 国产在线三区| 欧洲一区在线电影| 中文字幕伦理片| 麻豆国产精品一区二区三区 | 亚洲裸体俱乐部裸体舞表演av| 国产精品日韩欧美一区二区三区| 色呦呦网站在线观看| 日韩欧美色电影| 久久久精品国产sm调教| av在线一区二区| 亚欧无线一线二线三线区别| 视频一区中文| 国产精品尤物福利片在线观看| 在线免费观看黄| 91精品在线观看入口| 欧美色图亚洲视频| 成人av免费观看| 国产偷人视频免费| 成人高清av| 99re在线播放| 成人在线黄色电影| 国产午夜精品视频| 国产精品久久久久久无人区 | 成年人网站国产| 天美av一区二区三区久久| 国产精品久久97| 麻豆av在线免费看| 欧美精品一区二区三区在线 | 国产盗摄精品一区二区三区在线| 男女啪啪免费观看| 日韩电影不卡一区| 国产精品日韩在线播放| 50度灰在线| 亚洲精品自拍视频| 国产一区二区在线不卡| 亚洲影视在线播放| 久久久久久国产免费a片| 国产麻豆日韩欧美久久| 91精品91久久久中77777老牛| 成人激情诱惑| 国产精品区一区二区三在线播放| 亚洲第一会所| 久久久久久中文| 一级毛片视频在线观看| 精品国产污污免费网站入口 | 日本成人在线不卡| 免费精品国产| av免费观看久久| 国产综合av| 久久久久免费视频| 中文日本在线观看| 日韩电影网在线| 国产乱淫a∨片免费观看| 欧美视频国产精品| 青青草精品在线视频| 国产视频视频一区| 亚洲久久久久久| 国产一区激情在线| 可以在线看的黄色网址| 伊人久久大香线蕉综合热线 | www.av天天| 成人短视频下载| 日韩av加勒比| 男女男精品视频网| 日韩在线视频在线观看| 亚洲视频福利| 波多野结衣激情| 日韩精品91| 日韩欧美在线一区二区| 国内精品麻豆美女在线播放视频| 91麻豆国产精品| 97人人做人人爽香蕉精品| 欧美一级免费视频| 菠萝蜜视频在线观看www入口| 按摩亚洲人久久| 国产精品四虎| 亚洲精品综合久久中文字幕| 免费观看黄一级视频| 91麻豆精品国产无毒不卡在线观看 | 日韩一级网站| 大荫蒂性生交片| 影视一区二区| 黄频视频在线观看| 亚洲国产精品久久久久蝴蝶传媒| 婷婷精品国产一区二区三区日韩| 欧美巨大xxxx| 精品一区二区国产| 久久九九热re6这里有精品 | 日韩av影视大全| 久久精品国产亚洲一区二区三区| 亚洲欧洲日本精品| 日本不卡一区二区| 免费一级特黄录像| 奇米色一区二区| 亚洲这里只有精品| 另类调教123区| 日韩在线不卡一区| 激情图区综合网| 中文字幕一区二区在线观看视频 | 蜜桃精品一区二区| 久久精品视频免费| 久操视频在线观看免费| 国产嫩草影院久久久久| 精品日韩在线视频| 亚洲欧洲精品成人久久奇米网| 免费成人美女女在线观看| 中文字幕一区二区三区蜜月| xxxx日本少妇| 亚洲永久免费视频| a v视频在线观看| 欧美丝袜一区二区| 亚洲精品无码久久久久| 欧美日韩第一区日日骚| 99久久久无码国产精品免费| 日韩欧美成人一区二区| 天堂av一区二区三区| 亚洲免费av网址| 1769视频在线播放免费观看| 精品国产一区久久久| 欧美性爽视频| 日本不卡高字幕在线2019| 欧美日韩国产网站| 91香蕉国产在线观看| 国产精品对白久久久久粗| 免费成人深夜夜行视频| 久久在线视频| 97在线国产视频| 丝袜美腿亚洲色图| 久久久精品高清| 不卡的av在线| www.4hu95.com四虎| 一区二区三区四区中文字幕| 天堂网一区二区三区| 欧美性极品少妇| 亚洲第一成人av| 国产亚洲免费的视频看| 在线观看wwwxxxx| 日本不卡高字幕在线2019| 国产精品一级在线观看| 激情视频在线观看一区二区三区| 成人免费看片39| 欧美激情视频免费看| 男女男精品视频| 理论片大全免费理伦片| 国产精品丝袜91| 97人人澡人人爽人人模亚洲| 欧美乱妇20p| 黄色片免费在线| 欧美激情乱人伦一区| 成人国产在线| 精品日韩欧美| 亚洲精品成人影院| www.日本xxxx| av资源网一区| 美女毛片在线观看| 欧美日韩一区三区| 午夜激情小视频| 久久91精品国产| 91伊人久久| 免费观看成人高| 极品av少妇一区二区| 91看片破解版| 国产欧美日韩视频一区二区 | 欧美天堂亚洲电影院在线播放| 丁香花免费高清完整在线播放| 视频在线一区二区| 91av亚洲| 激情小说网站亚洲综合网| 欧美一区影院| 久久精品一卡二卡| 欧美激情一区二区三区蜜桃视频| av黄色在线播放| 欧美精品一区二区蜜臀亚洲| a视频在线播放| 国产在线精品成人一区二区三区| 亚洲8888| 69堂免费视频| 成年人国产精品| 国产在线一二区| 精品国产成人系列| 欧美hdxxx| http;//www.99re视频| 久久久五月天| 日本不卡一区二区在线观看| 中文字幕高清一区| 亚洲精品国产精品乱码视色| 亚洲美女激情视频| 一区二区乱码| 欧美成熟毛茸茸复古| 夜夜嗨一区二区| av无码av天天av天天爽| 激情成人中文字幕| 四虎成人免费在线| 日本精品视频在线观看| 夜色77av精品影院| 99久久激情视频| 欧美激情一区二区| 亚洲影院一区二区三区| 中文字幕亚洲精品| 国产精品字幕| 一区二区视频在线观看| 精品亚洲欧美一区| 亚洲欧美小视频| 精品精品欲导航| 国产中文在线播放| 蜜桃视频在线观看91| 丝袜a∨在线一区二区三区不卡| 国产亚洲精品熟女国产成人| 欧美色图12p| h片在线播放| 91网免费观看| 9久re热视频在线精品| 美女又爽又黄视频毛茸茸| 日本韩国一区二区三区| 91av资源在线| 91精品国产综合久久久久久丝袜| 欧美日韩1080p| 国产精品无码在线| 欧美最猛性xxxxx直播| 麻豆影院在线| 国产综合18久久久久久| 日韩精品久久久久久| 26uuu成人网| 亚洲级视频在线观看免费1级| 成人影院入口| 久久免费视频2| 成人av电影免费观看| 中文字幕av无码一区二区三区| 久久久精品网站| 欧美毛片免费观看| 91制片厂毛片| 一区二区三区日本| 国产黄色在线播放| 97久久天天综合色天天综合色hd | 国产精品无码在线| 欧美日韩在线免费视频| 男男gaygays亚洲| 欧美日韩亚洲一区二区三区在线观看| 国内精品不卡在线| 免费观看一区二区三区毛片| 日韩中文字幕视频| 国内自拍欧美| 在线黄色免费看| 欧美日韩精品中文字幕| 黄色网页在线播放| 久久久综合亚洲91久久98| 激情久久五月天| 久久久久女人精品毛片九一| 欧美另类在线观看| 精品美女久久久| 国产国语老龄妇女a片| 欧美三级视频在线播放| 欧亚av在线| 国产a级黄色大片| 国产精品久久一级| 男生女生差差差的视频在线观看| 高清日韩一区|