亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Lucene 索引 高亮顯示

系統 4652 0

要說這高亮,還是比較好搞的,就是要引用luncene的highlight這個包,然后調用它里面的方法就可以了。主要代碼如下:

TokenStream tokenStream = null ;
????????????????????????????
/** 添加關鍵詞高亮顯示 start */
Document doc = hits.doc(i);
????????????????
SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter( "<span style='color:#FF0000; background-color:#FFFF00'>" , "</span>" );????
Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(query));
????????????????????????????
/** 對標題進行高亮處理 */
String title = "";
String titleTmp = doc.get( "title" );
highlighter.setTextFragmenter( new SimpleFragmenter(titleTmp.length()));
????????????????????????????
if (titleTmp != null )
{????
  tokenStream = TokenSources.getAnyTokenStream(reader, hits.id(i), "title" , analyzer);
  title = highlighter.getBestFragment(tokenStream, titleTmp);
}
????????????????????????????
/** 對內容進行高亮處理 */
String content = "";
String contentTmp = doc.get( "content" );
highlighter.setTextFragmenter( new SimpleFragmenter(contentTmp.length()));
????????????????????????????
if (contentTmp != null )
{????
  tokenStream = TokenSources.getAnyTokenStream(reader, hits.id(i), "content" , analyzer);
  content = highlighter.getBestFragment(tokenStream, contentTmp);
}
/** 添加關鍵詞高亮顯示 end */

  上面這段代碼就已經對關鍵詞進行了高亮的處理,高亮處理后,關鍵詞的在網頁的顯示效果為
  當初令我困擾的地方并不是如何實現高亮,畢竟實現高亮的代碼google一下有很多,真正令我困擾的是如果將處理后的結果顯示到網頁上?因為我要返回一個List給前端頁面, 這個List中存儲的是Lucene的Document,但是在做高亮處理時,是將Docuemnt的內容取出放到了String類型的變量里,最初的時候,由于腦子一時沒轉過來所以一直不知道該如何在頁面上顯示,經過一個周末的休息,周一上班時腦子突然活絡——將處理好的內容再重新封裝到Lucene的Document中,不就可以像沒處理前一樣,添加到List里然后返回給前端頁面了嗎,我怎么早沒想到呢。封裝代碼如下:

/** 重新封裝Lucene的Docuemnt */
Document docTmp = new Document();
docTmp.add( new Field( "docid" , doc.get( "docid" ),Field.Store.YES, Field.Index.NO));
/** 添加title */
docTmp.add( new Field( "title" , title,Field.Store.YES, Field.Index.TOKENIZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
/** 添加content */
docTmp.add( new Field( "content" , content, Field.Store.YES,Field.Index.TOKENIZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
docTmp.add( new Field( "url" , doc.get( "url" ),Field.Store.YES, Field.Index.NO));
????????????????????????????
/** 將封裝好的Document添加到List中 */
listTmp.add(docTmp);

?

?

?

?

?

Lucene關鍵字高亮顯示

在Lucene的org.apache.lucene.search.highlight包中提供了關于高亮顯示檢索關鍵字的工具。使用百度、Google搜索的時候,檢索結果顯示的時候,在摘要中實現與關鍵字相同的詞條進行高亮顯示,百度和Google指定紅色高亮顯示。

有了Lucene提供的高亮顯示的工具,可以很方便地實現高亮顯示的功能。

高亮顯示,就是根據用戶輸入的檢索關鍵字,檢索找到該關鍵字對應的檢索結果文件,提取對應于該文件的摘要文本,然后根據設置的高亮格式,將格式寫入到摘要文本中對應的與關鍵字相同或相似的詞條上,在網頁上顯示出來,該摘要中的與關鍵字有關的文本就會以高亮的格式顯示出來。

Lucene中org.apache.lucene.search.highlight.SimpleHTMLFormatter類可以構造一個高亮格式,這是最簡單的構造方式,例如:

SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<font color='red'>", "</font>");

構造方法聲明為public SimpleHTMLFormatter(String preTag, String postTag),因為這種高亮格式是依賴于網頁文件的,HTML文件中是以標記(tag)來標識的,即存在一個preTag和一個postTag。

上面構造的高亮格式是摘要中出現的關鍵字使用紅色來顯示,區分其它文本。

通過構造好的高亮格式對象,來構造一個org.apache.lucene.search.highlight.Highlighter實例,然后根據對檢索結果得到的Field的文本內容(這里是指摘要文本)進行切分,找到與檢索關鍵字相同或相似的詞條,將高亮格式加入到摘要文本中,返回一個新的、帶有格式的摘要文本,在網頁上就可以呈現高亮顯示。

下面實現一個簡單的例子,展示實現高亮顯示的處理過程。

測試類如下所示:

package org.shirdrn.lucene.learn.highlight;

import java.io.IOException;
import java.io.StringReader;

import net.teamhot.lucene.ThesaurusAnalyzer;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;

public class MyHighLighter {

private String indexPath = "F:\\index";
private Analyzer analyzer;
private IndexSearcher searcher;

public MyHighLighter(){
?? analyzer = new ThesaurusAnalyzer();
}

public void createIndex() throws IOException {?? // 該方法建立索引
?? IndexWriter writer = new IndexWriter(indexPath,analyzer,true);
?? Document docA = new Document();
?? String fileTextA = "因為火燒云總是燃燒著消失在太陽沖下地平線的時刻,然后便是寧靜的自然的天籟,沒有誰會在這樣的時光的鏡片里傷感自語,因為燦爛給人以安靜的舒適感。";
?? Field fieldA = new Field("contents", fileTextA, Field.Store.YES,Field.Index.TOKENIZED);
?? docA.add(fieldA);
??
?? Document docB = new Document();
?? String fileTextB = "因為帶有以傷痕為代價的美麗風景總是讓人不由地惴惴不安,緊接著襲面而來的抑或是病痛抑或是災難,沒有誰會能夠安逸著恬然,因為模糊讓人撕心裂肺地想吶喊。";
?? Field fieldB = new Field("contents", fileTextB, Field.Store.YES,Field.Index.TOKENIZED);
?? docB.add(fieldB);
??
?? Document docC = new Document();
?? String fileTextC = "我喜歡上了一個人孤獨地行游,在夢與海洋的交接地帶熾烈燃燒著。"+
?? "因為,一條孤獨的魚喜歡上了火焰的顏色,真是荒唐地不合邏輯。";
?? Field fieldC = new Field("contents", fileTextC, Field.Store.YES,Field.Index.TOKENIZED);
?? docC.add(fieldC);
??
?? writer.addDocument(docA);
?? writer.addDocument(docB);
?? writer.addDocument(docC);
?? writer.optimize();
?? writer.close();
}

public void search(String fieldName,String keyword) throws CorruptIndexException, IOException, ParseException{??
// 檢索的方法,并實現高亮顯示
?? searcher = new IndexSearcher(indexPath);
?? QueryParser queryParse = new QueryParser(fieldName, analyzer);???? //?? 構造QueryParser,解析用戶輸入的檢索關鍵字
?? Query query = queryParse.parse(keyword);
?? Hits hits = searcher.search(query);
?? for(int i=0;i<hits.length();i++){
??? Document doc = hits.doc(i);
??? String text = doc.get(fieldName);
??? SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<font color='red'>", "</font>");???
??????????? Highlighter highlighter = new Highlighter(simpleHTMLFormatter,new QueryScorer(query));???
??????????? highlighter.setTextFragmenter(new SimpleFragmenter(text.length()));??????
??????????? if (text != null) {???
??????????????? TokenStream tokenStream = analyzer.tokenStream(fieldName,new StringReader(text));???
??????????????? String highLightText = highlighter.getBestFragment(tokenStream, text);
??????????????? System.out.println("★高亮顯示第 "+(i+1) +" 條檢索結果如下所示:");
??????????????? System.out.println(highLightText);???
??????????? }
?? }
?? searcher.close();
}


public static void main(String[] args) {??? // 測試主函數
?? MyHighLighter mhl = new MyHighLighter();
?? try {
??? mhl.createIndex();
??? mhl.search("contents", "因為");
?? } catch (CorruptIndexException e) {
??? e.printStackTrace();
?? } catch (IOException e) {
??? e.printStackTrace();
?? } catch (ParseException e) {
??? e.printStackTrace();
?? }
}

}

程序說明:

1、createIndex()方法:使用ThesaurusAnalyzer分析器為指定的文本建立索引。每個Document中都有一個name為contents的Field。在實際應用中,可以再構造一一個name為path的Field,指定檢索到的文件的路徑(本地路徑或者網絡上的鏈接地址)

2、根據已經建好的索引庫進行檢索。這首先需要解析用戶輸入的檢索關鍵字,使用QueryParser,必須與后臺使用的分析器相同,否則不能保證解析得到的查詢(由詞條構造)Query檢索到合理的結果集。

3、根據解析出來的Query進行檢索,檢索結果集保存在Hits中。遍歷,提取每個滿足條件的Document的內容,程序中直接把它的內容當作摘要內容,實現高亮顯示。在實際應用中,應該對應著一個提取摘要(或者檢索數據庫得到檢索關鍵字對應的結果集文件的摘要內容)的過程。有了摘要以后,就可以為摘要內容增加高亮格式。

4、如果提取結果集文件的前N個字符串作為摘要,只需要在 highlighter.setTextFragmenter(new SimpleFragmenter(text.length())); 中設置顯示摘要的字數,這里顯示全部的文本作為摘要。

運行程序,結果如下所示:

詞庫尚未被初始化,開始初始化詞庫.
初始化詞庫結束。用時:3906毫秒;
共添加195574個詞語。
★高亮顯示第 1 條檢索結果如下所示:
<font color='red'>因為</font> 火燒云總是燃燒著消失在太陽沖下地平線的時刻,然后便是寧靜的自然的天籟,沒有誰會在這樣的時光的鏡片里傷感自語 ,<font color='red'>因為</font> 燦爛給人以安靜的舒適感。
★高亮顯示第 2 條檢索結果如下所示:
<font color='red'>因為</font> 帶有以傷痕為代價的美麗風景總是讓人不由地惴惴不安,緊接著襲面而來的抑或是病痛抑或是災難,沒有誰會能夠安逸著恬然 ,<font color='red'>因為</font> 模糊讓人撕心裂肺地想吶喊。
★高亮顯示第 3 條檢索結果如下所示:
我喜歡上了一個人孤獨地行游,在夢與海洋的交接地帶熾烈燃燒著。 <font color='red'>因為</font> ,一條孤獨的魚喜歡上了火焰的顏色,真是荒唐地不合邏輯。

上面的檢索結果在HTML網頁中,就會高亮顯示關鍵字“因為”,顯示為紅色。

傳智播客課程——Lucene搜索引擎
2010-04-04 11:51

http://blog.sina.com.cn/s/blog_5de48f8b0100dple.html

??? Lucene不是一個現成的程序,類似文件搜索程序或web網絡爬行器或是一個網站的搜索引擎。Lucene是一個軟件庫,一個開發工具包,而不是一個具 有完整特征的搜索應用程序。它本身只關注文本的索引和搜索。Lucene使你可以為你的應用程序添加索引和搜索能力。目前已經有很多應用程序的搜索功能是 基于 Lucene 的,比如 Eclipse 的幫助系統的搜索功能。

??? Lucene 采用的是一種稱為反向索引(inverted index)的機制。反向索引就是說我們維護了一個詞/短語表,對于這個表中的每個詞/短語,都有一個鏈表描述了有哪些文檔包含了這個詞/短語。這樣在用戶輸入查詢條件的時候,就能非常快的得到搜索結果。

??? 文檔建立好索引后,就可以在這些索引上面進行搜索了。搜索引擎首先會對搜索的關鍵詞進行解析,然后再在建立好的索引上面進行查找,最終返回和用戶輸入的關鍵詞相關聯的文檔。
?? 今天在傳智播客的課堂上,湯陽光老師教我們實現了簡單的Lucene搜索引擎,使我們能夠對大量的文檔實現不同需求的查找。以下是我的總結。


1. 準備環境:添加jar包
? lucene-core-2.4.0.jar(核心);
? lucene-analyzers-2.4.0.jar(分詞器);
? lucene-highlighter-2.4.0.jar(高亮器);


2. 構造IndexWriter。IndexWriter是Lucene用來創建索引的一個核心的類。使用構造方法IndexWriter(Directory d, Analyzer a, MaxFieldLength mfl); 如果索引不存在,就會被創建。

* 相關參數說明

<1> Directory,代表了 Lucene 的索引的存儲的位置。這是一個抽象類,常用的有兩個實現,第一個是 FSDirectory,它表示一個存儲在文件系統中的索引位置。第二個是 RAMDirectory,它表示一個存儲在內存當中的索引位置。

<2> Analyzer,在一個文檔被索引之前,首先需要對文檔內容進行分詞處理,這部分工作就是由 Analyzer 來做的。Analyzer 類是一個抽象類,它有多個實現。針對不同的語言和應用需要選擇適合的 Analyzer。Analyzer 把分詞后的內容交給IndexWriter 來建立索引。

<3> MaxFieldLength,用于限制Field的大小。這個變量可以讓用戶有計劃地對大文檔Field進行截取。假如取值為10000,就只索引每個 Field的前10000個Term(關鍵字)。也就是說每個Field中只有前10000個Term(關鍵字)建立索引,除此之外的部分都不會被 Lucene索引,當然也不能被搜索到。


3. 創建索引,使用方法IndexWriter.addDocument(Document doc)。

* 相關參數說明

<1> Document,是用來描述Lucene文檔結構的。任何需要進行索引的數據都必須轉化成Document對象。Document是索引和搜索的最基本單元,是一組Field的集合。

<2> Field,組成Document的元素,用來描述一個文檔的某個屬性的,比如一封電子郵件的標題和內容可以用兩個Field對象分別描述。Field是 由name和value組成的,value只接受字符串(非字符串類型要先轉換成字符串才行)。在構造Field時要指定Store和Index。

??? Field.Store,指定Field是否或怎樣存儲。
?? Store.NO,不存儲。
?? Store.YES,存儲。
?? Store.COMPRESS,壓縮后存儲(數據量很大的時候可以使用,但要考慮效率)。

??? Field.Index,指定Field是否或怎么被索引。
?? Index.NO,不索引(不索引就不能被搜索到)。
?? Index.ANALYZED,(以前版本中為TOKENIZED),分詞后索引。
?? Index.NOT_ANALYZED,(以前版本中為UN_TOKENIZED),不分詞,直接索引(把整個Field做為一個term)。

注意:當完成了索引操作后,一定要調用IndexWriter.close()方法。


4,刪除索引:

IndexWriter.deleteDocuments(Term term);

會刪除索引文件里含有指定Term的所有Document。Term,是搜索的基本單位。代表某個Field中出現的某個關鍵字。?


5,更新索引:

IndexWriter.updateDocument(Term term, Document doc);

實際上是先刪除再創建索引,就是說如果有多條符合條件的Document,更新后只有一條。


6,搜索:

使用類IndexSearcher。查詢方法為:

IndexSearcher.search(Query, Filter, int);

相關參數說明:
<1> Query,查詢對象,把用戶輸入的查詢字符串封裝成Lucene能夠識別的Query。
<2> Filter,用來過慮搜索結果。
<2> 第三個參數(int類型),最多返回的Document的數量。
返回的是一個TopDocs類型,調用TopDocs.scoreDocs得到查詢結果。

ScoreDoc.doc返回文檔的內部編號。
IndexSearcher.doc(hits[i].doc) 通過編號,拿到文檔。

Query可以用QueryParser解析查詢字符串生成。使用構造方法為QueryParser(String defaultFieldName, Analyzer a),第一個參數為默認查詢的Field,第二個參數為使用的分詞器(這里用的分詞器要和建立索引時用的分詞器一致,否則可能會搜索不到結果)。使用parse(String)方法解析查詢內容。

相關代碼:

List<Document> docs = new ArrayList<Document>();
?IndexSearcher indexSearcher = null;
?try {
??indexSearcher = new IndexSearcher(dir);

???Filter filter = null;
??int nDocs = 10000;

???TopDocs topDocs = indexSearcher.search(query, filter, nDocs);
??System.out.println("共有【" + topDocs.totalHits + "】條匹配記錄");

???for (int i = 0; i < topDocs.totalHits; i++) {
???ScoreDoc scoreDoc = topDocs.scoreDocs[i];
???int docNum = scoreDoc.doc; // 文檔在索引庫中的編號
????Document doc = indexSearcher.doc(docNum);
// 通過編號取出相應的文檔

????docs.add(doc);
??}

???return new SearchResult(topDocs.totalHits, docs);
?} catch (Exception e) {
??throw new RuntimeException(e);
?} finally {
??try {
???indexSearcher.close();
??} catch (IOException e) {
???e.printStackTrace();
??}
?}


7,測試LuceneIndexDao的增刪改查方法,把LuceneIndexDao做為練習,要求通過LuceneIndexDaoTest中的單元測試,相關的測試代碼由于比較多,暫不一一列出。

8. 下面是對一些重要的類及術語進行解釋:

<1> Directory,有兩個:
a) FSDirectory,將索引放到磁盤中。
b) RAMDirectory,將索引放到內存中。速度快,但是在jvm退出之后,內存中的索引就不存在了。可以在jvm退出之前調用另一個使用FSDirectory的IndexWriter 把內存中的索引轉存到文件系統中。
?? 相應的API為IndexWriter.addIndexesNoOptimize(Directory[]),注意這個調用代碼要放在內存中索引的操作 RAMDirectory的IndexWriter關閉后,以便所有的document都進入RAMDirectory。在創建RAMDirectory 的實例時,可以使用無參的構造方法,或是有一個參數的構造方法:可以指定一個文件路徑,以便加載磁盤中的索引到內存中。
<2> 相關度排序,Lucene的搜索結果默認按相關度排序的,所謂相關度,就是文檔的得分。Lucene有一個評分機制,就是對檢索結果按某種標準進行評估,然后按分值的高低來對結果進行排序。

? a) 文檔的得分與用戶輸入的關鍵字有關系,而且是實時運算的結果。得分會受關鍵字在文檔中出現的位置與次數等的影響。

? b) 可以利用Boost影響Lucene查詢結果的排序,通過設置Document的Boost來影響文檔的權重,以達到控制查詢結果順序的目的:Document.setBoost(float)。默認值為1f,值越大,得分越高。

? c) 也可以在查詢時給Filed指定boost。當同樣的term屬于不同的field時,如果field的boost不一樣,其所屬的文件的得分也不一樣。
<3> Analyzer,分詞器,對文本資源進行切分,將文本按規則切分為一個個可以進行索引的最小單位(關鍵字)。

??? 對于英文的分詞,是按照標點、空白等拆分單詞,比較簡單;而中文的分詞就比較復雜了,如”中華人民共和國“可以分為”中華”、“人民”、“共和國”,但不應有“華人”這個詞(不符合語義)。

??? 中文分詞幾種常用的方式:
a) 單字分詞,就是按照中文一個字一個字地進行分詞。如:我們是中國人,效果:我\們\是\中\國\人。(StandardAnalyzer就是這樣)。
b) 二分法:按兩個字進行切分。如:我們是中國人,效果:我們\們是\是中\中國\國人。(CJKAnalyzer就是這樣)。
c) 詞庫分詞:按某種算法構造詞然后去匹配已建好的詞庫集合,如果匹配到就切分出來成為詞語。通常詞庫分詞被認為是最理想的中文分詞算法如:我們是中國人,效果為:我們\是\中國\中國人。
<4> Highlighter,高亮器,用于高亮顯示匹配的關鍵字。
包含三個主要部分:
1) 格式化器:Formatter(使用SimpleHTMLFormatter,在構造時指定前綴和后綴)。
2) 計分器:Scorer(使用QueryScorer)。
3) 段劃分器:Fragmenter(使用SimpleFragmenter,在構造時指定關鍵字所在的內容片段的長度)。

通過方法getBestFragment(Analyzer a, String fieldName,String text)實現高亮。(如果進行高亮的field中沒有出現關鍵字,返回null)。
<5> 查詢,有兩種方式:通過Query Parser解析查詢字符串或使用API構建查詢。
使用Query Parser時不匹分大小寫。以下是常用的查詢:

? 1) TermQuery,按Term(關鍵字)查詢(term的值應是最終的關鍵字,英文應全部小寫)。
?
TermQuery(Term t);
? syntax: propertyName:keyword;

? 2) RangeQuery,指定范圍查詢。
? RangeQuery(Term lowerTerm, Term upperTerm, boolean inclusive);
?? syntax: propertyName:[lower TO upper] (包含lower和upper);
? syntax: propertyName:{lower TO upper} (不包含lower和upper);

? 3) PrefixQuery,前綴查詢。
?
PrefixQuery(Term prefix);
? syntax:propertyName:prefix*;

? 4) WildcardQuery,通配符查詢,可以使用"?"代表一個字符,"*"代表0個或多個字符。(通配符不能出現在第一個位置上)
? WildcardQuery(Term term);
? syntax: propertyName:chars*chars?chars

? 5) MultiFieldQueryParser,在多個Field中查詢。
? queryParser = MultiFieldQueryParser(String[] fields, Analyzer analyzer);
? Query query = parse(String query);??
? 6) BooleanQuery,布爾查詢。這個是一個組合的Query,可以把各種Query添加進去并標明他們的邏輯關系。
? TermQuery q1 = new TermQuery(new Term("title","javadoc"));
? TermQuery q2 = new TermQuery(new Term("content","term"));
? BooleanQuery boolQuery = new BooleanQuery();
? boolQuery.add(q1, Occur.MUST);
? boolQuery.add(q2, Occur.MUST_NOT);

? Occur.MUST,必須出現。
? Occur.MUST_NOT,必須未出現。
? Occur.SHOULD,只有一個SHOULD時為必須出現,多于一個時為或的關系。

?? syntax: + - AND NOT OR (必須為大寫)。

Lucene 索引 高亮顯示


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本高清免费视频不卡a | 狠狠操夜夜操 | 天天干天天草天天 | 在线播放国产一区二区三区 | 国产香蕉国产精品偷在线观看 | 日韩v在线 | 日本毛片在线看 | 91伊人久久| 国产精品线在线精品国语 | 国产综合久久久久久鬼色 | 亚洲一区二区久久 | 性欧美xo视频在线观看 | 国产成人性毛片 | 91热爆在线 | 依人九九 | 国外免费一级 | 在线欧美国产 | 牛牛影视成人午夜影视 | 国产三级观看久久 | 久久96精品国产 | 大学生一一级毛片在线播放 | 婷婷综合另类小说色区 | 国产精品一区二区免费 | 黄色小视频在线免费观看 | 99久久国产综合精品五月天 | 成人免费毛片观看 | 中文字幕有码在线观看 | 免费国产之a视频 | 狠狠躁夜夜躁人人爽天天段 | 久久久久欧美精品 | 色片网| 波多野结衣久久一区二区 | 精品久久久久久久久久中文字幕 | 牛牛a级毛片在线播放 | 99爱在线视频这里只有精品 | 国产在线91精品入口首页 | 国产情侣久久精品 | 四虎免费影视 | 天天爽天天操 | 国产一级毛片夜一级毛片 | 亚洲高清在线观看视频 |