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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

luncene 查询字符串的解析—QueryParser类

發(fā)布時間:2025/3/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 luncene 查询字符串的解析—QueryParser类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

http://blog.csdn.net/hongfu_/article/details/1933366

搜索流程中的第二步就是構(gòu)建一個Query。下面就來介紹Query及其構(gòu)建。

當(dāng)用戶輸入一個關(guān)鍵字,搜索引擎接收到后,并不是立刻就將它放入后臺開始進(jìn)行關(guān)鍵字的檢索,而應(yīng)當(dāng)首先對這個關(guān)鍵字進(jìn)行一定的分析和處理,使之成為一種后臺可以理解的形式,只有這樣,才能提高檢索的效率,同時檢索出更加有效的結(jié)果。那么,在Lucene中,這種處理,其實就是構(gòu)建一個Query對象。

就Query對象本身言,它只是Lucene的search包中的一個抽象類,這個抽象類有許多子類,代表了不同類型的檢索。如常見的TermQuery就是將一個簡單的關(guān)鍵字進(jìn)行封裝后的對象,類似的還有BooleanQuery,即布爾型的查找。

IndexSearcher對象的search方法中總是需要一個Query對象(或是Query子類的對象),本節(jié)就來介紹各種Query類。

11.4.1??按詞條搜索—TermQuery

TermQuery是最簡單、也是最常用的Query。TermQuery可以理解成為“詞條搜索”,在搜索引擎中最基本的搜索就是在索引中搜索某一詞條,而TermQuery就是用來完成這項工作的。

在Lucene中詞條是最基本的搜索單位,從本質(zhì)上來講一個詞條其實就是一個名/值對。只不過這個“名”是字段名,而“值”則表示字段中所包含的某個關(guān)鍵字。

要使用TermQuery進(jìn)行搜索首先需要構(gòu)造一個Term對象,示例代碼如下:

Term aTerm = new Term("contents", "java");

然后使用aTerm對象為參數(shù)來構(gòu)造一個TermQuery對象,代碼設(shè)置如下:

Query query = new TermQuery(aTerm);

這樣所有在“contents”字段中包含有“java”的文檔都會在使用TermQuery進(jìn)行查詢時作為符合查詢條件的結(jié)果返回。

下面就通過代碼11.4來介紹TermQuery的具體實現(xiàn)過程。

代碼11.4? TermQueryTest.java

package ch11;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.Term;

import org.apache.lucene.search.Hits;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.Query;

import org.apache.lucene.search.TermQuery;

?

public class TermQueryTest

{

? public static void main(String[] args) throws Exception

? {

? ?? //生成Document對象

??? Document doc1 = new Document();

? ?? //添加“name”字段的內(nèi)容

??? doc1.add(Field.Text("name", "word1 word2 word3"));

? ?? //添加“title”字段的內(nèi)容

??? doc1.add(Field.Keyword("title", "doc1"));

? ?? //生成索引書寫器

??? IndexWriter writer = new IndexWriter("c://index", new StandardAnalyzer(), true);

? ??

??? //將文檔添加到索引中

??? writer.addDocument(doc1);

? ?? //關(guān)閉索引

??? writer.close();

?

? ?? //生成查詢對象query

??? Query query = null;

? ??

??? //生成hits結(jié)果對象,保存返回的檢索結(jié)果

??? Hits hits = null;

???

? ?? //生成檢索器

??? IndexSearcher searcher = new IndexSearcher("c://index");

???

? ?? //?構(gòu)造一個TermQuery對象

??? query = new TermQuery(new Term("name","word1"));

? ?? //開始檢索,并返回檢索結(jié)果到hits中

??? hits = searcher.search(query);

? ?? //輸出檢索結(jié)果中的相關(guān)信息

??? printResult(hits, "word1");

?

? ?? //?再次構(gòu)造一個TermQuery對象,只不過查詢的字段變成了"title"

??? query = new TermQuery(new Term("title","doc1"));

? ?? //開始第二次檢索,并返回檢索結(jié)果到hits中

??? hits = searcher.search(query);

? ?? //輸出檢索結(jié)果中的相關(guān)信息

??? printResult(hits, "doc1");

?

? }

?

? public static void printResult(Hits hits, String key) throws Exception

? {

? ??System.out.println("查找?/"" + key + "/" :");

??? if (hits != null)

??? {

????? if (hits.length() == 0)

????? {

??????? System.out.println("沒有找到任何結(jié)果");

????? }

????? else

????? {

??????? System.out.println("找到" + hits.length() + "個結(jié)果");

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

??????? {

????????? Document d = hits.doc(i);

????????? String dname = d.get("title");

????????? System.out.print(dname + "?? ");

??????? }

??????? System.out.println();

??????? System.out.println();

????? }

??? }

? }

}

在代碼11.4中使用TermQuery進(jìn)行檢索的運行結(jié)果如圖11-8所示。

注意:字段值是區(qū)分大小寫的,因此在查詢時必須注意大小寫的匹配。

從圖11-8中可以看出,代碼11.4兩次分別以“word1”和“doc1”為關(guān)鍵字進(jìn)行檢索,并且都只得到了一個檢索結(jié)果。

在代碼11.4中通過構(gòu)建TermQuery的對象,兩次完成了對關(guān)鍵字的查找。兩次查找過程中不同的是,第一次構(gòu)建的TermQuery是查找“name”這個字段,而第二次構(gòu)建的TermQuery則查找的是“title”這個字段。

11.4.2??“與或”搜索—BooleanQuery

BooleanQuery也是實際開發(fā)過程中經(jīng)常使用的一種Query。它其實是一個組合的Query,在使用時可以把各種Query對象添加進(jìn)去并標(biāo)明它們之間的邏輯關(guān)系。在本節(jié)中所討論的所有查詢類型都可以使用BooleanQuery綜合起來。BooleanQuery本身來講是一個布爾子句的容器,它提供了專門的API方法往其中添加子句,并標(biāo)明它們之間的關(guān)系,以下代碼為BooleanQuery提供的用于添加子句的API接口:

public void add(Query query, boolean required, boolean prohibited);

注意:BooleanQuery是可以嵌套的,一個BooleanQuery可以成為另一個BooleanQuery的條件子句。

下面以11.5為例來介紹進(jìn)行“與”操作的布爾型查詢。

代碼11.5? BooleanQueryTest1.java

package ch11;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.Term;

import org.apache.lucene.search.BooleanQuery;

import org.apache.lucene.search.Hits;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.Query;

import org.apache.lucene.search.TermQuery;

?

public class BooleanQueryTest1

{

? public static void main (String [] args) throws Exception {

? ?? //生成新的Document對象

??? Document doc1 = new Document();

??? doc1.add(Field.Text("name", "word1 word2 word3"));

??? doc1.add(Field.Keyword("title", "doc1"));

???

??? Document doc2 = new Document();

??? doc2.add(Field.Text("name", "word1 word4 word5"));

??? doc2.add(Field.Keyword("title", "doc2"));

???

??? Document doc3 = new Document();

??? doc3.add(Field.Text("name", "word1 word2 word6"));

??? doc3.add(Field.Keyword("title", "doc3"));

???

? ?? //生成索引書寫器

??? IndexWriter writer = new IndexWriter("c://index", new StandardAnalyzer(), true);

? ?? //添加到索引中

??? writer.addDocument(doc1);

??? writer.addDocument(doc2);

??? writer.addDocument(doc3);

??? writer.close();

???

??? Query query1 = null;

??? Query query2 = null;

??? BooleanQuery query = null;

??? Hits hits = null;

???

? ?? //生成IndexSearcher對象

??? IndexSearcher searcher = new IndexSearcher("c://index");

???

??? query1 = new TermQuery(new Term("name","word1"));

??? query2 = new TermQuery(new Term("name","word2"));

???

??? //?構(gòu)造一個布爾查詢

??? query = new BooleanQuery();

???

??? //?添加兩個子查詢

??? query.add(query1, true, false);

??? query.add(query2, true, false);

???

??? hits = searcher.search(query);

??? printResult(hits, "word1和word2");

???

? }

?

? public static void printResult(Hits hits, String key) throws Exception

? {

??? System.out.println("查找?/"" + key + "/" :");

??? if (hits != null)

??? {

????? if (hits.length() == 0)

????? {

??????? System.out.println("沒有找到任何結(jié)果");

????? }

????? else

????? {

??????? System.out.println("找到" + hits.length() + "個結(jié)果");

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

??????? {

????????? Document d = hits.doc(i);

????????? String dname = d.get("title");

????????? System.out.print(dname + "?? ");

??????? }

??????? System.out.println();

??????? System.out.println();

????? }

??? }

? }

}

代碼11.5首先構(gòu)造了兩個TermQuery,然后構(gòu)造了一個BooleanQuery的對象,并將兩個TermQuery當(dāng)成它的查詢子句加入Boolean查詢中。

再來看一下BooleanQuery的add方法,除了它的第一個參數(shù)外,它還有另外兩個布爾型的參數(shù)。第1個參數(shù)的意思是當(dāng)前所加入的查詢子句是否必須滿足,第2個參數(shù)的意思是當(dāng)前所加入的查詢子句是否不需要滿足。這樣,當(dāng)這兩個參數(shù)分別選擇true和false時,會有4種不同的組合。

???? true?&false:表明當(dāng)前加入的子句是必須要滿足的。

???? false&true:表明當(dāng)前加入的子句是不可以被滿足的。

???? false&false:表明當(dāng)前加入的子句是可選的。

???? true&true:錯誤的情況。

由前面的示例可以看出由于加入的兩個子句都選用了true&false的組合,因此它們兩個都是需要被滿足的,也就構(gòu)成了實際上的“與”關(guān)系,運行效果如圖11-9所示。

如果是要進(jìn)行“或”運算,則可按如下代碼來構(gòu)建查詢子句:

query.add(query1, false, false);

query.add(query2, false, false);

代碼的運行效果如圖11-10所示。

?????????????????

???????圖11-9? BooleanQuery測試1??????????????????????????圖11-10? BooleanQuery測試2

由于布爾型的查詢是可以嵌套的,因此可以表示多種條件下的組合。不過,如果子句的數(shù)目太多,可能會導(dǎo)致查找效率的降低。因此,Lucene給出了一個默認(rèn)的限制,就是布爾型Query的子句數(shù)目不能超過1024。

11.4.3??在某一范圍內(nèi)搜索—RangeQuery

有時用戶會需要一種在一個范圍內(nèi)查找某個文檔,比如查找某一時間段內(nèi)的所有文檔,此時,Lucene提供了一種名為RangeQuery的類來滿足這種需求。

RangeQuery表示在某范圍內(nèi)的搜索條件,實現(xiàn)從一個開始詞條到一個結(jié)束詞條的搜索功能,在查詢時“開始詞條”和“結(jié)束詞條”可以被包含在內(nèi)也可以不被包含在內(nèi)。它的具體用法如下:

RangeQuery query = new RangeQuery(begin, end, included);

在參數(shù)列表中,最后一個boolean值表示是否包含邊界條件本身,即當(dāng)其為TRUE時,表示包含邊界值,用字符可以表示為“[begin TO end]”;當(dāng)其為FALSE時,表示不包含邊界值,用字符可以表示為“{begin TO end}”。

下面通過代碼11.6介紹RangeQuery使用的方法。

代碼11.6? RangeQueryTest.java

package ch11;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.Term;

import org.apache.lucene.search.Hits;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.RangeQuery;

?

public class RangeQueryTest {

? ?? public static void main (String [] args) throws Exception {

? ??????

? ?????? //生成文檔對象,下同

? ?????? Document doc1 = new Document();

? ?????? //添加“time”字段中的內(nèi)容,下同

? ?? ????doc1.add(Field.Text("time", "200001"));

? ?????? //添加“title”字段中的內(nèi)容,下同

? ?? ????doc1.add(Field.Keyword("title", "doc1"));

? ?? ????

? ?? ????Document doc2 = new Document();

? ?? ????doc2.add(Field.Text("time", "200002"));

? ?? ????doc2.add(Field.Keyword("title", "doc2"));

? ?? ????

? ?? ????Document doc3 = new Document();

? ?? ????doc3.add(Field.Text("time", "200003"));

? ?? ????doc3.add(Field.Keyword("title", "doc3"));

? ?? ????

? ?? ????Document doc4 = new Document();

? ?? ????doc4.add(Field.Text("time", "200004"));

? ?? ????doc4.add(Field.Keyword("title", "doc4"));

? ?? ????

? ?? ????Document doc5 = new Document();

? ?? ????doc5.add(Field.Text("time", "200005"));

? ?? ????doc5.add(Field.Keyword("title", "doc5"));

? ?? ????

? ?????? //生成索引書寫器

? ?? ????IndexWriter writer = new IndexWriter("c://index", new StandardAnalyzer(), true);

? ?????? //設(shè)置為混合索引格式

? ????????writer.setUseCompoundFile(true);

? ??????

? ?????? //將文檔對象添加到索引中

? ?????? writer.addDocument(doc1);

? ?????? writer.addDocument(doc2);

? ?????? writer.addDocument(doc3);

? ?????? writer.addDocument(doc4);

? ?????? writer.addDocument(doc5);

? ??????

? ?????? //關(guān)閉索引

? ?????? writer.close();

? ??????

? ?????? //生成索引搜索器

? ?????? IndexSearcher searcher = new IndexSearcher("c://index");

? ??????

? ?????? //構(gòu)造詞條

? ?????? Term beginTime = new Term("time","200001");

? ?????? Term endTime = new Term("time","200005");

? ??????

? ?????? //用于保存檢索結(jié)果

? ?????? Hits hits = null;

? ?????? //生成RangeQuery對象,初始化為null

? ?????? RangeQuery query = null;

? ??????

? ?????? //構(gòu)造RangeQuery對象,檢索條件中不包含邊界值

? ?????? query = new RangeQuery(beginTime, endTime, false);

? ?????? //開始檢索,并返回檢索結(jié)果

? ?????? hits = searcher.search(query);

? ?????? //輸出檢索結(jié)果的相關(guān)信息

? ?????? printResult(hits, "從200001~200005的文檔,不包括200001和200005");

? ??????

? ?????? //再構(gòu)造一個RangeQuery對象,檢索條件中包含邊界值

? ?????? query = new RangeQuery(beginTime, endTime, true);

? ?????? //開始第二次檢索

? ?????? hits = searcher.search(query);

? ?????? //輸出檢索結(jié)果的相關(guān)信息

? ?????? printResult(hits, "從200001~200005的文檔,包括200001和200005");

? ??????

? ?? }

? ??

? ?? public static void printResult(Hits hits, String key) throws Exception

? ?????? {System.out.println("查找?/"" + key + "/" :");

? ?????? if (hits != null) {

? ?????????? if (hits.length() == 0) {

? ?????????????? System.out.println("沒有找到任何結(jié)果");

? ?????????? } else {

? ?????????????? System.out.print("找到");

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

? ?????????????????? Document d = hits.doc(i);

? ?????????????????? String dname = d.get("title");

? ?????????????????? System.out.print(dname + "?? " );

? ?????????????? }

? ?????????????? System.out.println();

? ?????????????? System.out.println();

? ?????????? }

? ?????? }

? ?? }

}

在上述代碼中首先構(gòu)造了兩個Term詞條,然后構(gòu)造了一個RangeQuery對象。在初始化RangeQuery對象的時候,使用構(gòu)造的兩個Term詞條作為RangeQuery構(gòu)造函數(shù)的參數(shù)。前面已經(jīng)說過,RangeQuery的構(gòu)造函數(shù)中的兩個參數(shù)分別稱為“開始詞條”和“結(jié)束詞條”,它的含義也就是查找介于這兩者之間的所有Document。

構(gòu)建的Document的“time”字段值均介于200001~200005之間,其檢索結(jié)果如圖11-11所示。

圖11-11? RangeQuery測試結(jié)果

從圖11-11中可以看出,在代碼11.6中使用RangeQuery共進(jìn)行了兩次檢索,第一次的檢索條件中不包括邊界值,第二次的檢索條件中包括邊界值。

從代碼11.6和圖11-11中可以看出,第1次使用FALSE參數(shù)構(gòu)造的RangeQuery對象不包括2個邊界值,因此只返回3個Document,而第2次使用TRUE參數(shù)構(gòu)造的RangeQuery則包括2個邊界值,因此將5個Document全部返回了。

11.4.4??使用前綴搜索—PrefixQuery

PrefixQuery就是使用前綴來進(jìn)行查找的。通常情況下,首先定義一個詞條Term。該詞條包含要查找的字段名以及關(guān)鍵字的前綴,然后通過該詞條構(gòu)造一個PrefixQuery對象,就可以進(jìn)行前綴查找了。

下面以代碼11.7為例來介紹使用PrefixQuery進(jìn)行檢索的運行過程。

代碼11.7? PrefixQueryTest.java

package ch11;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.Term;

import org.apache.lucene.search.Hits;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.PrefixQuery;

import org.apache.lucene.search.RangeQuery;

?

public class PrefixQueryTest {

? ?? public static void main(String[] args) throws Exception {

? ?????? //生成Document對象,下同

? ?????? Document doc1 = new Document();

? ?????? //添加“name”字段的內(nèi)容,下同

? ?????? doc1.add(Field.Text("name", "David"));

? ?????? //添加“title”字段的內(nèi)容,下同

? ?????? doc1.add(Field.Keyword("title", "doc1"));

?

? ?????? Document doc2 = new Document();

? ?????? doc2.add(Field.Text("name", "Darwen"));

? ?????? doc2.add(Field.Keyword("title", "doc2"));

?

? ?????? Document doc3 = new Document();

? ?????? doc3.add(Field.Text("name", "Smith"));

? ?????? doc3.add(Field.Keyword("title", "doc3"));

?

? ?????? Document doc4 = new Document();

? ?????? doc4.add(Field.Text("name", "Smart"));

? ?????? doc4.add(Field.Keyword("title", "doc4"));

?

? ?????? //生成索引書寫器

? ?????? IndexWriter writer = new IndexWriter("c://index",

? ?????????????? new StandardAnalyzer(), true);

? ?????? //設(shè)置為混合索引模式

? ?????? writer.setUseCompoundFile(true);

? ?????? //依次將文檔添加到索引中

? ?????? writer.addDocument(doc1);

? ?????? writer.addDocument(doc2);

? ?????? writer.addDocument(doc3);

? ?????? writer.addDocument(doc4);

? ?????? //關(guān)閉索引書寫器

? ?????? writer.close();

?

? ?????? //生成索引搜索器對象

? ?????? IndexSearcher searcher = new IndexSearcher("c://index");

? ?????? //構(gòu)造詞條

? ?????? Term pre1 = new Term("name", "Da");

??? ???? Term pre2 = new Term("name", "da");

? ?????? Term pre3 = new Term("name", "sm");

?

? ?????? //用于保存檢索結(jié)果

? ?????? Hits hits = null;

? ?????? //生成PrefixQuery類型的對象,初始化為null

? ?????? PrefixQuery query = null;

?

? ?????? query = new PrefixQuery(pre1);

?

? ?????? //開始第一次檢索,并返回檢索結(jié)果

? ?????? hits = searcher.search(query);

? ?????? //輸出相應(yīng)的檢索結(jié)果

? ?????? printResult(hits, "前綴為'Da'的文檔");

? ??????

? ?????? query = new PrefixQuery(pre2);

? ?????? //開始第二次檢索,并返回檢索結(jié)果

? ?????? hits = searcher.search(query);

? ?????? //輸出相應(yīng)的檢索結(jié)果

? ?????? printResult(hits, "前綴為'da'的文檔");

? ??????

? ?????? query = new PrefixQuery(pre3);

? ?????? //開始第二次檢索,并返回檢索結(jié)果

? ?????? hits = searcher.search(query);

? ?????? //輸出相應(yīng)的檢索結(jié)果

? ?????? printResult(hits, "前綴為'sm'的文檔");

?

? ?? }

?

? ?? public static void printResult(Hits hits, String key) throws Exception

? ?????? {System.out.println("查找?/"" + key + "/" :");

? ?????? if (hits != null) {

? ?????????? if (hits.length() == 0) {

? ?????????????? System.out.println("沒有找到任何結(jié)果");

? ?????????????? System.out.println();

? ?????????? } else {

? ?????????????? System.out.print("找到");

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

? ?????????????????? //取得文檔

? ?????????????????? Document d = hits.doc(i);

? ?????????????????? //取得“title”字段的內(nèi)容

? ?????????????????? String dname = d.get("title");

? ?????????????????? System.out.print(dname + "?? ");

? ?????????????? }

? ?????????????? System.out.println();

? ?????????????? System.out.println();

? ?????????? }

? ?????? }

? ?? }

}

在上述代碼中,首先構(gòu)造了4個不同的Document。每個Document都有一個名為“name”的字段,其中存儲了人物的名稱。然后,代碼構(gòu)建了3個不同的詞條,分別為“Da”、“da”和“sm”,可以看到,它們正好都是“name”字段中關(guān)鍵字的前綴。

代碼的運行結(jié)果如圖11-12所示。

從圖11-12中可以看出,使用PrefixQuery共進(jìn)行了3次檢索,關(guān)鍵字分別為“Da”、“da”和“sm”,返回的檢索結(jié)果情況在圖中已經(jīng)有明確的說明。不過,如果使用“Da”作為關(guān)鍵字會沒有任何的檢索結(jié)果,而使用“da”就有檢索結(jié)果,這個問題將在后面作詳細(xì)介紹。

從代碼11.7和圖11-12中可以看出,“da”前綴和“sm”前綴都順利地找到了它們所在的文檔,可是為什么與文檔中關(guān)鍵字大小寫一致的“Da”卻沒有找到呢?這是因為Lucene的標(biāo)準(zhǔn)分析器在進(jìn)行分詞過濾時將所有的關(guān)鍵字一律轉(zhuǎn)成了小寫,所以才會出現(xiàn)這樣的結(jié)果。這也是開發(fā)者應(yīng)當(dāng)引起注意的地方。

11.4.5??多關(guān)鍵字的搜索—PhraseQuery

除了普通的TermQuery外,Lucene還提供了一種Phrase查 詢的功能。用戶在搜索引擎中進(jìn)行搜索時,常常查找的并非是一個簡單的單詞,很有可能是幾個不同的關(guān)鍵字。這些關(guān)鍵字之間要么是緊密相聯(lián),成為一個精確的短 語,要么是可能在這幾個關(guān)鍵字之間還插有其他無關(guān)的關(guān)鍵字。此時,用戶希望將它們找出來。不過很顯然,從評分的角度看,這些關(guān)鍵字之間擁有與查找內(nèi)容無關(guān) 短語所在的文檔的分值一般會較低一些。

PhraseQuery正是Lucene所提供的滿足上述需求的一種Query對象。它的add方法可以讓用戶往其內(nèi)部添加關(guān)鍵字,在添加完畢后,用戶還可以通過setSlop()方法來設(shè)定一個稱之為“坡度”的變量來確定關(guān)鍵字之間是否允許、允許多少個無關(guān)詞匯的存在。

下面以代碼11.8為例對PhraseQuery進(jìn)行介紹。

代碼11.8? PhraseQueryTest.java

package ch11;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.Term;

import org.apache.lucene.search.Hits;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.PhraseQuery;

import org.apache.lucene.search.PrefixQuery;

?

public class PhraseQueryTest {

? ?? public static void main(String[] args) throws Exception {

? ?????? //生成Document對象

? ?????? Document doc1 = new Document();

? ?????? //添加“content”字段的內(nèi)容

? ?????? doc1.add(Field.Text("content", "david mary smith robert"));

? ?????? //添加“title”字段的內(nèi)容

? ?????? doc1.add(Field.Keyword("title", "doc1"));

?

? ?????? //生成索引書寫器

? ?????? IndexWriter writer = new IndexWriter("c://index",

? ?????????????? new StandardAnalyzer(), true);

? ?????? //設(shè)置為混合索引格式

? ?????? writer.setUseCompoundFile(true);

? ?????? //將文檔添加到索引中

? ?????? writer.addDocument(doc1);

? ?????? //關(guān)閉索引

? ?????? writer.close();

?

? ?????? //生成索引搜索器

? ?????? IndexSearcher searcher = new IndexSearcher("c://index");

? ?????? //構(gòu)造詞條

? ?????? Term word1 = new Term("content", "david");

? ?????? Term word2 = new Term("content","mary");

? ?????? Term word3 = new Term("content","smith");

? ?????? Term word4 = new Term("content","robert");

? ??????

? ?????? //用于保存檢索結(jié)果

? ?????? Hits hits = null;

? ?????? //生成PhraseQuery對象,初始化為null

? ?????? PhraseQuery query = null;

?

? ?????? //?第一種情況,兩個詞本身緊密相連,先設(shè)置坡度為0,再設(shè)置坡度為2

? ?????? query = new PhraseQuery();

? ?????? query.add(word1);

? ?????? query.add(word2);

? ?????? //設(shè)置坡度

? ?????? query.setSlop(0);

? ?????? //開始檢索,并返回檢索結(jié)果

? ?????? hits = searcher.search(query);

? ?????? //輸出檢索結(jié)果的相關(guān)信息

? ?????? printResult(hits, "'david'與'mary'緊緊相隔的Document");

? ??????

? ?????? //再次設(shè)置坡度

? ?????? query.setSlop(2);

? ?????? //開始第二次檢索

? ?????? hits = searcher.search(query);

? ?????? //輸出檢索結(jié)果

? ?????? printResult(hits, "'david'與'mary'中相隔兩個詞的短語");

? ??????

? ?????? //?第二種情況,兩個詞本身相隔兩個詞,先設(shè)置坡度為0,再設(shè)置坡度為2

? ?????? query = new PhraseQuery();

? ?????? query.add(word1);

? ?????? query.add(word4);

? ?????? //設(shè)置坡度

? ?????? query.setSlop(0);

? ?????? //開始第三次檢索,并返回檢索結(jié)果

? ?????? hits = searcher.search(query);

? ?????? //輸出檢索結(jié)果

? ?????? printResult(hits, "'david'與'robert'緊緊相隔的Document");

? ??????

? ?????? //設(shè)置坡度

? ?????? query.setSlop(2);

? ?????? //開始第四次檢索,并返回檢索結(jié)果

? ?????? hits = searcher.search(query);

? ?????? //輸出檢索結(jié)果

? ?????? printResult(hits, "'david'與'robert'中相隔兩個詞的短語");

? ??????

?

? ?? }

?

? ?? public static void printResult(Hits hits, String key) throws Exception

? ?????? {System.out.println("查找?/"" + key + "/" :");

? ?????? if (hits != null) {

? ?????????? if (hits.length() == 0) {

? ?????????????? System.out.println("沒有找到任何結(jié)果");

? ?????????????? System.out.println();

? ?????????? } else {

? ?????????????? System.out.print("找到");

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

? ?????????????????? //取得文檔對象

? ?????????????????? Document d = hits.doc(i);

? ?????????????????? //取得“title”字段的內(nèi)容

? ?????????????????? String dname = d.get("title");

? ?????????????????? //輸出相關(guān)的信息

? ?????????????????? System.out.print(dname + "?? ");

? ?????????????? }

? ?????????????? System.out.println();

? ?????????????? System.out.println();

? ?????????? }

? ?????? }

? ?? }

}

在上述代碼中創(chuàng)建了一個Document,這個Document的“content”域中含有4個關(guān)鍵字。接下來,代碼創(chuàng)建了一個PhraseQuery對象,首先將前兩個緊緊相連關(guān)鍵字放入其中,并設(shè)置它們的坡度值分別為0和2,接下來,又將第一個和最后一個關(guān)鍵字放入其中,同樣設(shè)置它們的坡度值為0和2。

代碼11.8的運行效果,如圖11-13所示。

從圖11.8中可以看出,代碼11.8共進(jìn)行了4次檢索測試,并且分兩組分別對檢索結(jié)果進(jìn)行對比。

從代碼11.8和圖11-13中可以看出,對兩個緊連的關(guān)鍵字來說無論將坡度設(shè)置為多少,Lucene總能找到它所在的文檔,而對兩個不緊連的關(guān)鍵字,如果坡度值小于它們之間無關(guān)詞的數(shù)量,那么則無法找到。其實,當(dāng)兩個關(guān)鍵字之間的無關(guān)詞數(shù)小于等于坡度值時,總是可以被找到。

11.4.6??使用短語綴搜索—PhrasePrefixQuery

PhrasePrefixQuery與Phrase有些類似。在PhraseQuery中,如果用戶想查找短語“david robert”,又想查找短語“mary robert”。那么,他就只能構(gòu)建兩個PhraseQuery,然后再使用BooleanQuery將它們作為其中的子句,并使用“或”操作符來連接,這樣就能達(dá)到需要的效果。PhrasePrefixQuery可以讓用戶很方便地實現(xiàn)這種需要。

接下來看看在代碼11.9中是如何使用PhrasePrefixQuery來實現(xiàn)的。

代碼11.9? PhrasePrefixQueryTest.java

package ch11;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.Term;

import org.apache.lucene.search.Hits;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.PhrasePrefixQuery;

import org.apache.lucene.search.PhraseQuery;

import org.apache.lucene.search.RangeQuery;

?

public class PhrasePrefixQueryTest {

? ?? public static void main(String[] args) throws Exception {

? ?????? //生成Document對象

? ?????? Document doc1 = new Document();

? ?????? //添加“content”字段的內(nèi)容

? ?????? doc1.add(Field.Text("content", "david mary smith robert"));

? ?????? //添加“title”字段的內(nèi)容

? ?????? doc1.add(Field.Keyword("title", "doc1"));

?

? ?????? //生成索引書寫器對象

? ?????? IndexWriter writer = new IndexWriter("c://index",

? ?????????????? new StandardAnalyzer(), true);

? ?????? //將文檔添加到索引中

? ?????? writer.addDocument(doc1);

? ?????? //關(guān)閉索引書寫器

? ?????? writer.close();

?

? ?????? //生成索引檢索器

? ?????? IndexSearcher searcher = new IndexSearcher("c://index");

? ?????? //構(gòu)造詞條

? ?????? Term word1 = new Term("content", "david");

? ?????? Term word2 = new Term("content", "mary");

? ?????? Term word3 = new Term("content", "smith");

? ?????? Term word4 = new Term("content", "robert");

?

? ?????? //用于保存檢索結(jié)果

? ?????? Hits hits = null;

? ?????? //生成PhrasePrefixQuery對象,初始化為null

? ?????? PhrasePrefixQuery query = null;

? ??????

? ?????? query = new PhrasePrefixQuery();

? ?????? //?加入可能的所有不確定的詞

? ?????? query.add(new Term[]{word1, word2});

? ?????? //?加入確定的詞

? ?????? query.add(word4);

? ?????? //設(shè)置坡度

? ?????? query.setSlop(2);

? ?????? //開始檢索,并返回檢索結(jié)果

? ?????? hits = searcher.search(query);

? ?????? //輸出檢索結(jié)果的相關(guān)信息

? ?????? printResult(hits, "存在短語'david robert'或'mary robert'的文檔");

? ?? }

?

? ?? public static void printResult(Hits hits, String key) throws Exception

? ?????? {System.out.println("查找?/"" + key + "/" :");

? ?????? if (hits != null) {

? ?????????? if (hits.length() == 0) {

? ?????????????? System.out.println("沒有找到任何結(jié)果");

? ?????????????? System.out.println();

? ?????????? } else {

? ?????????????? System.out.print("找到");

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

? ?????????????? //獲取文檔對象

? ?????????????????? Document d = hits.doc(i);

? ?????????????????? //取得“title”字段內(nèi)容

? ?????????????????? String dname = d.get("title");

? ?????????????????? System.out.print(dname + "?? ");

? ?????????????? }

? ?????????????? System.out.println();

? ?????????????? System.out.println();

? ?????????? }

? ?????? }

? ?? }

}

在上述代碼中,首先構(gòu)建了一個Document,它的“content”字段中包含4個關(guān)鍵字。接下來,構(gòu)建了一個PhrasePrefixQuery的對象,調(diào)用它的add(Term [])方法設(shè)定出現(xiàn)在短語中的第一個關(guān)鍵詞。由于這個方法的參數(shù)類型為一個Term型的數(shù)組,所以,它可以設(shè)置多個Term,即出現(xiàn)在短語中的第一個詞就在這個數(shù)組中進(jìn)行選擇。然后,再使用add(Term)方法設(shè)置出現(xiàn)在短語中的后一個詞。代碼的運行結(jié)果如圖11-14所示。

圖11-14? PhrasePrefixQuery的測試結(jié)果

從圖11-14中可以看出,使用PhrasePrefixQuery可以非常容易的實現(xiàn)相關(guān)短語的檢索功能。

11.4.7??相近詞語的搜索—FuzzyQuery

FuzzyQuery是一種模糊查詢,它可以簡單地識別兩個相近的詞語。下面以11.10為例進(jìn)行詳細(xì)介紹。

代碼11.10? FuzzyQueryTest.java

package ch11;

?

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.Term;

import org.apache.lucene.search.FuzzyQuery;

import org.apache.lucene.search.Hits;

import org.apache.lucene.search.IndexSearcher;

?

public class FuzzyQueryTest {

? ?? public static void main(String[] args) throws Exception {

? ?????? //生成Document對象

? ?????? Document doc1 = new Document();

? ?????? //添加“content”字段的內(nèi)容

? ?????? doc1.add(Field.Text("content", "david"));

? ?????? //添加“title”字段的內(nèi)容

? ?????? doc1.add(Field.Keyword("title", "doc1"));

?

? ?????? Document doc2 = new Document();

? ?????? doc2.add(Field.Text("content", "sdavid"));

? ?????? doc2.add(Field.Keyword("title", "doc2"));

?

? ?????? Document doc3 = new Document();

? ?????? doc3.add(Field.Text("content", "davie"));

? ?????? doc3.add(Field.Keyword("title", "doc3"));

?

? ?????? //生成索引書寫器

? ?????? IndexWriter writer = new IndexWriter("c://index",

? ?????????????? new StandardAnalyzer(), true);

? ?????? //將文檔添加到索引中

? ?????? writer.addDocument(doc1);

? ?????? writer.addDocument(doc2);

? ?????? writer.addDocument(doc3);

? ?????? //關(guān)閉索引寫器

? ?????? writer.close();

?

? ?????? //生成索引搜索器

? ?????? IndexSearcher searcher = new IndexSearcher("c://index");

? ?????? Term word1 = new Term("content", "david");

?

? ?????? //用于保存檢索結(jié)果

? ?????? Hits hits = null;

? ?????? //生成FuzzyQuery對象,初始化為null

? ?????? FuzzyQuery query = null;

?

? ?????? query = new FuzzyQuery(word1);

? ?????? //開始檢索,并返回檢索結(jié)果

? ?????? hits = searcher.search(query);

? ?????? //輸出檢索結(jié)果的相關(guān)信息

? ?????? printResult(hits,"與'david'相似的詞");

? ?? }

?

? ?? public static void printResult(Hits hits, String key) throws Exception

? ?????? {System.out.println("查找?/"" + key + "/" :");

? ?????? if (hits != null) {

? ?????????? if (hits.length() == 0) {

? ?????????????? System.out.println("沒有找到任何結(jié)果");

? ?????????????? System.out.println();

? ?????????? } else {

? ?????????????? System.out.print("找到");

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

? ?????????????????? //取得文檔對象

? ?????????????????? Document d = hits.doc(i);

? ?????????????????? //取得“title”字段的內(nèi)容

? ?????????????????? String dname = d.get("title");

? ?????????????????? System.out.print(dname + "?? ");

? ?????????????? }

? ?????????????? System.out.println();

? ?????????????? System.out.println();

? ?????????? }

? ?????? }

? ?? }

}

在上述代碼中,首先構(gòu)建了3個Document,這3個Document的“content”字段中都有一個與“david”較為相似的關(guān)鍵字(其中第一個就是david)。然后使用FuzzyQuery來對其進(jìn)行檢索。運行效果如圖11-15所示。

從圖11-15中可以看出,使用FuzzyQuery可以檢索到索引中所有包含與“david”相近詞語的文檔。

11.4.8??使用通配符搜索—WildcardQuery

Lucene也提供了通配符的查詢,這就是WildcardQuery。下面以代碼11.11為例進(jìn)行介紹。

代碼11.11? WildcardQueryTest.java

package ch11;

?

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.Term;

import org.apache.lucene.search.Hits;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.WildcardQuery;

?

public class WildcardQueryTest {

? ?? public static void main(String[] args) throws Exception {

? ?????? //生成Document對象,下同

? ?????? Document doc1 = new Document();

? ?????? //添加“content”字段的內(nèi)容,下同

? ?????? doc1.add(Field.Text("content", "whatever"));

? ?????? //添加“title”字段的內(nèi)容,下同

? ?????? doc1.add(Field.Keyword("title", "doc1"));

? ??????

? ?????? Document doc2 = new Document();

? ?????? doc2.add(Field.Text("content", "whoever"));

? ?????? doc2.add(Field.Keyword("title", "doc2"));

? ??????

? ?????? Document doc3 = new Document();

? ?????? doc3.add(Field.Text("content", "however"));

? ?????? doc3.add(Field.Keyword("title", "doc3"));

? ??????

? ?????? Document doc4 = new Document();

? ?????? doc4.add(Field.Text("content", "everest"));

? ?????? doc4.add(Field.Keyword("title", "doc4"));

? ??????

? ?????? //生成索引書寫器

? ?????? IndexWriter writer = new IndexWriter("c://index",

? ?????????????? new StandardAnalyzer(), true);

? ?????? //將文檔對象添加到索引中

? ?????? writer.addDocument(doc1);

? ?????? writer.addDocument(doc2);

? ?????? writer.addDocument(doc3);

? ?????? writer.addDocument(doc4);

? ?????? //關(guān)閉索引書寫器

? ?????? writer.close();

?

? ?????? //生成索引書寫器

? ?????? IndexSearcher searcher = new IndexSearcher("c://index");

? ?????? //構(gòu)造詞條

? ?????? Term word1 = new Term("content", "*ever");

? ?????? Term word2 = new Term("content", "wh?ever");

? ?????? Term word3 = new Term("content", "h??ever");

? ?????? Term word4 = new Term("content", "ever*");

? ?????? //生成WildcardQuery對象,初始化為null

? ?????? WildcardQuery query = null;

? ?????? //用于保存檢索結(jié)果

? ?????? Hits hits = null;

? ??????

? ?????? query = new WildcardQuery(word1);

? ?????? //開始第一次檢索,并返回檢索結(jié)果

? ?????? hits = searcher.search(query);

? ?????? //輸出檢索結(jié)果的相關(guān)信息

? ?????? printResult(hits, "*ever");

? ??????

? ?????? query = new WildcardQuery(word2);

? ?????? //開始第二次檢索,并返回檢索結(jié)果

? ?????? hits = searcher.search(query);

? ?????? //輸出檢索結(jié)果的相關(guān)信息

? ?????? printResult(hits, "wh?ever");

? ??????

? ?????? query = new WildcardQuery(word3);

? ?????? //開始第三次檢索,并返回檢索結(jié)果

? ?????? hits = searcher.search(query);

? ?????? //輸出檢索結(jié)果的相關(guān)信息

? ?????? printResult(hits, "h??ever");

? ??????

? ?????? query = new WildcardQuery(word4);

? ?????? //開始第四次檢索,并返回檢索結(jié)果

? ?????? hits = searcher.search(query);

? ?????? //輸出檢索結(jié)果的相關(guān)信息

? ?????? printResult(hits, "ever*");

? ?? }

???

? ?? public static void printResult(Hits hits, String key) throws Exception

? ?????? {System.out.println("查找?/"" + key + "/" :");

? ?????? if (hits != null) {

? ?????????? if (hits.length() == 0) {

? ?????????????? System.out.println("沒有找到任何結(jié)果");

? ?????????????? System.out.println();

? ?????????? } else {

? ?????????????? System.out.print("找到");

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

? ?????????????????? //取得文檔對象

? ?????????????????? Document d = hits.doc(i);

? ?????????????????? //取得“title”字段的內(nèi)容

? ?????????????????? String dname = d.get("title");

? ?????????????????? System.out.print(dname + "?? ");

? ?????????????? }

? ?????????????? System.out.println();

? ?????????? ??? System.out.println();

? ?????????? }

? ?????? }

? ?? }

}

代碼 11.11 的運行結(jié)果如圖 11-16 所示。

由上述代碼可以看出,通配符“?”代表1個字符,而“*”則代表0至多個字符。不過通配符檢索和上面的FuzzyQuery由于需要對字段關(guān)鍵字進(jìn)行字符串匹配,所以,在搜索的性能上面會受到一些影響。


?








對于搜索引擎(比如Google和百度)來講,很多情況下只需要用戶在輸入框內(nèi)輸入所需查詢的內(nèi)容,然后再單擊“搜索”就可以了,其余的事情全部交給搜索引擎去處理,最后搜索引擎會把檢索到的結(jié)果顯示出來。那么搜索引擎是怎樣處理用戶輸入得符號串的呢?

在Lucene中,這項工作就交給了QueryParser類來完成,它的作用就是把各種用戶輸入的符號串轉(zhuǎn)為一個內(nèi)部的Query或者一個Query組。雖然Lucene提供的API允許使用者創(chuàng)建各種各樣的Query(查詢語句),但它同時也允許通過QueryParser(查詢分析器)生成各種各樣的Query子對象。這使得Lucene的查詢功能更加靈活和強大。

11.5.1? QueryParser的簡單用法

QueryParser實際上就是一個解析用戶輸入的工具,可以通過掃描用戶輸入的字符串,生成Query對象,以下是一個代碼示例:

Query query = null;

query = QueryParser.parse(keywords,fieldName,new StandardAnalyzer());

由上面代碼可以看出,當(dāng)使用QueryParser構(gòu)建用戶Query時,不僅需要用戶輸入關(guān)鍵字文本,還需要告訴QueryParser默認(rèn)將在哪個字段內(nèi)查找該關(guān)鍵字信息。當(dāng)然,這并不是說用戶只能在這個字段內(nèi)查找關(guān)鍵字信息(例如可以在關(guān)鍵字中使用“content:david”這樣的方式指定搜索字段“content”中的關(guān)鍵字),但是如果用戶在輸入的關(guān)鍵字中沒有給出檢索字段信息時,QueryParser就將在默認(rèn)字段內(nèi)進(jìn)行檢索。

用戶輸入關(guān)鍵字的格式以及QueryParser所理解的含義如表11-2所示。

表11-2????????????????????????????????輸入關(guān)鍵字格式和QueryParser理解的含義

格????式

含????義

“David”

在默認(rèn)的字段中檢索“David”關(guān)鍵字

“content:David”

在“content”字段中檢索“David”關(guān)鍵字

“David Mary”或“David OR Mary”

在默認(rèn)字段中檢索David和Mary關(guān)鍵字,它們是“或”關(guān)系

“+David +Mary”或“David AND Mary”

在默認(rèn)字段中檢索David和Mary關(guān)鍵字,它們是“與”關(guān)系

“content:David –title:Manager”或“content:David AND NOT title:Manager”

在content字段中包括關(guān)鍵字David但在title字段中不包含關(guān)鍵字Manager

“(David OR Mary) AND Robert”

在默認(rèn)字段中包含David或Mary關(guān)鍵字,但一定要包含Robert關(guān)鍵字

Davi*

在默認(rèn)字段中檢索前綴為Davi

“content:"David is a manager"”

在“content”字段中包含短語“David is a manager”

?

另外很重要的一點,就是在使用QueryParser對用戶的輸入進(jìn)行掃描時,還需要給它一個分析器。有關(guān)分析器的概念將在后面的章節(jié)中介紹。不過,當(dāng)對用戶輸入的關(guān)鍵字進(jìn)行分析時的分析器應(yīng)當(dāng)與建立索引時的分析器一樣,這樣才能保證分析成功。

11.5.2? QueryParser的“與”和“或”

通過表11-1可以了解,當(dāng)用戶輸入兩個關(guān)鍵字時,QueryParser默認(rèn)它們之間的關(guān)系為“或”關(guān)系。如果用戶需要改變這種邏輯關(guān)系,則可采用下面的方法:

QueryParser parser = new QueryParser(fieldName, new StandardAnalyzer());

parser.setOperator(QueryParser.DEFAULT_OPERATOR_AND);

這樣構(gòu)建的QueryParser實例在對用戶輸入進(jìn)行掃描時,就會用空格分開的關(guān)鍵字理解為“與”,其實也就是構(gòu)建了一個“與”關(guān)系的布爾型查詢。

總結(jié)

以上是生活随笔為你收集整理的luncene 查询字符串的解析—QueryParser类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

亚洲一区动漫 | 国产另类xxxxhd高清 | 中文字幕在线播放日韩 | 中文字幕在线播放第一页 | 男女拍拍免费视频 | 免费看的黄网站 | 国产成人精品一区二区三区福利 | 91探花在线视频 | 在线观看亚洲精品视频 | 久久久精品国产一区二区电影四季 | 超碰人人av| 99精品乱码国产在线观看 | 国产区精品在线观看 | 人人添人人 | 毛片网站免费 | 黄色片视频在线观看 | 午夜三级毛片 | 黄色三级免费看 | 国产不卡在线播放 | 国产一区二区在线视频观看 | 在线观看中文字幕亚洲 | 国产精品高潮久久av | 麻豆视频免费播放 | 97人人模人人爽人人喊网 | 五月开心色 | 婷婷电影在线观看 | 黄色电影网站在线观看 | 日韩精品视频免费专区在线播放 | 美女黄频在线观看 | 久久久久久久久毛片 | 国产在线精品视频 | av电影亚洲 | 欧美一级电影 | 久青草视频 | 国产免码va在线观看免费 | 91精品免费视频 | 在线观看日韩一区 | 观看免费av| 91中文在线视频 | 九色91av| 91久久国产自产拍夜夜嗨 | 久久国产精品99久久人人澡 | 欧美大片在线观看一区 | 网址你懂的在线观看 | 欧美日韩中文国产一区发布 | 九九免费在线观看视频 | 国产在线一区二区三区播放 | 国产精品区一区 | 97人人澡人人爽人人模亚洲 | 91在线porny国产在线看 | 久久久久国产精品一区二区 | 国产成人av网 | 中文在线免费观看 | 国产精品白浆视频 | 超碰免费av | 成人午夜精品 | 国内精品国产三级国产aⅴ久 | 日日草夜夜操 | 色婷婷av一区二 | 国产剧在线观看片 | 午夜精品一区二区三区在线播放 | 日韩精品一区二区三区中文字幕 | 久久草在线视频国产 | 一区二区三区韩国免费中文网站 | 免费特级黄色片 | a视频在线播放 | 免费不卡中文字幕视频 | 精品在线观看国产 | av资源网在线播放 | 91九色在线观看视频 | 久热电影 | 天天色综合三 | 国内精品在线看 | 久久免费a | 久艹视频在线免费观看 | 亚洲黄色免费电影 | 免费看黄的 | 欧美一级小视频 | 狠狠干免费| 97在线观看免费视频 | 波多野结衣一区二区三区中文字幕 | 中文字幕a∨在线乱码免费看 | 久久久免费播放 | 波多野结衣理论片 | 国产婷婷色 | 午夜视频日本 | 精品国产免费久久 | 日本久久片 | 99国内精品久久久久久久 | 日本激情视频中文字幕 | 91在线精品一区二区 | 五月婷在线视频 | 国产一级免费观看 | 国产资源在线观看 | 免费看的黄色片 | 国产精品成人一区二区三区 | 国产美女视频 | 天天摸天天干天天操天天射 | 免费在线观看的av网站 | 国产精品久久久影视 | www亚洲国产 | 99热免费在线 | 色吊丝在线永久观看最新版本 | 91精品国产九九九久久久亚洲 | 久久精品国产免费 | 免费看片成年人 | 91精品啪在线观看国产81旧版 | 久久一二区| 久久久久国产一区二区 | 国产99久久久欧美黑人 | 日韩在线免费视频 | 日韩欧美一级二级 | 免费观看91视频大全 | 日韩av黄| 国产精品福利久久久 | 国产精品av免费在线观看 | 免费网站看av片 | 96超碰在线 | 色网影音先锋 | 在线日韩亚洲 | 香蕉视频在线播放 | 超碰在线最新地址 | 国产日韩中文字幕在线 | 欧美性色黄大片在线观看 | 久久无码av一区二区三区电影网 | 日女人电影| 最近日本韩国中文字幕 | 国产手机av在线 | 日韩在线一区二区免费 | 中文字幕亚洲在线观看 | 亚洲视频精品 | 成人av一区二区三区 | 亚洲一区二区麻豆 | 日韩一二三区不卡 | 欧美人操人 | 91av在| 丁香婷婷色月天 | 欧美日韩亚洲在线 | 中文字幕丝袜 | 一区二区三区四区精品视频 | 最近更新的中文字幕 | 日韩aa视频 | av电影 一区二区 | 性色av香蕉一区二区 | 激情久久一区二区三区 | 成人a级网站 | 国产精品久久久久9999 | 日韩精品一区二区久久 | 黄色精品视频 | 精品免费久久久久久 | 欧美三级高清 | 亚洲蜜桃在线 | 日韩精品在线免费播放 | 久久草草热国产精品直播 | 国产精品区一区 | 中文字幕 在线看 | 黄色亚洲片 | 亚洲伊人色 | 国产xxxx性hd极品 | 精品一区二区三区香蕉蜜桃 | 欧洲视频一区 | 欧美国产三区 | 91亚洲精品国偷拍自产在线观看 | 丁香婷婷亚洲 | 亚洲欧美精品一区 | 天天爽天天碰狠狠添 | 日韩精品在线观看av | 五月天天av | 日日干,天天干 | 久久资源在线 | 免费黄色特级片 | 欧美污网站| 久久久视频在线 | www.黄色小说.com | 久久国产日韩 | 日韩a欧美| 亚洲一区免费在线 | 久久av中文字幕片 | 黄色亚洲在线 | 日韩欧美一区二区三区黑寡妇 | av日韩在线网站 | 欧美精品免费视频 | www.超碰 | 国产在线a视频 | 日韩天天干 | 亚洲天堂网在线播放 | 精品国产一区二区三区男人吃奶 | 波多野结衣在线视频一区 | 91黄色免费看 | 97看片 | 亚洲精品乱码久久久久久蜜桃91 | 亚洲国产欧美在线人成大黄瓜 | 狠狠干综合 | 在线观看蜜桃视频 | 深夜精品福利 | 97视频人人 | 国产麻豆传媒 | 国产精品24小时在线观看 | 婷婷色在线视频 | 香蕉在线视频观看 | 日韩天堂在线观看 | 久久久免费看片 | 亚洲成av人影片在线观看 | 黄色免费观看网址 | 午夜久操 | 久章草在线 | 亚洲成人av片 | 91久久精品日日躁夜夜躁国产 | 一区二区三区久久 | 探花视频在线观看 | 久久成人午夜 | 日日夜夜精品免费观看 | 在线看岛国av| 久久蜜臀一区二区三区av | 免费色视频 | 91色一区二区三区 | 深爱激情久久 | 91精品国产麻豆 | 国产精品女人久久久 | 婷婷久久综合九色综合 | 欧美视频www | 一区二区视频免费在线观看 | 国产亚洲在线视频 | 午夜精品一区二区三区在线 | 亚洲狠狠 | 亚洲一级片免费观看 | 日日爽夜夜操 | 国产精成人品免费观看 | 国产精品女人久久久久久 | 久久99亚洲热视 | 天天干,天天操 | 国产一区二区视频在线 | 国产人成一区二区三区影院 | 国产精品亚洲片在线播放 | 亚洲精品久久久蜜臀下载官网 | 狠狠狠操| 亚洲一级二级 | 精品国产乱码久久久久久浪潮 | 91在线91| 福利片视频区 | 日韩毛片在线免费观看 | 天天干天天干天天干天天干天天干天天干 | 日韩免费看的电影 | 在线影院 国内精品 | av在线免费不卡 | 亚洲一区二区三区四区在线视频 | 久久综合网色—综合色88 | 国产最新在线 | 精品在线观看一区二区 | 高清不卡毛片 | 国产不卡一 | 香蕉久久久久久久 | 不卡中文字幕在线 | 深夜视频久久 | 亚洲性xxxx | 国产69精品久久99不卡的观看体验 | 午夜影视剧场 | 91av在线免费 | 日韩一三区 | 一区二区欧美日韩 | 99热这里只有精品在线观看 | 日韩美在线 | 国产精品一区二区免费视频 | 日韩在线观看视频免费 | 国产精品久久久久久久久久久不卡 | 91精品区 | 国产资源在线免费观看 | 一区二区三区日韩在线观看 | 亚洲黄色大片 | 在线视频亚洲 | 国产污视频在线观看 | 国产99久久久国产精品免费二区 | 免费三级黄色 | 亚洲国产操 | 99视频在线精品国自产拍免费观看 | a√天堂中文在线 | 欧美aⅴ在线观看 | 天天天天干 | 美女免费视频观看网站 | 日本久久片| 中文字幕久久网 | 伊人激情网 | 国产又粗又猛又爽又黄的视频先 | 黄色av影院 | 一区二区影视 | 久久综合狠狠综合 | 激情在线免费视频 | 日韩免费高清在线 | 国产亲近乱来精品 | 国产精品va最新国产精品视频 | 国产精品久久二区 | 91在线视频观看免费 | 亚洲 欧美 变态 国产 另类 | 婷婷激情网站 | 伊人婷婷在线 | 欧美午夜久久 | 麻豆传媒视频在线免费观看 | 视频二区在线 | 欧美日韩天堂 | 婷婷色网址 | 91激情视频在线 | 91av在线视频播放 | 99r国产精品 | 日韩免费成人 | 国产精品国产三级国产 | 免费成人在线观看视频 | 久青草视频| 丁香婷婷射 | 国产成人精品一区二区三区在线 | 成人av高清在线观看 | 日韩经典一区二区三区 | 美女精品在线观看 | 欧美动漫一区二区三区 | 久久综合久久久久88 | 欧美a在线免费观看 | 亚洲一区日韩在线 | 91精品久久久久久久久久入口 | 麻豆高清免费国产一区 | 顶级bbw搡bbbb搡bbbb | 成人免费共享视频 | 狠狠的日日 | 亚洲成人资源在线观看 | 国产专区精品 | 国产精品中文字幕在线播放 | 国产精品 国内视频 | 久久精品电影院 | 黄色网在线播放 | av线上免费看 | 久久久久久综合网天天 | 日韩欧美精品一区二区三区经典 | 日产av在线播放 | 黄污视频大全 | www.日日日.com| 日韩成人高清在线 | 国产一级久久 | 欧美日韩一级久久久久久免费看 | 国产资源| 麻豆91在线观看 | 久久最新网址 | 奇米网777 | 肉色欧美久久久久久久免费看 | www五月天com | 久久久久| 日本中文在线观看 | 中文字幕字幕中文 | 99精品视频在线观看免费 | 91人人澡人人爽人人精品 | 亚洲成人av片在线观看 | 精品国产免费一区二区三区五区 | 国产一级电影网 | 成人小视频在线播放 | 亚洲传媒在线 | 中文字幕第一 | 国产美女精品视频 | 一区二区三区在线观看中文字幕 | 中文字幕av免费在线观看 | 中文字幕在线色 | 国产精品白丝jk白祙 | www色网站| 国产九色在线播放九色 | 国产a级免费 | 国产婷婷在线观看 | 国产破处在线播放 | 最近免费在线观看 | 日韩欧美综合精品 | 亚洲理论在线观看电影 | .国产精品成人自产拍在线观看6 | 麻豆一精品传二传媒短视频 | 成人午夜在线观看 | 欧美精品亚洲精品 | 日本动漫做毛片一区二区 | 亚洲 综合 激情 | 免费在线色 | 国产精品一区二区三区电影 | 最近日本mv字幕免费观看 | a v在线视频| 91污在线 | 亚洲极色 | www.国产在线视频 | 久久99国产精品久久 | 久久婷婷国产色一区二区三区 | 婷婷去俺也去六月色 | 黄色免费视频在线观看 | 免费亚洲精品视频 | 精品国产乱码一区二 | 日韩欧美视频在线 | 国产福利精品在线观看 | 天天激情综合 | 国产五码一区 | 精品视频国产 | 一级黄色电影网站 | 丁香在线观看完整电影视频 | 开心激情五月婷婷 | 欧美日韩中文字幕在线视频 | 9在线观看免费高清完整 | 韩国av一区二区 | 国产亚洲情侣一区二区无 | 麻豆精品在线视频 | 久艹视频在线观看 | 日本性生活一级片 | 色综合久久99 | 久久国产福利 | 久久精视频 | 一区二区视频在线免费观看 | 国产亚洲精品免费 | 婷婷成人综合 | 久草视频中文 | 国产xxxx做受性欧美88 | 国产免费大片 | 久久久网站 | 国产精品一区二区免费看 | 日韩aⅴ视频 | 久久精品久久国产 | 五月天com | 久久专区| 日三级在线 | 国产淫片免费看 | 青草草在线 | 国产一区二区在线播放视频 | 天天爽网站 | 国产精品va在线观看入 | 日本特黄特色aaa大片免费 | 免费在线观看成人av | 欧美日韩高清免费 | 亚洲一二三区精品 | 中文字幕在线观看免费高清完整版 | 91av网站在线观看 | ,午夜性刺激免费看视频 | 97色婷婷| 日韩中文字幕在线观看 | 国产视频2 | 探花视频免费在线观看 | 九九热在线精品 | 国产色黄网站 | 999视频在线观看 | 婷婷日日 | 999成人| 婷婷久久国产 | 欧美日视频 | 最近中文字幕完整视频高清1 | 深爱婷婷网 | 日韩中文字幕一区 | 日韩一区二区三区不卡 | 五月天中文字幕mv在线 | 亚洲成人免费 | 97精品超碰一区二区三区 | 国产在线观看污片 | 狠狠狠色丁香综合久久天下网 | 亚洲精品88欧美一区二区 | 91久久国产精品 | 少妇性bbb搡bbb爽爽爽欧美 | 欧洲一区二区在线观看 | 天天摸天天干天天操天天射 | 麻豆成人在线观看 | 在线成人免费电影 | 色噜噜噜噜 | 欧美日本在线观看视频 | 99精品在线直播 | 国产日韩视频在线 | 国产精品高潮呻吟久久av无 | 九九久久精品视频 | 欧美成人中文字幕 | av先锋中文字幕 | 色视频在线观看免费 | 欧美一区二区视频97 | 亚洲精品在线资源 | 蜜臀av夜夜澡人人爽人人桃色 | 婷婷色在线资源 | 国产丝袜在线 | 处女av在线| 色综合久久久久久久 | 97狠狠干| 日本性久久 | 色综合天天狠狠 | 亚洲国产一区在线观看 | 久久成人在线 | 热久久最新地址 | 国产又粗又长又硬免费视频 | 日韩a级黄色| 黄网站免费久久 | 激情久久婷婷 | 精品久久一区二区三区 | 免费观看一级成人毛片 | 欧美性生活大片 | 国产亚洲激情视频在线 | 精品久久久久久亚洲综合网 | 91成人网在线播放 | 亚洲精品在线国产 | 久草在线在线视频 | 亚洲成av人片在线观看无 | 国产精品丝袜久久久久久久不卡 | 探花在线观看 | 国产精品美女久久久久久2018 | 亚洲精品视频在 | 亚洲视频六区 | 免费在线激情电影 | 国产美女视频 | 久草在线电影网 | 久久午夜电影院 | 国产成人精品一区二三区 | 91成熟丰满女人少妇 | 黄色精品一区二区 | 国内精品久久久久久中文字幕 | 中文字幕有码在线 | 免费视频 你懂的 | 中文字幕一区二区三区久久蜜桃 | 在线免费av播放 | 精品国产诱惑 | 久久久免费在线观看 | 日日干夜夜干 | 91av精品| 九九免费在线观看视频 | 国产人免费人成免费视频 | 91.dizhi永久地址最新 | 精品国产欧美一区二区三区不卡 | 国产精品成人a免费观看 | 精品久久久久久久久久久院品网 | 午夜在线观看 | 久久精品中文字幕免费mv | 91| 久久99在线观看 | 午夜视频免费播放 | 黄色aaa毛片 | 国产理论一区二区三区 | 免费欧美 | 日韩欧美视频在线观看免费 | 久久久国产一区二区 | av丝袜美腿| 欧美巨大荫蒂茸毛毛人妖 | 国产免费一区二区三区网站免费 | 亚洲一区黄色 | www操操 | 欧美日韩国语 | 日韩高清激情 | 丁香婷婷激情国产高清秒播 | 久久一区二区三区四区 | 91视频免费观看 | 亚洲精品国产综合久久 | 91精品欧美 | 日韩成人在线免费观看 | 狠狠操电影网 | 亚洲国内精品在线 | 精品福利在线观看 | 国产精品久久久久久久久久久久冷 | 国产手机在线观看视频 | 亚洲区精品 | 综合久久综合久久 | 久久综合免费视频 | 久草在线视频中文 | 99精彩视频在线观看免费 | 美女国产 | 一区二区影院 | 91精品国 | 国产精品18久久久久久久网站 | 深夜免费福利视频 | 天天干夜夜夜操天 | 欧美日韩在线第一页 | 日韩二区三区在线观看 | 成人av在线一区二区 | 狠狠干狠狠色 | 六月色婷 | 欧美性色xo影院 | 久久人操 | 久久久精品亚洲 | 成人精品国产免费网站 | 亚洲国产精品500在线观看 | 97在线免费视频 | 亚州欧美精品 | 欧美极品少妇xxxx | 天堂av在线网址 | 在线播放 日韩专区 | 免费色视频网站 | 中文字幕一区二区三区四区在线视频 | 精品亚洲在线 | 国产一区免费看 | 亚洲传媒在线 | 在线免费看黄色 | 亚洲一区动漫 | 国产成人一区二区在线观看 | 免费在线观看污 | 国产婷婷一区二区 | 在线看污网站 | 综合色婷婷 | 亚洲欧美视频一区二区三区 | 久艹视频在线观看 | 成人av影院在线观看 | 免费男女羞羞的视频网站中文字幕 | 在线看一区 | 丝袜美腿在线播放 | 久久久久久久av麻豆果冻 | 亚洲欧洲精品视频 | 天天综合网国产 | 日韩激情免费视频 | 黄色特一级 | 欧美一级黄色网 | 国产欧美在线一区二区三区 | 色网站在线免费观看 | 91黄色在线观看 | 国产精品久久久久影院 | 亚洲精品午夜久久久久久久久久久 | 欧美日韩在线观看不卡 | 亚洲色图激情文学 | 国产精品久久嫩一区二区免费 | 久久精品三级 | av网站免费看 | 国产资源在线免费观看 | 天天综合网天天综合色 | 在线成人看片 | 亚洲成人精品在线 | 日韩精品免费在线播放 | 亚洲午夜小视频 | 日韩有码在线观看视频 | 中文字幕中文字幕中文字幕 | 国产精品av免费 | 国产亚洲精品久久久网站好莱 | 欧美一区免费在线观看 | 91九色在线观看视频 | 日韩欧美一区二区三区视频 | 国产精品美女免费 | 黄色网在线播放 | 2024国产精品视频 | av官网在线 | 国产精品毛片久久 | 三级毛片视频 | www.伊人网| 亚洲婷婷综合色高清在线 | 中文字幕av在线 | 精品美女久久久久 | 国产精品一区二区在线观看 | 精品国产一区二区三区久久久蜜月 | 久久久久久久久久亚洲精品 | 国产精品第2页 | 97免费在线观看视频 | 人人爽人人爽人人片av | 日韩在线观看精品 | 欧美不卡在线 | 91最新国产| 色91av| 91九色网站 | 免费视频你懂得 | 91精品视频导航 | 成人精品国产免费网站 | 五月婷在线视频 | 99久久www | 视频高清 | 久久综合婷婷国产二区高清 | 久久精国产 | 激情综合一区 | 久久久免费毛片 | 国产手机在线精品 | 午夜三级理论 | 欧美一级日韩三级 | 狠狠色噜噜狠狠 | 欧美极品久久 | 精品 一区 在线 | 91亚洲欧美 | 在线观看免费版高清版 | 国产精品18久久久久久久久 | 国产精品一区二区美女视频免费看 | 精品国产_亚洲人成在线 | 日韩视频免费播放 | 91精品国产综合久久福利不卡 | 日av免费| av丝袜在线 | 久久在线视频精品 | 日韩网站中文字幕 | 麻花传媒mv免费观看 | 久久免费a | 在线看片91 | 黄色亚洲大片免费在线观看 | 天天摸日日操 | 五月天色丁香 | 日韩av高清在线观看 | 九九免费在线观看视频 | 国产日韩欧美精品在线观看 | 久久久久成人精品 | 爱色婷婷 | 免费合欢视频成人app | 在线激情影院一区 | 久久人人爽人人爽人人 | 国产精品视频最多的网站 | 黄色小网站在线 | 欧洲精品久久久久毛片完整版 | 99久久电影 | 色狠狠久久av五月综合 | 91片网 | 亚洲一区二区黄色 | 999精品| 日日躁夜夜躁xxxxaaaa | 激情伊人五月天久久综合 | 探花视频在线版播放免费观看 | 久久公开视频 | 国产视频2 | 免费试看一区 | 九九久久影院 | 国产一级不卡毛片 | 国产精品video爽爽爽爽 | 亚洲精品视频在线播放 | 天天操天天爽天天干 | av在线免费观看网站 | 三上悠亚一区二区在线观看 | www.天天操.com | 激情五月开心 | a v在线观看 | 成人97人人超碰人人99 | 99久久久国产精品免费99 | 五月色婷| 日韩伦理一区二区三区av在线 | 超碰97在线资源 | 成人中文字幕在线观看 | 91麻豆文化传媒在线观看 | 免费手机黄色网址 | 欧美一区二区精品在线 | 久久久视频在线 | 婷婷av在线 | 在线观看免费一级片 | 日韩在线免费高清视频 | 日韩av五月天 | 中文字幕在线一区二区三区 | 91精品一区在线观看 | 中文字幕av免费在线观看 | 国产网站色 | 不卡的av在线 | 色九九视频 | a午夜电影 | 欧美一区二区三区在线播放 | 一二区av | 久久精品亚洲精品国产欧美 | 亚洲综合国产精品 | 天天拍天天干 | 九九激情视频 | 久久艹国产视频 | 很污的网站 | 99免费在线视频 | 日韩免费观看一区二区三区 | 国产高清视频免费观看 | 国产精品入口麻豆 | 热久久国产 | 欧美激情精品久久久久久 | 九九色视频 | 999在线观看视频 | 97福利在线 | 最近日本字幕mv免费观看在线 | 又爽又黄又刺激的视频 | 射久久久| 亚洲天天 | 日韩精品无 | 超碰97国产精品人人cao | 久久国产精品久久w女人spa | 国产精品久久久久久久电影 | 国产专区精品视频 | 日韩色综合 | 国产黄色免费电影 | 免费亚洲一区二区 | 婷婷综合亚洲 | 日韩偷拍精品 | 欧美另类tv | 精品uu | 91精品在线免费观看视频 | 亚洲日b视频 | 精品美女久久久久久免费 | 日日摸日日添夜夜爽97 | 国产精品美女在线观看 | 国产精品久久久久9999 | 国产一在线精品一区在线观看 | 国产精品video爽爽爽爽 | 国产小视频免费观看 | 日韩欧美一区二区三区在线 | 国产精品久久99综合免费观看尤物 | 久久97久久97精品免视看 | 久久久国产精品麻豆 | 丁香六月婷婷综合 | 2021国产精品 | 亚洲码国产日韩欧美高潮在线播放 | 午夜精品福利一区二区三区蜜桃 | 国产成人精品一区二区在线观看 | 久久深夜福利免费观看 | 午夜精品区 | 天天操天天爱天天爽 | 91在线公开视频 | 久久9精品| 久久国产免费看 | 亚洲天堂网在线观看视频 | 黄色免费在线视频 | 国产亚洲日本 | 色婷婷视频 | 在线成人免费av | 日韩av资源站 | 最近中文字幕 | 久久久久国产精品厨房 | 2023国产精品自产拍在线观看 | 欧美一级片 | 综合久久网 | 欧美老女人xx | 在线视频a | 中文字幕第一页在线 | 日本韩国在线不卡 | 在线探花| 欧美午夜视频在线 | 99视频在线精品免费观看2 | 国产人成看黄久久久久久久久 | 在线观看www.| 91久久精品一区二区二区 | 欧美视频不卡 | 欧美激情奇米色 | 免费看三级网站 | 日韩色在线观看 | 国产亚洲精品久久久久久网站 | 成人久久综合 | 精品在线亚洲视频 | 欧美在线视频第一页 | 毛片随便看 | 在线色网站 | 最近最新最好看中文视频 | 一级性av | 精品日韩在线 | 国产美女精品 | 狠狠色狠狠色合久久伊人 | 国产999免费视频 | 在线视频精品 | 日日夜夜人人天天 | av免费观看网址 | 天堂久久电影网 | 久久久久久美女 | 日本久久成人中文字幕电影 | 久章草在线观看 | 91片黄在线观看动漫 | 久久免费黄色网址 | 亚洲国产中文字幕 | 九九九九热精品免费视频点播观看 | 亚洲专区免费观看 | 中日韩免费视频 | 亚洲精品国产精品乱码在线观看 | 五月婷婷av | 蜜臀精品久久久久久蜜臀 | 18做爰免费视频网站 | 99热在线免费观看 | 欧洲黄色片 | 日韩av资源站 | 久久久久久久久久久免费av | 又黄又爽又无遮挡免费的网站 | 成人午夜性影院 | 美女视频网 | 久久线视频 | 在线超碰av| 久久国产亚洲 | 在线观看免费中文字幕 | 六月久久婷婷 | 国产高清视频在线 | 九九视频在线 | 国产91精品久久久久 | 成人手机在线视频 | 九九精品视频在线观看 | 久久国产精彩视频 | 99精品电影| 久久久男人的天堂 | 99久久久久成人国产免费 | 伊人黄| 亚洲精品18日本一区app | 9久久精品 | 天天操综 | 国产精品毛片一区二区 | 亚洲一区视频在线播放 | 欧美日韩高清在线一区 | 久久免费黄色大片 | 日韩久久精品一区二区三区下载 | 五月天狠狠操 | 日本xxxx.com| 午夜12点 | 免费看久久久 | 91亚洲欧美 | 久久字幕 | 91精品啪在线观看国产81旧版 | 欧美极品一区二区三区 | 欧美一级性生活片 | 激情网站 | av观看久久久 | 日韩在线观看一区二区 | 精品国产精品久久一区免费式 | 日本中文字幕在线观看 | 在线91av | 成人免费视频免费观看 | 一区二区不卡在线观看 | 国产香蕉97碰碰碰视频在线观看 | 日本在线视频网址 | 91精品国产91久久久久福利 | 国产婷婷久久 | 丝袜制服综合网 | 国产高清不卡在线 | 国产一区高清在线观看 | 午夜久久福利 | 久久视频这里有精品 | 久久综合九色综合久99 | 久久精品看 | 午夜精品三区 | 亚洲欧洲国产视频 | 亚洲精品成人 | 国产专区视频在线 | 亚洲黄色片 | 成人a毛片 | 国产电影黄色av | 中文字幕一区二区三区四区在线视频 | 国产成人久久精品一区二区三区 | 在线观看一 | 久久视频在线视频 | 在线三级av| 美女视频黄免费网站 | 亚洲精品在线观看不卡 | 国产美女无遮挡永久免费 | 在线99 | 一级性视频 | 超碰97免费观看 | 久久蜜臀一区二区三区av | 日韩av免费一区 | 中文字幕五区 | 国产一区二区在线免费 | 天天天天色射综合 | 国产成人精品一区在线 | 亚洲人在线7777777精品 | 免费看日韩 | 欧美日韩精品在线播放 | 久久99久久99精品免视看婷婷 | 麻豆传媒视频在线播放 | 国产成人一二片 | 黄色免费视频在线观看 | 一级片免费在线 | 天堂av网址 | 国产精品嫩草影院99网站 | 国产色视频 | 97夜夜澡人人双人人人喊 | 久久精品久久久久电影 | 国产精品9999久久久久仙踪林 | 男女视频91| 狠狠躁夜夜躁人人爽超碰97香蕉 | 97超碰站| 久二影院 | 日韩免费一级电影 | 日韩精品久久久 | 亚洲综合爱 | 久久久久国产精品午夜一区 | 色网站视频 | www.黄色小说.com | 久久av在线| 国产精品网在线观看 | 在线精品视频免费播放 | www.久久色.com | 免费色网 | 视频一区在线免费观看 | 久久精品8| 亚洲高清视频在线观看 | 97碰碰碰 | 精品在线观看国产 | 美女福利视频一区二区 | 在线精品视频免费观看 | 欧美色噜噜| 日日操操 | 中文字幕日韩有码 | 草久在线观看 | 日韩大片在线播放 | 日本丰满少妇免费一区 | 97av在线| 精品自拍sae8—视频 | 99精品一区| 狠狠干婷婷色 | 久久999精品| 在线观看你懂的网站 | 在线免费高清视频 | 在线观看911视频 | 精品成人网| 久久香蕉电影 | 日日综合| 久久国产精品99久久久久久丝袜 | 国产一区在线观看视频 | 日本性动态图 | 欧美久草在线 | 中文字幕av全部资源www中文字幕在线观看 | 伊人久久一区 | 免费国产亚洲视频 | 有码一区二区三区 | 国产精品久久久久国产精品日日 | 欧美精品中文 | 国产精品黑丝在线观看 | 亚洲www天堂com | 国产精品一区二区三区99 | 香蕉97视频观看在线观看 | 免费黄色网止 | 日本精品在线 | 日本性xxx | 在线a亚洲视频播放在线观看 | 久久免费激情视频 | 免费看国产曰批40分钟 | 亚洲国产精品va在线看 | 亚洲激情视频 | 成人av影视观看 | 日本精品久久久久中文字幕 | 麻豆视频在线观看免费 | 国产黑丝一区二区三区 | 久久久片 |