日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

lucene,lucene.net学习教程

發布時間:2023/12/10 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 lucene,lucene.net学习教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

lucene學習教程

?

1.1 什么是lucene

??? Lucene是一個全文搜索框架,而不是應用產品。因此它并不像www.baidu.com 或者google Desktop那么拿來就能用,它只是提供了一種工具讓你能實現這些產品。

?

2 lucene的工作方式?
??? lucene提供的服務實際包含兩部分:一入一出。所謂入是寫入,即將你提供的源(本質是字符串)寫入索引或者將其從索引中刪除;所謂出是讀出,即向用戶提供全文搜索服務,讓用戶可以通過關鍵詞定位源。?
2.1寫入流程?
??? 源字符串首先經過analyzer處理,包括:分詞,分成一個個單詞;去除stopword(可選)。?
將源中需要的信息加入Document的各個Field中,并把需要索引的Field索引起來,把需要存儲的Field存儲起來。?
??? 將索引寫入存儲器,存儲器可以是內存或磁盤。?
2.2讀出流程?
??? 用戶提供搜索關鍵詞,經過analyzer處理。?
對處理后的關鍵詞搜索索引找出對應的Document。?
用戶根據需要從找到的Document中提取需要的Field。

??????
3 一些需要知道的概念?
3.1 analyzer?
??? Analyzer是分析器,它的作用是把一個字符串按某種規則劃分成一個個詞語,并去除其中的無效詞語,這里說的無效詞語是指英文中的“of”、“the”,中文中的“的”、“地”等詞語,這些詞語在文章中大量出現,但是本身不包含什么關鍵信息,去掉有利于縮小索引文件、提高效率、提高命中率。?
  分詞的規則千變萬化,但目的只有一個:按語義劃分。這點在英文中比較容易實現,因為英文本身就是以單詞為單位的,已經用空格分開;而中文則必須以某種方法將連成一片的句子劃分成一個個詞語。具體劃分方法下面再詳細介紹,這里只需了解分析器的概念即可。?
3.2 document?
  用戶提供的源是一條條記錄,它們可以是文本文件、字符串或者數據庫表的一條記錄等等。一條記錄經過索引之后,就是以一個Document的形式存儲在索引文件中的。用戶進行搜索,也是以Document列表的形式返回。?
3.3 field?
??? 一個Document可以包含多個信息域,例如一篇文章可以包含“標題”、“正文”、“最后修改時間”等信息域,這些信息域就是通過Field在Document中存儲的。?
??? Field有兩個屬性可選:存儲和索引。通過存儲屬性你可以控制是否對這個Field進行存儲;通過索引屬性你可以控制是否對該Field進行索引。這看起來似乎有些廢話,事實上對這兩個屬性的正確組合很重要,下面舉例說明:還是以剛才的文章為例子,我們需要對標題和正文進行全文搜索,所以我們要把索引屬性設置為真,同時我們希望能直接從搜索結果中提取文章標題,所以我們把標題域的存儲屬性設置為真,但是由于正文域太大了,我們為了縮小索引文件大小,將正文域的存儲屬性設置為假,當需要時再直接讀取文件;我們只是希望能從搜索解果中提取最后修改時間,不需要對它進行搜索,所以我們把最后修改時間域的存儲屬性設置為真,索引屬性設置為假。上面的三個域涵蓋了兩個屬性的三種組合,還有一種全為假的沒有用到,事實上Field不允許你那么設置,因為既不存儲又不索引的域是沒有意義的。?
3.4 term?
  term是搜索的最小單位,它表示文檔的一個詞語,term由兩部分組成:它表示的詞語和這個詞語所出現的field。?
3.5 tocken?
??? tocken是term的一次出現,它包含trem文本和相應的起止偏移,以及一個類型字符串。一句話中可以出現多次相同的詞語,它們都用同一個term表示,但是用不同的tocken,每個tocken標記該詞語出現的地方。?
3.6 segment?
??? 添加索引時并不是每個document都馬上添加到同一個索引文件,它們首先被寫入到不同的小文件,然后再合并成一個大索引文件,這里每個小文件都是一個segment。

?

4 lucene的結構?
lucene包括core和sandbox兩部分,其中core是lucene穩定的核心部分,sandbox包含了一些附加功能,例如highlighter、各種分析器。?
Lucene core有七個包:analysis,document,index,queryParser,search,store,util。?
4.1 analysis?
Analysis包含一些內建的分析器,例如按空白字符分詞的WhitespaceAnalyzer,添加了stopwrod過濾的StopAnalyzer,最常用的StandardAnalyzer。?
4.2 document?
Document包含文檔的數據結構,例如Document類定義了存儲文檔的數據結構,Field類定義了Document的一個域。?
4.3 index?
Index包含了索引的讀寫類,例如對索引文件的segment進行寫、合并、優化的IndexWriter類和對索引進行讀取和刪除操作的 IndexReader類,這里要注意的是不要被IndexReader這個名字誤導,以為它是索引文件的讀取類,實際上刪除索引也是由它完成, IndexWriter只關心如何將索引寫入一個個segment,并將它們合并優化;IndexReader則關注索引文件中各個文檔的組織形式。?
4.4 queryParser?
QueryParser包含了解析查詢語句的類,lucene的查詢語句和sql語句有點類似,有各種保留字,按照一定的語法可以組成各種查詢。 Lucene有很多種Query類,它們都繼承自Query,執行各種特殊的查詢,QueryParser的作用就是解析查詢語句,按順序調用各種 Query類查找出結果。?
4.5 search?
Search包含了從索引中搜索結果的各種類,例如剛才說的各種Query類,包括TermQuery、BooleanQuery等就在這個包里。?
4.6 store?
Store包含了索引的存儲類,例如Directory定義了索引文件的存儲結構,FSDirectory為存儲在文件中的索引,RAMDirectory為存儲在內存中的索引,MmapDirectory為使用內存映射的索引。?
4.7 util?
Util包含一些公共工具類,例如時間和字符串之間的轉換工具。?

5 如何建索引?
5.1 最簡單的能完成索引的代碼片斷?

Java代碼?
IndexWriter writer = new IndexWriter(“/data/index/”, new StandardAnalyzer(), true);???
Document doc = new Document();???
doc.add(new Field("title", "lucene introduction", Field.Store.YES, Field.Index.TOKENIZED));???
doc.add(new Field("content", "lucene works well", Field.Store.YES, Field.Index.TOKENIZED));???
writer.addDocument(doc);???
writer.optimize();???
writer.close();??

下面我們分析一下這段代碼。?
首先我們創建了一個writer,并指定存放索引的目錄為“/data/index”,使用的分析器為StandardAnalyzer,第三個參數說明如果已經有索引文件在索引目錄下,我們將覆蓋它們。?
然后我們新建一個document。?
我們向document添加一個field,名字是“title”,內容是“lucene introduction”,對它進行存儲并索引。?
再添加一個名字是“content”的field,內容是“lucene works well”,也是存儲并索引。?
然后我們將這個文檔添加到索引中,如果有多個文檔,可以重復上面的操作,創建document并添加。?
添加完所有document,我們對索引進行優化,優化主要是將多個segment合并到一個,有利于提高索引速度。?
隨后將writer關閉,這點很重要。?

對,創建索引就這么簡單!?
當然你可能修改上面的代碼獲得更具個性化的服務。?

5.2 將索引直接寫在內存?
你需要首先創建一個RAMDirectory,并將其傳給writer,代碼如下:?

Java代碼?
Directory dir = new RAMDirectory();???
IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(), true);???
Document doc = new Document();???
doc.add(new Field("title", "lucene introduction", Field.Store.YES, Field.Index.TOKENIZED));???
doc.add(new Field("content", "lucene works well", Field.Store.YES, Field.Index.TOKENIZED));???
writer.addDocument(doc);???
writer.optimize();???
writer.close();??

5.3 索引文本文件?
如果你想把純文本文件索引起來,而不想自己將它們讀入字符串創建field,你可以用下面的代碼創建field:?

Field field = new Field("content", new FileReader(file));?

這里的file就是該文本文件。該構造函數實際上是讀去文件內容,并對其進行索引,但不存儲。?

6 如何維護索引?
索引的維護操作都是由IndexReader類提供。?

6.1 如何刪除索引?
lucene提供了兩種從索引中刪除document的方法,一種是?

void deleteDocument(int docNum)?

這種方法是根據document在索引中的編號來刪除,每個document加進索引后都會有個唯一編號,所以根據編號刪除是一種精確刪除,但是這個編號是索引的內部結構,一般我們不會知道某個文件的編號到底是幾,所以用處不大。另一種是?

void deleteDocuments(Term term)?

這種方法實際上是首先根據參數term執行一個搜索操作,然后把搜索到的結果批量刪除了。我們可以通過這個方法提供一個嚴格的查詢條件,達到刪除指定document的目的。?
下面給出一個例子:?

Java代碼?
Directory dir = FSDirectory.getDirectory(PATH, false);???
IndexReader reader = IndexReader.open(dir);???
Term term = new Term(field, key);???
reader.deleteDocuments(term);???
reader.close();??

6.2 如何更新索引?
lucene并沒有提供專門的索引更新方法,我們需要先將相應的document刪除,然后再將新的document加入索引。例如:?

Java代碼?
Directory dir = FSDirectory.getDirectory(PATH, false);???
IndexReader reader = IndexReader.open(dir);???
Term term = new Term(“title”, “lucene introduction”);???
reader.deleteDocuments(term);???
reader.close();???
??
IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(), true);???
Document doc = new Document();???
doc.add(new Field("title", "lucene introduction", Field.Store.YES, Field.Index.TOKENIZED));???
doc.add(new Field("content", "lucene is funny", Field.Store.YES, Field.Index.TOKENIZED));???
writer.addDocument(doc);???
writer.optimize();???
writer.close();??

7 如何搜索?
lucene的搜索相當強大,它提供了很多輔助查詢類,每個類都繼承自Query類,各自完成一種特殊的查詢,你可以像搭積木一樣將它們任意組合使用,完成一些復雜操作;另外lucene還提供了Sort類對結果進行排序,提供了Filter類對查詢條件進行限制。你或許會不自覺地拿它跟SQL語句進行比較:“lucene能執行and、or、order by、where、like ‘%xx%’操作嗎?”回答是:“當然沒問題!”?

7.1 各種各樣的Query?
下面我們看看lucene到底允許我們進行哪些查詢操作:?

7.1.1 TermQuery?
首先介紹最基本的查詢,如果你想執行一個這樣的查詢:“在content域中包含‘lucene’的document”,那么你可以用TermQuery:?

Term t = new Term("content", " lucene";?
Query query = new TermQuery(t);?

7.1.2 BooleanQuery?
如果你想這么查詢:“在content域中包含java或perl的document”,那么你可以建立兩個TermQuery并把它們用BooleanQuery連接起來:?

Java代碼?
TermQuery termQuery1 = new TermQuery(new Term("content", "java");???
TermQuery termQuery 2 = new TermQuery(new Term("content", "perl");???
BooleanQuery booleanQuery = new BooleanQuery();???
booleanQuery.add(termQuery 1, BooleanClause.Occur.SHOULD);???
booleanQuery.add(termQuery 2, BooleanClause.Occur.SHOULD);??

7.1.3 WildcardQuery?
如果你想對某單詞進行通配符查詢,你可以用WildcardQuery,通配符包括’?’匹配一個任意字符和’*’匹配零個或多個任意字符,例如你搜索’use*’,你可能找到’useful’或者’useless’:?

Java代碼?
Query query = new WildcardQuery(new Term("content", "use*");???

7.1.4 PhraseQuery?
你可能對中日關系比較感興趣,想查找‘中’和‘日’挨得比較近(5個字的距離內)的文章,超過這個距離的不予考慮,你可以:?

Java代碼?
PhraseQuery query = new PhraseQuery();???
query.setSlop(5);???
query.add(new Term("content ", “中”));???
query.add(new Term(“content”, “日”));??

那么它可能搜到“中日合作……”、“中方和日方……”,但是搜不到“中國某高層領導說日本欠扁”。?

7.1.5 PrefixQuery?
如果你想搜以‘中’開頭的詞語,你可以用PrefixQuery:?

Java代碼?
PrefixQuery query = new PrefixQuery(new Term("content ", "中");??

7.1.6 FuzzyQuery?
FuzzyQuery用來搜索相似的term,使用Levenshtein算法。假設你想搜索跟‘wuzza’相似的詞語,你可以:?

Java代碼?
Query query = new FuzzyQuery(new Term("content", "wuzza");??
你可能得到‘fuzzy’和‘wuzzy’。?

7.1.7 RangeQuery?
另一個常用的Query是RangeQuery,你也許想搜索時間域從20060101到20060130之間的document,你可以用RangeQuery:?

Java代碼?
RangeQuery query = new RangeQuery(new Term(“time”, “20060101”), new Term(“time”, “20060130”), true);??

最后的true表示用閉合區間。?

7.2 QueryParser?
看了這么多Query,你可能會問:“不會讓我自己組合各種Query吧,太麻煩了!”當然不會,lucene提供了一種類似于SQL語句的查詢語句,我們姑且叫它lucene語句,通過它,你可以把各種查詢一句話搞定,lucene會自動把它們查分成小塊交給相應Query執行。下面我們對應每種Query演示一下:?
TermQuery可以用“field:key”方式,例如“content:lucene”。?
BooleanQuery中‘與’用‘+’,‘或’用‘ ’,例如“content:java contenterl”。?
WildcardQuery仍然用‘?’和‘*’,例如“content:use*”。?
PhraseQuery用‘~’,例如“content:"中日"~5”。?
PrefixQuery用‘*’,例如“中*”。?
FuzzyQuery用‘~’,例如“content: wuzza ~”。?
RangeQuery用‘[]’或‘{}’,前者表示閉區間,后者表示開區間,例如“time:[20060101 TO 20060130]”,注意TO區分大小寫。?
你可以任意組合query string,完成復雜操作,例如“標題或正文包括lucene,并且時間在20060101到20060130之間的文章”可以表示為:“+ (title:lucene content:lucene) +time:[20060101 TO 20060130]”。代碼如下:?

Java代碼?
Directory dir = FSDirectory.getDirectory(PATH, false);???
IndexSearcher is = new IndexSearcher(dir);???
QueryParser parser = new QueryParser("content", new StandardAnalyzer());???
Query query = parser.parse("+(title:lucene content:lucene) +time:[20060101 TO 20060130]";???
Hits hits = is.search(query);???
for (int i = 0; i < hits.length(); i++)???
{???
Document doc = hits.doc(i);???
System.out.println(doc.get("title");???
}???
is.close();??

首先我們創建一個在指定文件目錄上的IndexSearcher。?
然后創建一個使用StandardAnalyzer作為分析器的QueryParser,它默認搜索的域是content。?
接著我們用QueryParser來parse查詢字串,生成一個Query。?
然后利用這個Query去查找結果,結果以Hits的形式返回。?
這個Hits對象包含一個列表,我們挨個把它的內容顯示出來。?

7.3 Filter?
filter的作用就是限制只查詢索引的某個子集,它的作用有點像SQL語句里的where,但又有區別,它不是正規查詢的一部分,只是對數據源進行預處理,然后交給查詢語句。注意它執行的是預處理,而不是對查詢結果進行過濾,所以使用filter的代價是很大的,它可能會使一次查詢耗時提高一百倍。?
最常用的filter是RangeFilter和QueryFilter。RangeFilter是設定只搜索指定范圍內的索引;QueryFilter是在上次查詢的結果中搜索。?
Filter的使用非常簡單,你只需創建一個filter實例,然后把它傳給searcher。繼續上面的例子,查詢“時間在20060101到20060130之間的文章”除了將限制寫在query string中,你還可以寫在RangeFilter中:?

Java代碼?
Directory dir = FSDirectory.getDirectory(PATH, false);???
IndexSearcher is = new IndexSearcher(dir);???
QueryParser parser = new QueryParser("content", new StandardAnalyzer());???
Query query = parser.parse("title:lucene content:lucene";???
RangeFilter filter = new RangeFilter("time", "20060101", "20060230", true, true);???
Hits hits = is.search(query, filter);???
for (int i = 0; i < hits.length(); i++)???
{???
Document doc = hits.doc(i);???
System.out.println(doc.get("title");???
}???
is.close();??

7.4 Sort?
有時你想要一個排好序的結果集,就像SQL語句的“order by”,lucene能做到:通過Sort。?
Sort sort = new Sort(“time”); //相當于SQL的“order by time”?
Sort sort = new Sort(“time”, true); // 相當于SQL的“order by time desc”?
下面是一個完整的例子:?

Java代碼?
Directory dir = FSDirectory.getDirectory(PATH, false);???
IndexSearcher is = new IndexSearcher(dir);???
QueryParser parser = new QueryParser("content", new StandardAnalyzer());???
Query query = parser.parse("title:lucene content:lucene";???
RangeFilter filter = new RangeFilter("time", "20060101", "20060230", true, true);???
Sort sort = new Sort(“time”);???
Hits hits = is.search(query, filter, sort);???
for (int i = 0; i < hits.length(); i++)???
{???
Document doc = hits.doc(i);???
System.out.println(doc.get("title");???
}???
is.close();??

8 分析器?
在前面的概念介紹中我們已經知道了分析器的作用,就是把句子按照語義切分成一個個詞語。英文切分已經有了很成熟的分析器: StandardAnalyzer,很多情況下StandardAnalyzer是個不錯的選擇。甚至你會發現StandardAnalyzer也能對中文進行分詞。?
但是我們的焦點是中文分詞,StandardAnalyzer能支持中文分詞嗎?實踐證明是可以的,但是效果并不好,搜索“如果”會把“牛奶不如果汁好喝”也搜索出來,而且索引文件很大。那么我們手頭上還有什么分析器可以使用呢?core里面沒有,我們可以在sandbox里面找到兩個: ChineseAnalyzer和CJKAnalyzer。但是它們同樣都有分詞不準的問題。相比之下用StandardAnalyzer和 ChineseAnalyzer建立索引時間差不多,索引文件大小也差不多,CJKAnalyzer表現會差些,索引文件大且耗時比較長。?
要解決問題,首先分析一下這三個分析器的分詞方式。StandardAnalyzer和ChineseAnalyzer都是把句子按單個字切分,也就是說 “牛奶不如果汁好喝”會被它們切分成“牛 奶 不 如 果 汁 好 喝”;而CJKAnalyzer則會切分成“牛奶 奶不 不如 如果 果汁 汁好好喝”。這也就解釋了為什么搜索“果汁”都能匹配這個句子。?
以上分詞的缺點至少有兩個:匹配不準確和索引文件大。我們的目標是將上面的句子分解成“牛奶 不如 果汁好喝”。這里的關鍵就是語義識別,我們如何識別“牛奶”是一個詞而“奶不”不是詞語?我們很自然會想到基于詞庫的分詞法,也就是我們先得到一個詞庫,里面列舉了大部分詞語,我們把句子按某種方式切分,當得到的詞語與詞庫中的項匹配時,我們就認為這種切分是正確的。這樣切詞的過程就轉變成匹配的過程,而匹配的方式最簡單的有正向最大匹配和逆向最大匹配兩種,說白了就是一個從句子開頭向后進行匹配,一個從句子末尾向前進行匹配?;谠~庫的分詞詞庫非常重要,詞庫的容量直接影響搜索結果,在相同詞庫的前提下,據說逆向最大匹配優于正向最大匹配。?
當然還有別的分詞方法,這本身就是一個學科,我這里也沒有深入研究。回到具體應用,我們的目標是能找到成熟的、現成的分詞工具,避免重新發明車輪。經過網上搜索,用的比較多的是中科院的ICTCLAS和一個不開放源碼但是免費的JE-Analysis。ICTCLAS有個問題是它是一個動態鏈接庫, java調用需要本地方法調用,不方便也有安全隱患,而且口碑也確實不大好。JE-Analysis效果還不錯,當然也會有分詞不準的地方,相比比較方便放心。


9 性能優化?
一直到這里,我們還是在討論怎么樣使lucene跑起來,完成指定任務。利用前面說的也確實能完成大部分功能。但是測試表明lucene的性能并不是很好,在大數據量大并發的條件下甚至會有半分鐘返回的情況。另外大數據量的數據初始化建立索引也是一個十分耗時的過程。那么如何提高lucene的性能呢?下面從優化創建索引性能和優化搜索性能兩方面介紹。?

9.1 優化創建索引性能?
這方面的優化途徑比較有限,IndexWriter提供了一些接口可以控制建立索引的操作,另外我們可以先將索引寫入RAMDirectory,再批量寫入FSDirectory,不管怎樣,目的都是盡量少的文件IO,因為創建索引的最大瓶頸在于磁盤IO。另外選擇一個較好的分析器也能提高一些性能。?

9.1.1 通過設置IndexWriter的參數優化索引建立?
setMaxBufferedDocs(int maxBufferedDocs)?
控制寫入一個新的segment前內存中保存的document的數目,設置較大的數目可以加快建索引速度,默認為10。?
setMaxMergeDocs(int maxMergeDocs)?
控制一個segment中可以保存的最大document數目,值較小有利于追加索引的速度,默認Integer.MAX_VALUE,無需修改。?
setMergeFactor(int mergeFactor)?
控制多個segment合并的頻率,值較大時建立索引速度較快,默認是10,可以在建立索引時設置為100。?

9.1.2 通過RAMDirectory緩寫提高性能?
我們可以先把索引寫入RAMDirectory,達到一定數量時再批量寫進FSDirectory,減少磁盤IO次數。?

Java代碼?
FSDirectory fsDir = FSDirectory.getDirectory("/data/index", true);???
RAMDirectory ramDir = new RAMDirectory();???
IndexWriter fsWriter = new IndexWriter(fsDir, new StandardAnalyzer(), true);???
IndexWriter ramWriter = new IndexWriter(ramDir, new StandardAnalyzer(), true);???
while (there are documents to index)???
{???
... create Document ...???
ramWriter.addDocument(doc);???
if (condition for flushing memory to disk has been met)???
{???
fsWriter.addIndexes(new Directory[] { ramDir });???
ramWriter.close();???
ramWriter = new IndexWriter(ramDir, new StandardAnalyzer(), true);???
}???
}??

9.1.3 選擇較好的分析器?
這個優化主要是對磁盤空間的優化,可以將索引文件減小將近一半,相同測試數據下由600M減少到380M。但是對時間并沒有什么幫助,甚至會需要更長時間,因為較好的分析器需要匹配詞庫,會消耗更多cpu,測試數據用StandardAnalyzer耗時133分鐘;用MMAnalyzer耗時150分鐘。?

9.2 優化搜索性能?
雖然建立索引的操作非常耗時,但是那畢竟只在最初創建時才需要,平時只是少量的維護操作,更何況這些可以放到一個后臺進程處理,并不影響用戶搜索。我們創建索引的目的就是給用戶搜索,所以搜索的性能才是我們最關心的。下面就來探討一下如何提高搜索性能。?

9.2.1 將索引放入內存?
這是一個最直觀的想法,因為內存比磁盤快很多。Lucene提供了RAMDirectory可以在內存中容納索引:?

Java代碼?
Directory fsDir = FSDirectory.getDirectory(“/data/index/”, false);???
Directory ramDir = new RAMDirectory(fsDir);???
Searcher searcher = new IndexSearcher(ramDir);??

但是實踐證明RAMDirectory和FSDirectory速度差不多,當數據量很小時兩者都非???#xff0c;當數據量較大時(索引文件400M)RAMDirectory甚至比FSDirectory還要慢一點,這確實讓人出乎意料。?
而且lucene的搜索非常耗內存,即使將400M的索引文件載入內存,在運行一段時間后都會out of memory,所以個人認為載入內存的作用并不大。?

9.2.2 優化時間范圍限制?
既然載入內存并不能提高效率,一定有其它瓶頸,經過測試發現最大的瓶頸居然是時間范圍限制,那么我們可以怎樣使時間范圍限制的代價最小呢??
當需要搜索指定時間范圍內的結果時,可以:?
1、用RangeQuery,設置范圍,但是RangeQuery的實現實際上是將時間范圍內的時間點展開,組成一個個BooleanClause加入到 BooleanQuery中查詢,因此時間范圍不可能設置太大,經測試,范圍超過一個月就會拋BooleanQuery.TooManyClauses,可以通過設置 BooleanQuery.setMaxClauseCount(int maxClauseCount)擴大,但是擴大也是有限的,并且隨著maxClauseCount擴大,占用內存也擴大?
2、用RangeFilter代替RangeQuery,經測試速度不會比RangeQuery慢,但是仍然有性能瓶頸,查詢的90%以上時間耗費在 RangeFilter,研究其源碼發現RangeFilter實際上是首先遍歷所有索引,生成一個BitSet,標記每個document,在時間范圍內的標記為true,不在的標記為false,然后將結果傳遞給Searcher查找,這是十分耗時的。?
3、進一步提高性能,這個又有兩個思路:?
a、緩存Filter結果。既然RangeFilter的執行是在搜索之前,那么它的輸入都是一定的,就是IndexReader,而 IndexReader是由Directory決定的,所以可以認為RangeFilter的結果是由范圍的上下限決定的,也就是由具體的 RangeFilter對象決定,所以我們只要以RangeFilter對象為鍵,將filter結果BitSet緩存起來即可。lucene API已經提供了一個CachingWrapperFilter類封裝了Filter及其結果,所以具體實施起來我們可以cache CachingWrapperFilter對象,需要注意的是,不要被CachingWrapperFilter的名字及其說明誤導, CachingWrapperFilter看起來是有緩存功能,但的緩存是針對同一個filter的,也就是在你用同一個filter過濾不同 IndexReader時,它可以幫你緩存不同IndexReader的結果,而我們的需求恰恰相反,我們是用不同filter過濾同一個 IndexReader,所以只能把它作為一個封裝類。?
b、降低時間精度。研究Filter的工作原理可以看出,它每次工作都是遍歷整個索引的,所以時間粒度越大,對比越快,搜索時間越短,在不影響功能的情況下,時間精度越低越好,有時甚至犧牲一點精度也值得,當然最好的情況是根本不作時間限制。?
下面針對上面的兩個思路演示一下優化結果(都采用800線程隨機關鍵詞隨即時間范圍):?
第一組,時間精度為秒:?
方式 直接用RangeFilter 使用cache 不用filter?
平均每個線程耗時 10s 1s 300ms?

第二組,時間精度為天?
方式 直接用RangeFilter 使用cache 不用filter?
平均每個線程耗時 900ms 360ms 300ms?

由以上數據可以得出結論:?
1、 盡量降低時間精度,將精度由秒換成天帶來的性能提高甚至比使用cache還好,最好不使用filter。?
2、 在不能降低時間精度的情況下,使用cache能帶了10倍左右的性能提高。?

9.2.3 使用更好的分析器?
這個跟創建索引優化道理差不多,索引文件小了搜索自然會加快。當然這個提高也是有限的。較好的分析器相對于最差的分析器對性能的提升在20%以下。?

10 一些經驗?
10.1關鍵詞區分大小寫?
or AND TO等關鍵詞是區分大小寫的,lucene只認大寫的,小寫的當做普通單詞。?

10.2 讀寫互斥性?
同一時刻只能有一個對索引的寫操作,在寫的同時可以進行搜索?

10.3 文件鎖?
在寫索引的過程中強行退出將在tmp目錄留下一個lock文件,使以后的寫操作無法進行,可以將其手工刪除?

10.4 時間格式?
lucene只支持一種時間格式yyMMddHHmmss,所以你傳一個yy-MM-dd HH:mm:ss的時間給lucene它是不會當作時間來處理的?

10.5 設置boost?
有些時候在搜索時某個字段的權重需要大一些,例如你可能認為標題中出現關鍵詞的文章比正文中出現關鍵詞的文章更有價值,你可以把標題的boost設置的更大,那么搜索結果會優先顯示標題中出現關鍵詞的文章(沒有使用排序的前題下)。使用方法:?
Field. setBoost(float boost);默認值是1.0,也就是說要增加權重的需要設置得比1大。

?

轉載聲明:?本文轉自 http://www.javaeye.com/topic/210567 (JavaEve博客)

==============================================================================

?

Apache Lucene與Lucene.Net——全文檢索服務器

?

Lucene并不是一個爬行搜索引擎,也不會自動地索引內容。我們得先將要索引的文檔中的文本抽取出來,然后再將其加到Lucene索引中。標準的步驟是先初始化一個Analyzer、打開一個IndexWriter、然后再將文檔一個接一個地加進去。

?

十年前,在Windows世界中使用開源項目簡直是不可想象的一件事。現在.NET程序員在Java平臺上驗證并開發的企業級軟件世界中也開始覺醒了。今天讓我們一起來看看流行的全文檢索引擎——Apache Lucene與Lucene.Net。

Apache Lucene與其兄弟Lucene.Net是經過了大規模測試的產品,他們已經為一些著名站點如Wikipedia、CNET及Monster.com提供了搜索功能。因此,沒人會懷疑其功能與未來的發展。

Lucene并不是一個爬行搜索引擎,也不會自動地索引內容。我們得先將要索引的文檔中的文本抽取出來,然后再將其加到Lucene索引中。標準的步驟是先初始化一個Analyzer、打開一個IndexWriter、然后再將文檔一個接一個地加進去。一旦完成這些步驟,索引就可以在關閉前得到優化,同時所做的改變也會生效。這個過程可能比開發者習慣的方式更加手工化一些,但卻在數據的索引上給予你更多的靈活性。

我們可以借助于一個對象模型來完成搜索,通過查詢來建立條件。其次,Lucene可以解析并執行(可能由最終用戶輸入的)普通文本搜索字符串。使用.NET 3.5或后續版本的.NET開發者還有第三種選擇:LINQ to Lucene。其項目主頁上有一張圖清晰地描述了Lucene的搜索語法與相應的LINQ to Lucene語法的區別。

如果你想試一下,可以參考Andrew Smith對Lucene.NET的介紹。無論你選擇.NET還是Java版本,看看Erik Hatcher對Lucene的介紹都會大有好處。

查看英文原文:Apache Lucene and Lucene.Net – Full Text Search Servers

?

轉載聲明:?本文轉自 http://www.infoq.com/cn/news/2008/11/Lucene (Info Q)

==============================================================================

Lucene-2.0學習文檔

?

Lucene是apache組織的一個用java實現全文搜索引擎的開源項目。其功能非常的強大,api也很簡單??偟脕碚f用Lucene來進行建立和搜索和操作數據庫是差不多的(有點像),Document可以看作是數據庫的一行記錄,Field可以看作是數據庫的字段。用lucene實現搜索引擎就像用JDBC實現連接數據庫一樣簡單。

Lucene2.0,它與以前廣泛應用和介紹的Lucene 1.4.3并不兼容。

Lucene2.0的下載地址是http://apache.justdn.org/lucene/java/

大家先看一個例子,通過這個例子來對lucene的一個大概的認識。

一個Junit測試用例:(為了讓代碼清晰好看,我們將異常都拋出)

a)??? 這是一個建立文件索引的例子

public void testIndexHello() throws IOException
??? {
??????? Date date1 = new Date();????????
??????? //可以說是創建一個新的寫入工具
??????? //第一個參數是要索引建立在哪個目錄里
??????? //第二個參數是新建一個文本分析器,這里用的是標準的大家也可以自己寫一個
??????? //第三個參數如果是true,在建立索引之前先將c://index目錄清空。
??????? IndexWriter writer = new IndexWriter("c://index",new StandardAnalyzer(),true);????????
??????? // 這個是數據源的文件夾
??????? File file = new File("c://file");
??????? /* 例子主要是將C://file目錄下的文件的內容進行建立索引,將文件路徑作為搜索內容的附屬. */? ????????????
??????? if(file.isDirectory())
??????? {
??????????? String[] fileList = file.list();


??????????? for (int i = 0; i < fileList.length; i++)
??????????? {
???????????? ? //? 建立一個新的文檔,它可以看作是數據庫的一行記錄

??????????????? Document doc = new Document();

??????????????? File f = new File(file,

??????????????????????? fileList[i]);

??????????????? Reader reader = new BufferedReader(new FileReader(f));

??????????????? doc.add(new Field("file",reader));//為doument添加field

??????????????? doc.add(new Field("path",f.getAbsolutePath(),Field.Store.YES,Field.Index.NO));

??????????????? writer.addDocument(doc);
??????????? }
??????? }

??????? writer.close();//這一步是必須的,只有這樣數據才會被寫入索引的目錄里

??????? Date date2 = new Date();

??????? System.out.println("用時"+(date2.getTime()-date1.getTime())+"毫秒");

}?

注意:因為建立索引本來就是費時,所以說最后輸出的用時會比較長,請不要奇怪。?

b)一個通過索引來全文檢索的例子?

public void HelloSearch() throws IOException, ParseException?

??? {
??????? IndexSearcher indexSearcher = new IndexSearcher("c://index");//和上面的IndexWriter一樣是一個工具

??????? QueryParser queryParser = new QueryParser("file",//這是一個分詞器

??????????????? new StandardAnalyzer());

??????? BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

??????? Query query = queryParser.parse(br.readLine());//這個地方Query是抽象類大家也注意一下,下面會講到的

??????? Hits hits = indexSearcher.search(query);

??????? Document doc = null;

??????? System.out.print("正搜索................");

??????? for (int i = 0; i < hits.length(); i++)
??????? {
??????????? doc = hits.doc(i);

??????????? System.out.println("內容是:"+doc.get("file"));//注意這里輸出的是什么

??????????? System.out.println("文件的路徑是:" + doc.get("path"));
??????? }
??? }?

通過上面的兩個例子應該可以看出Lucene還是比較簡單的。

運行一下上面的兩個例子,大家可能會說怎么doc.get(“file”);返回的是空呢,我們馬上會講到。

?

轉載聲明:?本文轉自 http://www.360doc.com/content/06/1229/01/16773_311395.shtml (360 doc)

==============================================================================

?

Lucene.Net 基本用法

?

本文僅記錄一些簡單的使用方法,供初學者參考。
以下例子采用 Lucene.NET 1.9 版本,可取去 Lucene.Net 下載。

1. 基本應用
using System;
using System.Collections.Generic;
using System.Text;
using Lucene.Net;
using Lucene.Net.Analysis;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.QueryParsers;
using Lucene.Net.Search;
using Lucene.Net.Store;
using Lucene.Net.Util;

namespace ConsoleApplication1.Lucene
{
? public class LuceneTest
? {
??? private const string FieldName = "name";
??? private const string FieldValue = "value";

??? private Directory directory = new RAMDirectory();
??? private Analyzer analyzer = new StandardAnalyzer();

??? public LuceneTest()
??? {
??? }

??? private void Index()
??? {
????? IndexWriter writer = new IndexWriter(directory, analyzer, true);
????? writer.maxFieldLength = 1000;
??????
????? for (int i = 1; i <= 100; i++)
????? {
??????? Document document = new Document();

??????? document.Add(new Field(FieldName, "name" + i, Field.Store.YES, Field.Index.UN_TOKENIZED));
??????? document.Add(new Field(FieldValue, "Hello, World!", Field.Store.YES, Field.Index.TOKENIZED));

??????? writer.AddDocument(document);
????? }

????? writer.Optimize();
????? writer.Close();
??? }

??? private void Search()
??? {
????? Query query = QueryParser.Parse("name*", FieldName, analyzer);

????? IndexSearcher searcher = new IndexSearcher(directory);

????? Hits hits = searcher.Search(query);
??????
????? Console.WriteLine("符合條件記錄:{0}; 索引庫記錄總數:{1}", hits.Length(), searcher.Reader.NumDocs());
????? for (int i = 0; i < hits.Length(); i++)
????? {
??????? int docId = hits.Id(i);
??????? string name = hits.Doc(i).Get(FieldName);
??????? string value = hits.Doc(i).Get(FieldValue);
??????? float score = hits.Score(i);

??????? Console.WriteLine("{0}: DocId:{1}; Name:{2}; Value:{3}; Score:{4}",?
????????? i + 1, docId, name, value, score);
????? }

????? searcher.Close();
??? }
? }
}

除了 RAMDirectory,還可以使用 FSDirectory。(注意 FSDirectory.GetDirectory 的 create 參數,為 true 時將刪除已有索引庫文件,可以通過 IndexReader.IndexExists() 方法判斷。)

從指定目錄打開已有索引庫。
private Directory directory = FSDirectory.GetDirectory("c:/index", false);

將索引庫載入內存,以提高搜索速度。
private Directory directory = new RAMDirectory(FSDirectory.GetDirectory(@"c:/index", false));
//或
//private Directory directory = new RAMDirectory(c:/index");

2. 多字段搜索

使用 MultiFieldQueryParser 可以指定多個搜索字段。
Query query = MultiFieldQueryParser.Parse("name*", new string[] { FieldName, FieldValue }, analyzer);

IndexReader reader = IndexReader.Open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
Hits hits = searcher.Search(query);

3. 多條件搜索

除了使用 QueryParser.Parse 分解復雜的搜索語法外,還可以通過組合多個 Query 來達到目的。
Query query1 = new TermQuery(new Term(FieldValue, "name1")); // 詞語搜索
Query query2 = new WildcardQuery(new Term(FieldName, "name*")); // 通配符?
//Query query3 = new PrefixQuery(new Term(FieldName, "name1")); // 字段搜索 Field:Keyword,自動在結尾添加 *
//Query query4 = new RangeQuery(new Term(FieldNumber, NumberTools.LongToString(11L)), new Term(FieldNumber, NumberTools.LongToString(13L)), true); // 范圍搜索
//Query query5 = new FilteredQuery(query, filter); // 帶過濾條件的搜索
??????
BooleanQuery query = new BooleanQuery();
query.Add(query1, BooleanClause.Occur.MUST);
query.Add(query2, BooleanClause.Occur.MUST);

IndexSearcher searcher = new IndexSearcher(reader);
Hits hits = searcher.Search(query);

4. 設置權重

可以給 Document 和 Field 增加權重(Boost),使其在搜索結果排名更加靠前。缺省情況下,搜索結果以 Document.Score 作為排序依據,該數值越大排名越靠前。Boost 缺省值為 1。
Score = Score * Boost

通過上面的公式,我們就可以設置不同的權重來影響排名。

如下面的例子中根據 VIP 級別設定不同的權重。
Document document = new Document();
switch (vip)
{
? case VIP.Gold: document.SetBoost(2F); break;
? case VIP.Argentine: document.SetBoost(1.5F); break;
}

只要 Boost 足夠大,那么就可以讓某個命中結果永遠排第一位,這就是百度等網站的"收費排名"業務。明顯有失公平,鄙視一把。??

5. 排序

通過 SortField 的構造參數,我們可以設置排序字段,排序條件,以及倒排。
Sort sort = new Sort(new SortField(FieldName, SortField.DOC, false));

IndexSearcher searcher = new IndexSearcher(reader);
Hits hits = searcher.Search(query, sort);

排序對搜索速度影響還是很大的,盡可能不要使用多個排序條件。

6. 過濾

使用 Filter 對搜索結果進行過濾,可以獲得更小范圍內更精確的結果。

舉個例子,我們搜索上架時間在 2005-10-1 到 2005-10-30 之間的商品。
對于日期時間,我們需要轉換一下才能添加到索引庫,同時還必須是索引字段。
// index
document.Add(FieldDate, DateField.DateToString(date), Field.Store.YES, Field.Index.UN_TOKENIZED);

//...

// search
Filter filter = new DateFilter(FieldDate, DateTime.Parse("2005-10-1"), DateTime.Parse("2005-10-30"));
Hits hits = searcher.Search(query, filter);

除了日期時間,還可以使用整數。比如搜索價格在 100 ~ 200 之間的商品。
Lucene.Net NumberTools 對于數字進行了補位處理,如果需要使用浮點數可以自己參考源碼進行。
// index
document.Add(new Field(FieldNumber, NumberTools.LongToString((long)price), Field.Store.YES, Field.Index.UN_TOKENIZED));

//...

// search
Filter filter = new RangeFilter(FieldNumber, NumberTools.LongToString(100L), NumberTools.LongToString(200L), true, true);
Hits hits = searcher.Search(query, filter);

使用 Query 作為過濾條件。
QueryFilter filter = new QueryFilter(QueryParser.Parse("name2", FieldValue, analyzer));

我們還可以使用 FilteredQuery 進行多條件過濾。
Filter filter = new DateFilter(FieldDate, DateTime.Parse("2005-10-10"), DateTime.Parse("2005-10-15"));
Filter filter2 = new RangeFilter(FieldNumber, NumberTools.LongToString(11L), NumberTools.LongToString(13L), true, true);

Query query = QueryParser.Parse("name*", FieldName, analyzer);
query = new FilteredQuery(query, filter);
query = new FilteredQuery(query, filter2);

IndexSearcher searcher = new IndexSearcher(reader);
Hits hits = searcher.Search(query);

7. 分布搜索

我們可以使用 MultiReader 或 MultiSearcher 搜索多個索引庫。
MultiReader reader = new MultiReader(new IndexReader[] { IndexReader.Open(@"c:/index"), IndexReader.Open(@"//server/index") });
IndexSearcher searcher = new IndexSearcher(reader);
Hits hits = searcher.Search(query);


IndexSearcher searcher1 = new IndexSearcher(reader1);
IndexSearcher searcher2 = new IndexSearcher(reader2);
MultiSearcher searcher = new MultiSearcher(new Searchable[] { searcher1, searcher2 });
Hits hits = searcher.Search(query);

還可以使用 ParallelMultiSearcher 進行多線程并行搜索。

8. 合并索引庫

將 directory1 合并到 directory2 中。
Directory directory1 = FSDirectory.GetDirectory("index1", false);
Directory directory2 = FSDirectory.GetDirectory("index2", false);

IndexWriter writer = new IndexWriter(directory2, analyzer, false);
writer.AddIndexes(new Directory[] { directory });
Console.WriteLine(writer.DocCount());
writer.Close();

9. 顯示搜索語法字符串

我們組合了很多種搜索條件,或許想看看與其對等的搜索語法串是什么樣的。
BooleanQuery query = new BooleanQuery();
query.Add(query1, true, false);
query.Add(query2, true, false);
//...

Console.WriteLine("Syntax: {0}", query.ToString());

輸出:
Syntax: +(name:name* value:name*) +number:[0000000000000000b TO 0000000000000000d]

呵呵,就這么簡單。

10. 操作索引庫

刪除 (軟刪除,僅添加了刪除標記。調用 IndexWriter.Optimize() 后真正刪除。)
IndexReader reader = IndexReader.Open(directory);

// 刪除指定序號(DocId)的 Document。
reader.Delete(123);

// 刪除包含指定 Term 的 Document。
reader.Delete(new Term(FieldValue, "Hello"));

// 恢復軟刪除。
reader.UndeleteAll();

reader.Close();

增量更新 (只需將 create 參數設為 false,即可往現有索引庫添加新數據。)
Directory directory = FSDirectory.GetDirectory("index", false);
IndexWriter writer = new IndexWriter(directory, analyzer, false);
writer.AddDocument(doc1);
writer.AddDocument(doc2);
writer.Optimize();
writer.Close();

11. 優化

批量向 FSDirectory 增加索引時,增大合并因子(mergeFactor )和最小文檔合并數(minMergeDocs)有助于提高性能,減少索引時間。
IndexWriter writer = new IndexWriter(directory, analyzer, true);

writer.maxFieldLength = 1000; // 字段最大長度
writer.mergeFactor = 1000;
writer.minMergeDocs = 1000;

for (int i = 0; i < 10000; i++)
{
? // Add Documentes...
}

writer.Optimize();
writer.Close();

相關參數說明?


轉自《深入 Lucene 索引機制》

利用 Lucene,在創建索引的工程中你可以充分利用機器的硬件資源來提高索引的效率。當你需要索引大量的文件時,你會注意到索引過程的瓶頸是在往磁盤上寫索引文件的過程中。為了解決這個問題, Lucene 在內存中持有一塊緩沖區。但我們如何控制 Lucene 的緩沖區呢?幸運的是,Lucene 的類 IndexWriter 提供了三個參數用來調整緩沖區的大小以及往磁盤上寫索引文件的頻率。

1.合并因子 (mergeFactor)

這個參數決定了在 Lucene 的一個索引塊中可以存放多少文檔以及把磁盤上的索引塊合并成一個大的索引塊的頻率。比如,如果合并因子的值是 10,那么當內存中的文檔數達到 10 的時候所有的文檔都必須寫到磁盤上的一個新的索引塊中。并且,如果磁盤上的索引塊的隔數達到 10 的話,這 10 個索引塊會被合并成一個新的索引塊。這個參數的默認值是 10,如果需要索引的文檔數非常多的話這個值將是非常不合適的。對批處理的索引來講,為這個參數賦一個比較大的值會得到比較好的索引效果。

2.最小合并文檔數 (minMergeDocs)

這個參數也會影響索引的性能。它決定了內存中的文檔數至少達到多少才能將它們寫回磁盤。這個參數的默認值是10,如果你有足夠的內存,那么將這個值盡量設的比較大一些將會顯著的提高索引性能。

3.最大合并文檔數 (maxMergeDocs)

這個參數決定了一個索引塊中的最大的文檔數。它的默認值是 Integer.MAX_VALUE,將這個參數設置為比較大的值可以提高索引效率和檢索速度,由于該參數的默認值是整型的最大值,所以我們一般不需要改動這個參數。


-------------------迷糊中的分割線-----------------------------

Lucene 相關資源:

1. Lucene 官方網站
2. Apache Lucene
3. Lucene FAQ
4. Lucene.Net
5. Lucene API (Java)
6. DotLucene
7. Luke - Lucene Index Toolbox
8. Nutch
9. LUCENE.COM.CN 中國
10. Compass
11. 實戰 Lucene,第 1 部分: 初識 Lucene
12. 深入 Lucene 索引機制

?

轉載聲明:?本文轉自 http://www.rainsts.net/article.asp?id=313 (雨痕)

轉載于:https://www.cnblogs.com/skybreak/archive/2013/05/06/3063520.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的lucene,lucene.net学习教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

免费男女羞羞的视频网站中文字幕 | 激情视频91| 久久综合狠狠综合久久综合88 | 97看片吧 | adc在线观看| 黄色福利视频网站 | 最近日本韩国中文字幕 | 视频精品一区二区三区 | 成在线播放| 在线韩国电影免费观影完整版 | 日韩高清免费在线观看 | av在线一二三区 | 久久久免费观看视频 | 五月婷在线 | 99久久毛片 | 午夜视频亚洲 | 成人不用播放器 | 综合色狠狠 | 欧美老少交| 色视频在线免费 | 99精品视频网 | 久久成年人 | 91中文字幕在线视频 | 天天色综合1 | 三级黄色在线观看 | www.eeuss影院av撸 | 国产无套一区二区三区久久 | 中文有码在线 | 国产精品aⅴ | 六月丁香婷婷久久 | 黄色大片免费播放 | 中文国产字幕 | 免费亚洲视频 | 国产精品永久久久久久久www | 天天躁日日躁狠狠 | 亚洲黄色精品 | 国产五月天婷婷 | 狠狠色丁婷婷日日 | 国产一区av在线 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 成年人免费看 | 国产小视频在线免费观看视频 | 成人精品电影 | 成人午夜电影网站 | 久久久国产精品视频 | 国产麻豆电影 | 三级在线视频播放 | 亚洲深夜影院 | 亚洲激情在线观看 | 中文字幕中文字幕中文字幕 | 精精国产xxxx视频在线播放 | www.黄色网.com | 亚洲一级黄色大片 | 99免费在线视频 | 久久精品精品 | 久久国产午夜精品理论片最新版本 | 成人av网站在线观看 | 2021国产精品视频 | 99人久久精品视频最新地址 | 亚州精品一二三区 | 亚洲视频高清 | 视频在线观看亚洲 | 91亚洲视频在线观看 | 精品一区二区三区香蕉蜜桃 | 国产精品一区一区三区 | 在线观看 国产 | 色偷偷av男人天堂 | 激情中文字幕 | 国产91综合一区在线观看 | 欧美a在线免费观看 | 久久久一本精品99久久精品 | 成人久久久久久久久 | 国产一区二区高清 | 久久国产经典 | 欧美99久久| www免费视频com━ | 五月婷婷在线观看 | 久久久精品亚洲 | 久久五月婷婷综合 | 手机版av在线 | 日韩av免费一区二区 | 久久综合国产伦精品免费 | 丁香婷婷基地 | 亚洲狠狠丁香婷婷综合久久久 | 亚洲精品乱码久久久久久高潮 | 久久免费激情视频 | 天天操导航 | 亚洲免费视频观看 | 九九九热精品免费视频观看 | 综合网久久 | 欧美成年网站 | 国产精品自产拍在线观看蜜 | 国产人成在线视频 | 国产午夜精品免费一区二区三区视频 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 国产一性一爱一乱一交 | 久久只有精品 | 国产视频欧美视频 | 国产视频日韩视频欧美视频 | 国产h在线播放 | 色噜噜日韩精品欧美一区二区 | 国产一级在线免费观看 | 亚洲aⅴ免费在线观看 | 奇米7777狠狠狠琪琪视频 | 日韩有码第一页 | 成人在线观看资源 | 久久久黄色免费网站 | a久久久久久 | 在线色亚洲 | 日韩美在线观看 | 00av视频| 国产高清第一页 | 日本成人中文字幕在线观看 | 91精品对白一区国产伦 | 久久情爱 | 久久久久免费网站 | 国产视频资源在线观看 | 久久久网| 成人一级电影在线观看 | 亚洲黄色免费网站 | 二区三区精品 | 国产精品不卡av | 992tv又爽又黄的免费视频 | 国产高清在线免费视频 | 午夜视频一区二区三区 | 久久久久国产一区二区 | 成人激情开心网 | 国产精品自在欧美一区 | 91人人干| 天天天干夜夜夜操 | 操天天操 | 亚洲精品国产精品久久99热 | 国产精品日韩在线 | 久草精品在线播放 | 久久五月婷婷丁香社区 | 在线黄色国产电影 | 91麻豆视频 | 91精品1区| 亚洲精品一区二区18漫画 | 欧美日韩国产网站 | 婷婷激情久久 | 91亚洲在线观看 | 国产亚洲精品久久久久久 | 激情在线五月天 | 国产精品一区免费在线观看 | 韩国一区二区三区在线观看 | 亚洲欧美成人在线 | 日韩av网页 | 色姑娘综合天天 | 欧美精品免费在线观看 | 在线免费高清 | 91av官网| 四虎国产精品免费观看视频优播 | 午夜av剧场 | 91精品国自产在线偷拍蜜桃 | 日韩在线视频线视频免费网站 | 日韩精品视频一二三 | 不卡的av | 欧美日韩三级 | 国产 色 | 精品天堂av | 久久人人添人人爽添人人88v | 91精品国产91久久久久福利 | 91大神精品视频在线观看 | 亚洲欧美日韩精品久久久 | 福利区在线观看 | 最新av在线网站 | 亚洲午夜av| 美女网站在线播放 | 91完整版在线观看 | 啪啪av在线 | 国产一区二区三区高清播放 | 天天综合五月天 | 九九免费在线观看 | 99免在线观看免费视频高清 | 一区二区不卡在线观看 | 色偷偷人人澡久久超碰69 | 日韩视频一区二区三区 | 国产日产精品一区二区三区四区的观看方式 | 韩国一区视频 | 99操视频 | 在线免费观看黄色 | 18岁免费看片| 91免费国产在线观看 | 国产精品久久久久影院日本 | 91福利国产在线观看 | 丝袜精品视频 | 日一日操一操 | 国产亚洲成av人片在线观看桃 | 精品一区二区在线免费观看 | 久热这里有精品 | 黄色免费观看视频 | 91久久国产自产拍夜夜嗨 | 天天综合人人 | 久久久96| av一区二区三区在线 | 亚洲高清久久久 | 人人爽人人爽人人爽人人爽 | 午夜精品视频一区 | 成人黄色在线 | 亚洲精品国产精品乱码在线观看 | 中文有码在线 | 中文字幕一区二区三区四区在线视频 | 免费观看特级毛片 | 最新av免费在线观看 | 亚洲一二区精品 | 久久久久久久久久久网 | 亚洲 欧洲av | 婷婷五天天在线视频 | 2023av在线| 国产精品k频道 | 国产精品第一视频 | 亚洲手机天堂 | 日韩色在线 | 久久精品国产亚洲精品 | av超碰在线观看 | 日韩二区三区在线观看 | 九九九九热精品免费视频点播观看 | 一级免费看 | 久久久久9999亚洲精品 | 国产精品视频地址 | 亚洲成人网av | 久久精品www人人爽人人 | 视频在线日韩 | 久久五月天婷婷 | 久久久久影视 | 97视频播放 | 国产免费一区二区三区最新 | 最新色视频 | 国产在线国偷精品产拍 | 久久不射电影院 | 国产露脸91国语对白 | 91av在线电影 | 久久久久草 | 黄污视频网站大全 | 亚洲成a人片综合在线 | 久久久五月婷婷 | 色婷婷97 | 狠狠狠狠狠操 | 亚洲波多野结衣 | 狠狠干网站 | 四虎影视久久久 | 91在线视频免费91 | 亚洲va韩国va欧美va精四季 | 97超视频免费观看 | 波多野结衣精品在线 | 丰满少妇在线观看网站 | 成人午夜在线观看 | 日韩欧美电影 | 91视频午夜| 久久热首页 | 91久久国产露脸精品国产闺蜜 | 成人动漫精品一区二区 | 久久久免费国产 | 国内精品视频久久 | 2019中文| 国产精品久久久久aaaa九色 | 亚洲人成人天堂h久久 | 超碰999| 日韩网站一区二区 | 国产精品2020 | 国产精品一区二区三区视频免费 | 99热99re6国产在线播放 | 免费网站看av片 | 国产精品乱码高清在线看 | 日韩免费在线看 | 免费一级片视频 | 久久高清av | 婷婷丁香激情 | 国产第一二区 | 四虎永久免费 | 午夜av在线播放 | 天天射成人 | 日日夜夜狠狠干 | 狠狠色丁香婷婷综合橹88 | 在线天堂中文www视软件 | 成人一级在线观看 | 日韩av看片 | 丁香午夜 | av在线精品| 成人一级电影在线观看 | 字幕网在线观看 | 日韩v欧美v日本v亚洲v国产v | 久久午夜色播影院免费高清 | 久久精品中文字幕一区二区三区 | 中文字幕日韩无 | 九热在线 | 1024手机在线看 | 很黄很污的视频网站 | 国产亚洲精品久久久久久久久久 | 欧美精品久久久久久久亚洲调教 | 色噜噜狠狠狠狠色综合久不 | 亚洲视频一 | 久草在线播放视频 | 不卡电影一区二区三区 | 亚洲乱码精品久久久久 | 成年人在线免费视频观看 | 精品国产一区二区三区蜜臀 | 深爱激情av| 亚洲国产中文字幕 | 操高跟美女 | 中文字幕日本在线观看 | 亚洲精品视频在线观看免费 | 久久久久久久久久久黄色 | 五月天婷婷在线观看视频 | 国产视频色 | 免费三级a| 在线免费观看视频一区二区三区 | 国产精品99久久久久人中文网介绍 | 久久精品人 | 特级西西444www大精品视频免费看 | 久久国产一区二区三区 | 黄色三级av| 99中文视频在线 | 青草视频在线 | 日韩在线观看中文字幕 | 日韩黄色免费 | 国产二区精品 | 免费在线观看日韩 | 亚洲国产精品成人女人久久 | 在线黄色av电影 | 成人黄色短片 | 久久99久久99久久 | 97视频在线免费播放 | 成人av一区二区兰花在线播放 | a级国产乱理论片在线观看 特级毛片在线观看 | 天天操夜操 | 亚洲成av人片在线观看 | 新版资源中文在线观看 | 国产97在线看 | 久黄色 | 成人h视频在线播放 | 国产自在线观看 | 97人人模人人爽人人喊中文字 | 国产视 | 五月天婷亚洲天综合网鲁鲁鲁 | 日韩久久精品 | 久热只有精品 | 婷婷亚洲五月 | 国产亚洲片 | 就要干b | 欧美性春潮 | 美女一级毛片视频 | 亚洲欧美日韩国产一区二区 | 日韩网站视频 | 欧美精品久| 亚洲精品一区二区三区四区高清 | 久久国产精品成人免费浪潮 | 激情中文字幕 | 亚州精品国产 | 国产精品久久久久久a | 欧美一区日韩精品 | 九九免费观看视频 | 免费观看黄 | 欧美日本国产在线观看 | 成人黄色片免费 | 久久96 | 国产美腿白丝袜足在线av | 在线观看av的网站 | 尤物一区二区三区 | 国产精品国产三级国产aⅴ9色 | 欧美一区免费观看 | 亚洲手机天堂 | 手机av在线网站 | 在线国产高清 | 奇米影视999 | 黄色在线免费观看网址 | 久草在线这里只有精品 | 久久99视频免费观看 | 91麻豆产精品久久久久久 | www色av| 欧美aⅴ在线观看 | 狠狠干婷婷 | 国产一区二区高清视频 | 亚洲精品乱码久久久久 | 高清av免费看 | 69热国产视频| 丁香激情视频 | 国产色综合天天综合网 | 黄色免费国产 | 亚洲国产精品成人女人久久 | 婷婷社区五月天 | 亚洲 欧洲av| 丁香六月在线观看 | 日韩区在线观看 | 91久久精品一区二区三区 | 欧美另类调教 | av亚洲产国偷v产偷v自拍小说 | 在线日韩| 国产三级在线播放 | 亚洲小视频在线 | 国产不卡在线观看 | 亚洲视频在线观看网站 | 日一日操一操 | 四虎在线永久免费观看 | 欧美日韩免费观看一区=区三区 | 亚洲精品国产区 | 国产精品一区二区av麻豆 | 伊人热 | 久久久久国产精品一区二区 | 国产精品高清免费在线观看 | 天天射天天艹 | 国产91免费在线观看 | 999久久久精品视频 日韩高清www | 在线观看国产永久免费视频 | 日韩一区在线免费观看 | 中文av在线免费观看 | 中文字幕中文 | 免费黄色网址大全 | 在线观看亚洲国产 | 久久久久久久久毛片精品 | 中文字幕亚洲字幕 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 精品国产资源 | 日日天天干 | 日韩欧美视频免费观看 | 91九色porny蝌蚪视频 | 欧美日韩精品在线观看视频 | 国产精品av在线 | 国产视频999| 91久久久久久久一区二区 | 天天插一插 | 久久久久伦理电影 | 免费在线观看中文字幕 | 手机av在线网站 | 亚洲成人一区 | 精品国产视频在线观看 | 黄色网www| 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 天堂av在线网 | 九九视频在线 | 色婷婷亚洲婷婷 | 免费看片黄色 | 国产精品网站一区二区三区 | 美女黄网站视频免费 | 中文字幕国产亚洲 | 天天天射 | 久久久国产99久久国产一 | 国产精品久久久久永久免费看 | 夜夜骑日日操 | 欧美日韩国产色综合一二三四 | 在线免费看片 | 91人人人| 9i看片成人免费看片 | 久久一区二区免费视频 | 久久综合久色欧美综合狠狠 | 91av综合| av动态图片 | 亚洲精品一区二区三区新线路 | 欧美a视频在线观看 | 亚洲免费资源 | 国产福利免费看 | 国产一级二级三级视频 | 亚洲高清av在线 | www.色的| 国产我不卡| 精品国产乱码久久久久 | 在线观看日本高清mv视频 | 四虎影视精品永久在线观看 | 在线观看免费av片 | 美女网站视频一区 | 一级片色播影院 | 国产精品免费一区二区三区 | 国产区久久| 91在线蜜桃臀 | 久久视频这里有久久精品视频11 | 久久久久久高潮国产精品视 | av一二三区| 精品伦理一区二区三区 | 欧美激情精品久久久久久免费 | 超碰在线最新地址 | 久久国产热 | 亚洲精品国产欧美在线观看 | 狠狠色丁香久久综合网 | 最近高清中文在线字幕在线观看 | 9久久精品 | 片黄色毛片黄色毛片 | 日韩中文字幕视频在线观看 | 波多野结衣在线视频免费观看 | 精品成人国产 | 欧亚日韩精品一区二区在线 | 成人永久免费 | 免费在线观看成人 | 91视视频在线直接观看在线看网页在线看 | 激情欧美一区二区三区免费看 | 日韩在线观看 | 久久国产精品免费一区二区三区 | 干狠狠| 久久国产乱 | 精品国产一二三 | 一区二区三区四区五区在线 | 人人射人人澡 | 国产成人香蕉 | 免费黄色a网站 | 中国一级片在线播放 | 色狠狠干 | 男女免费av | 日韩欧美精品一区 | 久久国产精品色婷婷 | 人人爽人人爽人人片av免 | 97视频免费在线观看 | 黄色成人在线观看 | 中文字幕久久网 | 99自拍视频在线观看 | 亚洲精品视频在线 | 亚洲视频精品在线 | 激情综合站 | 亚在线播放中文视频 | 成人免费中文字幕 | 国产在线传媒 | 成 人 黄 色 视频播放1 | 在线导航av | 久久中文字幕视频 | 日韩在线视频不卡 | 久久91久久久久麻豆精品 | 最新亚洲视频 | 69夜色精品国产69乱 | 久久国产精品久久精品国产演员表 | 成人黄色一级视频 | 国产精品一区二区在线免费观看 | 国产精品自产拍在线观看桃花 | 成人免费在线观看入口 | www.97色.com| 日韩视频在线观看免费 | 亚洲综合五月天 | av在线播放快速免费阴 | 亚洲黄色av网址 | 国产在线黄 | 特级aaa毛片| 九九热re | 精品一二三四五区 | 在线观看色视频 | 天天鲁一鲁摸一摸爽一爽 | 久久激情影院 | 免费看三片 | 天天干天天做 | 日本护士三级少妇三级999 | 国产精品女同一区二区三区久久夜 | 91久久人澡人人添人人爽欧美 | 日韩精品在线免费播放 | 国产五月色婷婷六月丁香视频 | www.人人草 | 久久a国产 | 99九九99九九九视频精品 | www.国产精品 | 国产日韩在线视频 | 啪啪免费视频网站 | 国产一级特黄电影 | 免费在线一区二区 | 亚洲精品自拍视频在线观看 | 91视频免费网站 | 色婷婷av一区二 | 亚洲国产精品久久 | 成片免费观看视频999 | 草久久精品 | 色婷婷久久久综合中文字幕 | 青青草久草在线 | 免费在线观看成人小视频 | 亚洲精品高清在线 | 欧美成人性战久久 | 少妇自拍av | 看片网站黄 | 激情欧美一区二区免费视频 | av无限看| 蜜臀av性久久久久av蜜臀妖精 | 久久www免费人成看片高清 | 久久综合九色综合网站 | 久草在线视频网 | 久久久久亚洲a | 成人av资源网站 | 国产aa精品| 欧美亚洲精品一区 | 四虎永久视频 | 亚洲另类在线视频 | 欧美色综合天天久久综合精品 | 超碰97成人 | 日韩欧美一区二区不卡 | 四虎国产精品永久在线国在线 | 欧美亚洲另类在线视频 | 极品嫩模被强到高潮呻吟91 | 成人wwwxxx视频 | 最近能播放的中文字幕 | 国产一级精品在线观看 | 国产亚洲精品无 | 91 在线视频播放 | 精品国产精品久久一区免费式 | 国产综合小视频 | 在线观看va | 国产精品免费麻豆入口 | 国产无限资源在线观看 | 久热久草在线 | 天堂av网站| 欧美日韩久久不卡 | 黄色毛片在线观看 | 国产在线97 | 欧美久久久久久久 | 久久成年人视频 | 免费久久网 | 日本成人免费在线观看 | 91精品久久久久久久91蜜桃 | 精品国产伦一区二区三区免费 | 激情中文字幕 | 久久久久久伊人 | 久久久香蕉视频 | www.99在线观看 | 五月天电影免费在线观看一区 | 成年人免费看的视频 | 2022中文字幕在线观看 | 女女av在线 | 精品国产一区二区三区不卡 | 欧美一级日韩三级 | 久草久热| 九九在线播放 | 国产精品久久久久久久7电影 | 狠狠撸电影| 久草网在线观看 | 天天操天天综合网 | 欧美性受极品xxxx喷水 | 精品黄色片 | 99超碰在线播放 | 免费观看成人网 | 久久精品国产99 | 久久伊人爱 | 综合激情伊人 | 激情综合亚洲 | 国产亚洲视频在线免费观看 | 日韩婷婷 | 在线看国产日韩 | 色婷婷综合久久久久中文字幕1 | 日韩精品高清视频 | 成人a v视频| 狠狠色噜噜狠狠狠狠 | 久草国产在线 | 一区二区三区免费在线观看视频 | 色婷在线 | 久草在线这里只有精品 | 丰满少妇对白在线偷拍 | 伊人久久在线观看 | 亚洲永久精品在线观看 | 视频在线观看入口黄最新永久免费国产 | 欧美成人黄色片 | 97福利社| 久久久久久国产精品久久 | 日韩有码在线观看视频 | 国产精品99久久久精品免费观看 | 国产免费一区二区三区网站免费 | 91麻豆看国产在线紧急地址 | 日本中文一级片 | 国产精品嫩草影院99网站 | 久久天天躁夜夜躁狠狠躁2022 | 五月婷婷影院 | 国产亚洲精品久久久久动 | 婷婷六月丁香激情 | 在线激情影院一区 | 亚洲砖区区免费 | 精品久久久久久久久久久久久久久久久久 | 91亚·色| 欧美日韩中字 | 日免费视频 | 久久视频99 | 亚洲涩涩网 | 97在线观看免费高清完整版在线观看 | 黄色aaa毛片 | 国产精品午夜久久久久久99热 | 国产91精品久久久久久 | 色爱区综合激月婷婷 | 毛片美女网站 | 色婷婷丁香 | 中文av网站| 日韩精品高清不卡 | 久久久久久久影视 | 黄色片软件网站 | 精品麻豆入口免费 | 国产精品一区在线观看 | 成人福利在线观看 | 国产高清99 | 亚洲欧美激情插 | av福利网址导航 | 这里只有精品视频在线观看 | 亚洲aaa毛片 | 天天操夜夜看 | 久久99九九99精品 | 在线成人免费 | 成人一区影院 | 欧美性生活免费看 | 日韩视频一区二区 | 国产精品久久久久久久久久99 | 日韩午夜在线观看 | 日韩啪啪小视频 | 青青河边草免费视频 | 高清视频一区 | 色综合久久中文综合久久牛 | 欧美成a人片在线观看久 | 午夜骚影 | 中文字幕国产精品一区二区 | 91桃色在线观看视频 | 日本三级人妇 | 人人爽人人看 | 国产精品久久99综合免费观看尤物 | 久草网在线观看 | 国色天香在线 | 国产精品入口传媒 | 日韩视频欧美视频 | 欧美一性一交一乱 | 开心综合网 | av一级在线| 成人污视频在线观看 | 久久国产精品第一页 | 久久久久国产一区二区三区四区 | 免费在线成人av电影 | 色香网| 国产一区二区三区在线免费观看 | 国产裸体bbb视频 | 亚洲精品国产成人av在线 | 中文字幕日韩免费视频 | 456成人精品影院 | 99久久综合狠狠综合久久 | 国产精品久久久久影视 | 欧美大片在线观看一区 | 色综合久久88色综合天天6 | 国产第一页精品 | 97在线免费视频观看 | 久久精品综合视频 | 亚洲午夜久久久久 | 国产日韩精品欧美 | 国际精品久久久久 | 日韩欧美在线综合网 | 91网站在线视频 | 黄色特级一级片 | 97人人精品| 欧美日韩在线观看一区 | 97精品国产91久久久久久 | 日韩中文字幕免费视频 | 精品在线小视频 | 中国一级片免费看 | 国产高清中文字幕 | 久热av| 91精品一区二区三区久久久久久 | 超碰在线人人爱 | 成人高清在线 | 九九九热精品免费视频观看 | 日韩精品一区二区三区在线播放 | 91av视频网站 | 国产精品一区欧美 | 国产午夜三级一区二区三桃花影视 | 日韩精品黄 | 麻豆久久久久久久 | 久久综合九色综合欧美狠狠 | 911香蕉视频 | 91麻豆精品国产91久久久久 | 精品在线观看一区二区三区 | 精品久久1| 中文字幕麻豆 | www.色婷婷.com | 国内小视频在线观看 | 在线观看的黄色 | 久久综合狠狠综合久久狠狠色综合 | 久草a在线 | 亚洲欧美精品一区二区 | 久草在线手机视频 | 97碰在线 | 国产大尺度视频 | 国产成人精品一区二区三区福利 | 92中文资源在线 | 色婷婷亚洲婷婷 | 亚洲精品国产精品99久久 | 欧美视频一区二 | 久久tv视频 | 国产成人精品一区在线 | 99热都是精品 | 欧亚日韩精品一区二区在线 | 国产青草视频在线观看 | 国产小视频在线播放 | 91传媒在线观看 | 在线免费视 | 亚洲激情婷婷 | 成年人在线播放视频 | 欧美日韩在线精品一区二区 | 国产色在线观看 | av大片免费在线观看 | 超碰在线观看av | www.久草.com | 成年人视频在线观看免费 | 久久夜色精品国产欧美乱极品 | 在线免费黄色片 | 伊人狠狠色| 日韩肉感妇bbwbbwbbw | 欧美综合久久久 | 久久深夜 | 一区二区三区四区在线 | 国产精品 国产精品 | 免费色网 | 久久高清免费 | 国产精品视频区 | 日日干美女 | 99久久夜色精品国产亚洲96 | 欧美做受高潮1 | 在线观看亚洲国产精品 | 亚洲一区二区精品3399 | 午夜视频在线观看一区二区三区 | av电影在线不卡 | 久香蕉 | 91中文字幕在线视频 | 亚洲无毛专区 | 日日碰狠狠躁久久躁综合网 | 精品久久一二三区 | 成年人黄色免费视频 | 中文字幕乱在线伦视频中文字幕乱码在线 | 午夜av日韩| 狠狠综合 | 久久久久国产精品午夜一区 | 97福利社 | 人成午夜视频 | 中文一二区 | 久久99深爱久久99精品 | 久久精品日产第一区二区三区乱码 | 在线中文字幕观看 | 精品久久久久久久久久 | 成年人视频在线免费播放 | 欧美精品一区二区在线播放 | 黄色软件视频大全免费下载 | 精品久久免费 | 黄色网址av | 精品国产三级a∨在线欧美 免费一级片在线观看 | 久久精品免费看 | 黄色一区三区 | 五月婷婷综合网 | 看国产黄色片 | 欧美乱淫视频 | 国产一区二区三区在线免费观看 | 午夜av电影院| 777视频在线观看 | 亚洲精品在线视频观看 | 国产精品久久久亚洲 | 亚洲国产日韩一区 | 日韩二区在线 | 久久久国产精品一区二区中文 | 一区二区三区av在线 | 99精品视频一区二区 | 在线国产视频观看 | 91视视频在线直接观看在线看网页在线看 | 国产精品美女久久久 | 成人免费观看av | 精品国产一区二区三区在线观看 | 日本久久综合视频 | av成人在线播放 | 久久精品第一页 | 国产精品综合久久久久久 | 久久99精品国产 | 久久99精品国产99久久 | 一级黄色片在线免费观看 | 国产美女精品视频 | 中文字幕 第二区 | 国产高清av在线播放 | 一区 二区 精品 | 黄色毛片视频免费观看中文 | 在线观看免费视频 | 免费在线观看一区 | 亚洲男男gⅴgay双龙 | 天天干干| 欧美一级高清片 | 99国产精品一区二区 | av中文字幕在线电影 | 国产视频精选 | 日韩福利在线观看 | 色偷偷888欧美精品久久久 | 99久久日韩精品免费热麻豆美女 | 日韩一区二区三区在线观看 | 国产成人333kkk | 就色干综合 | www.操.com | 日本黄色大片免费看 | 在线国产91| 色综合天天做天天爱 | 亚洲免费av电影 | 国产亚洲精品久久久久久移动网络 | 天天干天天天天 | 国产成人一区二区三区久久精品 | 91av亚洲 | 免费激情在线电影 | 色国产在线 | 午夜精品999 | 黄色影院在线免费观看 | 国产精品久久久久一区 | 久久公开免费视频 | 久久久.com| 五月开心网 | 久久久精品久久 | 久久久免费观看视频 | 亚洲精品国产精品乱码不99热 | 国产精品美女免费视频 | 国内一级片在线观看 | 中文字幕在线观看资源 | 久久99精品久久久久久三级 | 亚洲精品久久视频 | 精品一区二区在线免费观看 | 在线观看视频国产 | 日本中文字幕在线 | www黄色com | 草久热| 黄色三级免费观看 | 人人插人人艹 | 亚洲aaa毛片 | 在线免费观看视频一区二区三区 | 天天干天天插伊人网 | 在线免费观看黄色 | 欧美美女视频在线观看 | 最近日本字幕mv免费观看在线 | 99这里只有久久精品视频 | 毛片视频电影 | 欧美三级在线播放 | 亚洲视频在线观看 | 亚洲国产日韩精品 | 久草免费新视频 | 久久国产日韩 | 亚洲日本va中文字幕 | 亚洲精品久久久蜜臀下载官网 | 激情五月婷婷综合 | 亚洲精品色婷婷 | 国产91精品一区二区麻豆亚洲 | 国产高清av在线播放 | 久久五月婷婷综合 | 国产精品系列在线播放 | 一级黄色片在线免费观看 | 色综合天天射 | www国产一区| 亚洲精品综合一二三区在线观看 | 天天插夜夜操 | 久久精品精品电影网 | 天天操天天曰 | 欧美专区亚洲专区 | 天天综合狠狠精品 | 亚洲成年人在线播放 | 成人av播放 | 成人久久18免费 | 中文字幕在线视频一区二区三区 | 亚洲二区精品 | 精品国产亚洲在线 | 亚洲 欧美 成人 | 国产精品一区久久久久 | 97超碰免费在线观看 | 在线精品观看国产 | 亚洲精品视频在线观看免费视频 | 337p日本大胆噜噜噜噜 | 国产精品一区二区在线 | 日韩免费大片 | 国产精品一区二区三区免费视频 | 精品一区二区三区在线播放 | 精品一区二区亚洲 | 一区二区三区在线影院 | 免费在线精品视频 | 国产亚洲精品久久久久秋 | 精品视频在线视频 | 成人国产在线 | 一区二区三区污 | 国产精品第一页在线 | 日韩欧美一区二区在线播放 | 亚洲免费在线观看视频 | 免费在线观看一区 | 九九亚洲视频 | 亚洲人成精品久久久久 | 丁香色综合 | 麻豆视频在线 | 国产97在线观看 | 日韩一级电影在线观看 | 91在线影视 | a午夜电影 | 韩国在线视频一区 | 91精品福利在线 | 最新av电影网站 | 欧美与欧洲交xxxx免费观看 | 人人超在线公开视频 | 日韩视| 国产精品尤物视频 | 狠狠色伊人亚洲综合成人 | 国产女做a爱免费视频 | 免费在线观看成人 | 91av社区 | 91网页版在线观看 | 久精品一区 | 中文字幕色综合网 | a黄色大片 | 国产成人一区二区精品非洲 | 婷婷色中文网 | 黄色小说免费观看 | 三级动图 | 国产精品久久一 | 99视频一区| 园产精品久久久久久久7电影 | 91精品老司机久久一区啪 | av片一区二区 | 国产精品99精品久久免费 | 一区二区精 | 成人一区不卡 | 免费在线观看不卡av | 91成人精品 | 色综合天天综合 | 探花系列在线 |