成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > java Lucene 中自定義排序的實現(xiàn)

java Lucene 中自定義排序的實現(xiàn)

熱門標(biāo)簽:開封便宜外呼系統(tǒng)報價 黃石智能營銷電銷機器人效果 怎樣把地圖標(biāo)注出來 淮南騰訊地圖標(biāo)注 騰訊地圖標(biāo)注商戶改名注冊入駐 電話機器人的特色和創(chuàng)新 漯河辦理400電話 地圖標(biāo)注人員兼職 商丘百應(yīng)電話機器人有沒有效果
Lucene中的自定義排序功能和Java集合中的自定義排序的實現(xiàn)方法差不多,都要實現(xiàn)一下比較接口. 在Java中只要實現(xiàn)Comparable接口就可以了.但是在Lucene中要實現(xiàn)SortComparatorSource接口和ScoreDocComparator接口.在了解具體實現(xiàn)方法之前先來看看這兩個接口的定義吧.
SortComparatorSource接口的功能是返回一個用來排序ScoreDocs的comparator(Expert: returns a comparator for sorting ScoreDocs).該接口只定義了一個方法.如下:
Java代碼
/**
* Creates a comparator for the field in the given index.
* @param reader - Index to create comparator for.
* @param fieldname - Field to create comparator for.
* @return Comparator of ScoreDoc objects.
* @throws IOException - If an error occurs reading the index.
*/
public ScoreDocComparator newComparator(IndexReader reader,String fieldname) throws IOException
view plaincopy to clipboardprint?
/**
* Creates a comparator for the field in the given index.
* @param reader - Index to create comparator for.
* @param fieldname - Field to create comparator for.
* @return Comparator of ScoreDoc objects.
* @throws IOException - If an error occurs reading the index.
*/
public ScoreDocComparator newComparator(IndexReader reader,String fieldname) throws IOException
/**
* Creates a comparator for the field in the given index.
* @param reader - Index to create comparator for.
* @param fieldname - Field to create comparator for.
* @return Comparator of ScoreDoc objects.
* @throws IOException - If an error occurs reading the index.
*/
public ScoreDocComparator newComparator(IndexReader reader,String fieldname) throws IOException
該方法只是創(chuàng)造一個ScoreDocComparator 實例用來實現(xiàn)排序.所以我們還要實現(xiàn)ScoreDocComparator 接口.來看看ScoreDocComparator 接口.功能是比較來兩個ScoreDoc 對象來排序(Compares two ScoreDoc objects for sorting) 里面定義了兩個Lucene實現(xiàn)的靜態(tài)實例.如下:
Java代碼
//Special comparator for sorting hits according to computed relevance (document score).
public static final ScoreDocComparator RELEVANCE;
//Special comparator for sorting hits according to index order (document number).
public static final ScoreDocComparator INDEXORDER;
view plaincopy to clipboardprint?
//Special comparator for sorting hits according to computed relevance (document score).
public static final ScoreDocComparator RELEVANCE;
//Special comparator for sorting hits according to index order (document number).
public static final ScoreDocComparator INDEXORDER;
//Special comparator for sorting hits according to computed relevance (document score).
public static final ScoreDocComparator RELEVANCE;

//Special comparator for sorting hits according to index order (document number).
public static final ScoreDocComparator INDEXORDER;
有3個方法與排序相關(guān),需要我們實現(xiàn) 分別如下:
Java代碼
/**
* Compares two ScoreDoc objects and returns a result indicating their sort order.
* @param i First ScoreDoc
* @param j Second ScoreDoc
* @return -1 if i should come before j;
* 1 if i should come after j;
* 0 if they are equal
*/
public int compare(ScoreDoc i,ScoreDoc j);
/**
* Returns the value used to sort the given document. The object returned must implement the java.io.Serializable interface. This is used by multisearchers to determine how to collate results from their searchers.
* @param i Document
* @return Serializable object
*/
public Comparable sortValue(ScoreDoc i);
/**
* Returns the type of sort. Should return SortField.SCORE, SortField.DOC, SortField.STRING, SortField.INTEGER, SortField.FLOAT or SortField.CUSTOM. It is not valid to return SortField.AUTO. This is used by multisearchers to determine how to collate results from their searchers.
* @return One of the constants in SortField.
*/
public int sortType();
view plaincopy to clipboardprint?
/**
* Compares two ScoreDoc objects and returns a result indicating their sort order.
* @param i First ScoreDoc
* @param j Second ScoreDoc
* @return -1 if i should come before j;
* 1 if i should come after j;
* 0 if they are equal
*/
public int compare(ScoreDoc i,ScoreDoc j);
/**
* Returns the value used to sort the given document. The object returned must implement the java.io.Serializable interface. This is used by multisearchers to determine how to collate results from their searchers.
* @param i Document
* @return Serializable object
*/
public Comparable sortValue(ScoreDoc i);
/**
* Returns the type of sort. Should return SortField.SCORE, SortField.DOC, SortField.STRING, SortField.INTEGER, SortField.FLOAT or SortField.CUSTOM. It is not valid to return SortField.AUTO. This is used by multisearchers to determine how to collate results from their searchers.
* @return One of the constants in SortField.
*/
public int sortType();
/**
     * Compares two ScoreDoc objects and returns a result indicating their sort order.
     * @param i First ScoreDoc
     * @param j Second ScoreDoc
     * @return -1 if i should come before j;
     * 1 if i should come after j;
     * 0 if they are equal
     */
    public int compare(ScoreDoc i,ScoreDoc j);
    /**
     * Returns the value used to sort the given document. The object returned must implement the java.io.Serializable interface. This is used by multisearchers to determine how to collate results from their searchers.
     * @param i Document
     * @return Serializable object
     */
    public Comparable sortValue(ScoreDoc i);
    /**
     * Returns the type of sort. Should return SortField.SCORE, SortField.DOC, SortField.STRING, SortField.INTEGER, SortField.FLOAT or SortField.CUSTOM. It is not valid to return SortField.AUTO. This is used by multisearchers to determine how to collate results from their searchers.
     * @return One of the constants in SortField.
     */
    public int sortType();
看個例子吧!
該例子為Lucene in Action中的一個實現(xiàn),用來搜索距你最近的餐館的名字. 餐館坐標(biāo)用字符串"x,y"來存儲.
Java代碼
package com.nikee.lucene;
import java.io.IOException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermDocs;
import org.apache.lucene.index.TermEnum;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.ScoreDocComparator;
import org.apache.lucene.search.SortComparatorSource;
import org.apache.lucene.search.SortField;
//實現(xiàn)了搜索距你最近的餐館的名字. 餐館坐標(biāo)用字符串"x,y"來存儲
//DistanceComparatorSource 實現(xiàn)了SortComparatorSource接口
public class DistanceComparatorSource implements SortComparatorSource {
private static final long serialVersionUID = 1L;
// x y 用來保存 坐標(biāo)位置
private int x;
private int y;
public DistanceComparatorSource(int x, int y) {
this.x = x;
this.y = y;
}
// 返回ScoreDocComparator 用來實現(xiàn)排序功能
public ScoreDocComparator newComparator(IndexReader reader, String fieldname) throws IOException {
return new DistanceScoreDocLookupComparator(reader, fieldname, x, y);
}
//DistanceScoreDocLookupComparator 實現(xiàn)了ScoreDocComparator 用來排序
private static class DistanceScoreDocLookupComparator implements ScoreDocComparator {
private float[] distances; // 保存每個餐館到指定點的距離
// 構(gòu)造函數(shù) , 構(gòu)造函數(shù)在這里幾乎完成所有的準(zhǔn)備工作.
public DistanceScoreDocLookupComparator(IndexReader reader, String fieldname, int x, int y) throws IOException {
System.out.println("fieldName2="+fieldname);
final TermEnum enumerator = reader.terms(new Term(fieldname, ""));
System.out.println("maxDoc="+reader.maxDoc());
distances = new float[reader.maxDoc()]; // 初始化distances
if (distances.length > 0) {
TermDocs termDocs = reader.termDocs();
try {
if (enumerator.term() == null) {
throw new RuntimeException("no terms in field " + fieldname);
}
int i = 0,j = 0;
do {
System.out.println("in do-while :" + i ++);
Term term = enumerator.term(); // 取出每一個Term
if (term.field() != fieldname) // 與給定的域不符合則比較下一個
break;
//Sets this to the data for the current term in a TermEnum.
//This may be optimized in some implementations.
termDocs.seek(enumerator); //參考TermDocs Doc
while (termDocs.next()) {
System.out.println(" in while :" + j ++);
System.out.println(" in while ,Term :" + term.toString());
String[] xy = term.text().split(","); // 去處x y
int deltax = Integer.parseInt(xy[0]) - x;
int deltay = Integer.parseInt(xy[1]) - y;
// 計算距離
distances[termDocs.doc()] = (float) Math.sqrt(deltax * deltax + deltay * deltay);
}
}
while (enumerator.next());
} finally {
termDocs.close();
}
}
}
//有上面的構(gòu)造函數(shù)的準(zhǔn)備 這里就比較簡單了
public int compare(ScoreDoc i, ScoreDoc j) {
if (distances[i.doc] distances[j.doc])
return -1;
if (distances[i.doc] > distances[j.doc])
return 1;
return 0;
}
// 返回距離
public Comparable sortValue(ScoreDoc i) {
return new Float(distances[i.doc]);
}
//指定SortType
public int sortType() {
return SortField.FLOAT;
}
}
public String toString() {
return "Distance from (" + x + "," + y + ")";
}
}
view plaincopy to clipboardprint?
package com.nikee.lucene;
import java.io.IOException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermDocs;
import org.apache.lucene.index.TermEnum;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.ScoreDocComparator;
import org.apache.lucene.search.SortComparatorSource;
import org.apache.lucene.search.SortField;
//實現(xiàn)了搜索距你最近的餐館的名字. 餐館坐標(biāo)用字符串"x,y"來存儲
//DistanceComparatorSource 實現(xiàn)了SortComparatorSource接口
public class DistanceComparatorSource implements SortComparatorSource {
private static final long serialVersionUID = 1L;
// x y 用來保存 坐標(biāo)位置
private int x;
private int y;
public DistanceComparatorSource(int x, int y) {
this.x = x;
this.y = y;
}
// 返回ScoreDocComparator 用來實現(xiàn)排序功能
public ScoreDocComparator newComparator(IndexReader reader, String fieldname) throws IOException {
return new DistanceScoreDocLookupComparator(reader, fieldname, x, y);
}
//DistanceScoreDocLookupComparator 實現(xiàn)了ScoreDocComparator 用來排序
private static class DistanceScoreDocLookupComparator implements ScoreDocComparator {
private float[] distances; // 保存每個餐館到指定點的距離
// 構(gòu)造函數(shù) , 構(gòu)造函數(shù)在這里幾乎完成所有的準(zhǔn)備工作.
public DistanceScoreDocLookupComparator(IndexReader reader, String fieldname, int x, int y) throws IOException {
System.out.println("fieldName2="+fieldname);
final TermEnum enumerator = reader.terms(new Term(fieldname, ""));
System.out.println("maxDoc="+reader.maxDoc());
distances = new float[reader.maxDoc()]; // 初始化distances
if (distances.length > 0) {
TermDocs termDocs = reader.termDocs();
try {
if (enumerator.term() == null) {
throw new RuntimeException("no terms in field " + fieldname);
}
int i = 0,j = 0;
do {
System.out.println("in do-while :" + i ++);
Term term = enumerator.term(); // 取出每一個Term
if (term.field() != fieldname) // 與給定的域不符合則比較下一個
break;
//Sets this to the data for the current term in a TermEnum.
//This may be optimized in some implementations.
termDocs.seek(enumerator); //參考TermDocs Doc
while (termDocs.next()) {
System.out.println(" in while :" + j ++);
System.out.println(" in while ,Term :" + term.toString());
String[] xy = term.text().split(","); // 去處x y
int deltax = Integer.parseInt(xy[0]) - x;
int deltay = Integer.parseInt(xy[1]) - y;
// 計算距離
distances[termDocs.doc()] = (float) Math.sqrt(deltax * deltax + deltay * deltay);
}
}
while (enumerator.next());
} finally {
termDocs.close();
}
}
}
//有上面的構(gòu)造函數(shù)的準(zhǔn)備 這里就比較簡單了
public int compare(ScoreDoc i, ScoreDoc j) {
if (distances[i.doc] distances[j.doc])
return -1;
if (distances[i.doc] > distances[j.doc])
return 1;
return 0;
}
// 返回距離
public Comparable sortValue(ScoreDoc i) {
return new Float(distances[i.doc]);
}
//指定SortType
public int sortType() {
return SortField.FLOAT;
}
}
public String toString() {
return "Distance from (" + x + "," + y + ")";
}
}
package com.nikee.lucene;
import java.io.IOException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermDocs;
import org.apache.lucene.index.TermEnum;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.ScoreDocComparator;
import org.apache.lucene.search.SortComparatorSource;
import org.apache.lucene.search.SortField;
//實現(xiàn)了搜索距你最近的餐館的名字. 餐館坐標(biāo)用字符串"x,y"來存儲
//DistanceComparatorSource 實現(xiàn)了SortComparatorSource接口
public class DistanceComparatorSource implements SortComparatorSource {
    private static final long serialVersionUID = 1L;

    // x y 用來保存 坐標(biāo)位置
    private int x;
    private int y;

    public DistanceComparatorSource(int x, int y) {
        this.x = x;
        this.y = y;
    }

    // 返回ScoreDocComparator 用來實現(xiàn)排序功能
    public ScoreDocComparator newComparator(IndexReader reader, String fieldname) throws IOException {
        return new DistanceScoreDocLookupComparator(reader, fieldname, x, y);
    }

    //DistanceScoreDocLookupComparator 實現(xiàn)了ScoreDocComparator 用來排序
    private static class DistanceScoreDocLookupComparator implements ScoreDocComparator {
        private float[] distances; // 保存每個餐館到指定點的距離

        // 構(gòu)造函數(shù) , 構(gòu)造函數(shù)在這里幾乎完成所有的準(zhǔn)備工作.
        public DistanceScoreDocLookupComparator(IndexReader reader, String fieldname, int x, int y) throws IOException {
            System.out.println("fieldName2="+fieldname);
            final TermEnum enumerator = reader.terms(new Term(fieldname, ""));

            System.out.println("maxDoc="+reader.maxDoc());
            distances = new float[reader.maxDoc()]; // 初始化distances
            if (distances.length > 0) {
                TermDocs termDocs = reader.termDocs();
                try {
                    if (enumerator.term() == null) {
                        throw new RuntimeException("no terms in field " + fieldname);
                    }
                    int i = 0,j = 0;
                    do {
                        System.out.println("in do-while :" + i ++);
                        Term term = enumerator.term(); // 取出每一個Term
                        if (term.field() != fieldname) // 與給定的域不符合則比較下一個
                            break;

                        //Sets this to the data for the current term in a TermEnum.
                        //This may be optimized in some implementations.
                        termDocs.seek(enumerator); //參考TermDocs Doc
                        while (termDocs.next()) {
                            System.out.println(" in while :" + j ++);
                            System.out.println(" in while ,Term :" + term.toString());

                            String[] xy = term.text().split(","); // 去處x y
                            int deltax = Integer.parseInt(xy[0]) - x;
                            int deltay = Integer.parseInt(xy[1]) - y;
                            // 計算距離
                            distances[termDocs.doc()] = (float) Math.sqrt(deltax * deltax + deltay * deltay);
                        }
                    }
                    while (enumerator.next());
                } finally {
                    termDocs.close();
                }
            }
        }
        //有上面的構(gòu)造函數(shù)的準(zhǔn)備 這里就比較簡單了
        public int compare(ScoreDoc i, ScoreDoc j) {
            if (distances[i.doc] distances[j.doc])
                return -1;
            if (distances[i.doc] > distances[j.doc])
                return 1;
            return 0;
        }

        // 返回距離
        public Comparable sortValue(ScoreDoc i) {
            return new Float(distances[i.doc]);
        }

        //指定SortType
        public int sortType() {
            return SortField.FLOAT;
        }
    }

    public String toString() {
        return "Distance from (" + x + "," + y + ")";
    }
}
這是一個實現(xiàn)了上面兩個接口的兩個類, 里面帶有詳細注釋, 可以看出 自定義排序并不是很難的. 該實現(xiàn)能否正確實現(xiàn),我們來看看測試代碼能否通過吧.
Java代碼
package com.nikee.lucene.test;
import java.io.IOException;
import junit.framework.TestCase;
import org.apache.lucene.analysis.WhitespaceAnalyzer;
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.FieldDoc;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopFieldDocs;
import org.apache.lucene.store.RAMDirectory;
import com.nikee.lucene.DistanceComparatorSource;
public class DistanceComparatorSourceTest extends TestCase {
private RAMDirectory directory;
private IndexSearcher searcher;
private Query query;
//建立測試環(huán)境
protected void setUp() throws Exception {
directory = new RAMDirectory();
IndexWriter writer = new IndexWriter(directory, new WhitespaceAnalyzer(), true);
addPoint(writer, "El Charro", "restaurant", 1, 2);
addPoint(writer, "Cafe Poca Cosa", "restaurant", 5, 9);
addPoint(writer, "Los Betos", "restaurant", 9, 6);
addPoint(writer, "Nico's Taco Shop", "restaurant", 3, 8);
writer.close();
searcher = new IndexSearcher(directory);
query = new TermQuery(new Term("type", "restaurant"));
}
private void addPoint(IndexWriter writer, String name, String type, int x, int y) throws IOException {
Document doc = new Document();
doc.add(new Field("name", name, Field.Store.YES, Field.Index.TOKENIZED));
doc.add(new Field("type", type, Field.Store.YES, Field.Index.TOKENIZED));
doc.add(new Field("location", x + "," + y, Field.Store.YES, Field.Index.UN_TOKENIZED));
writer.addDocument(doc);
}
public void testNearestRestaurantToHome() throws Exception {
//使用DistanceComparatorSource來構(gòu)造一個SortField
Sort sort = new Sort(new SortField("location", new DistanceComparatorSource(0, 0)));
Hits hits = searcher.search(query, sort); // 搜索
//測試
assertEquals("closest", "El Charro", hits.doc(0).get("name"));
assertEquals("furthest", "Los Betos", hits.doc(3).get("name"));
}
public void testNeareastRestaurantToWork() throws Exception {
Sort sort = new Sort(new SortField("location", new DistanceComparatorSource(10, 10))); // 工作的坐標(biāo) 10,10
//上面的測試實現(xiàn)了自定義排序,但是并不能訪問自定義排序的更詳細信息,利用
//TopFieldDocs 可以進一步訪問相關(guān)信息
TopFieldDocs docs = searcher.search(query, null, 3, sort);
assertEquals(4, docs.totalHits);
assertEquals(3, docs.scoreDocs.length);
//取得FieldDoc 利用FieldDoc可以取得關(guān)于排序的更詳細信息 請查看FieldDoc Doc
FieldDoc fieldDoc = (FieldDoc) docs.scoreDocs[0];
assertEquals("(10,10) -> (9,6) = sqrt(17)", new Float(Math.sqrt(17)), fieldDoc.fields[0]);
Document document = searcher.doc(fieldDoc.doc);
assertEquals("Los Betos", document.get("name"));
dumpDocs(sort, docs); // 顯示相關(guān)信息
}
// 顯示有關(guān)排序的信息
private void dumpDocs(Sort sort, TopFieldDocs docs) throws IOException {
System.out.println("Sorted by: " + sort);
ScoreDoc[] scoreDocs = docs.scoreDocs;
for (int i = 0; i scoreDocs.length; i++) {
FieldDoc fieldDoc = (FieldDoc) scoreDocs[i];
Float distance = (Float) fieldDoc.fields[0];
Document doc = searcher.doc(fieldDoc.doc);
System.out.println(" " + doc.get("name") + " @ (" + doc.get("location") + ") -> " + distance);
}
}
}
您可能感興趣的文章:
  • java的arraylist排序示例(arraylist用法)
  • java ArrayList集合中的某個對象屬性進行排序的實現(xiàn)代碼
  • Java ArrayList的不同排序方法
  • java教程之二個arraylist排序的示例分享
  • java對ArrayList排序代碼示例
  • java實現(xiàn)ArrayList根據(jù)存儲對象排序功能示例
  • java中實現(xiàn)Comparable接口實現(xiàn)自定義排序的示例
  • Java Collections.sort()實現(xiàn)List排序的默認方法和自定義方法
  • Java針對ArrayList自定義排序的2種實現(xiàn)方法

標(biāo)簽:馬鞍山 紅河 鄭州 岳陽 亳州 大興安嶺 拉薩 武威

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《java Lucene 中自定義排序的實現(xiàn)》,本文關(guān)鍵詞  java,Lucene,中,自定義,排序,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《java Lucene 中自定義排序的實現(xiàn)》相關(guān)的同類信息!
  • 本頁收集關(guān)于java Lucene 中自定義排序的實現(xiàn)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    爽爽影院免费观看视频| 国产精品女主播| 欧美视频第二页| 影视先锋久久| 91免费的视频在线播放| 超碰精品在线| 国产精选第一页| 97精品免费视频| 嫩草在线播放| 悠悠资源网久久精品| 庆余年2免费日韩剧观看大牛| 成人影院在线| 国产人与禽zoz0性伦| av色综合久久天堂av色综合在| 丝袜美腿高跟呻吟高潮一区| 国产二区视频在线观看| 欧美xxxx三人交性视频| 国产一区二区不卡视频| 久热国产精品视频| 亚洲视频每日更新| 99在线热播精品免费99热| 视频二区在线观看| 成人3d动漫一区二区三区| 人妻互换免费中文字幕| 欧美日韩影视| 亚洲www免费| av在线dvd| 看成年女人免费午夜视频| 欧美久久成人| 黄色av网站免费| 中文字幕一区二区三区电影| 免费vip影院| 久久久久久夜精品精品免费| 欧美男男大粗吊1069| av在线网站观看| 亚洲婷婷综合网| 亚洲成人国产综合| 另类综合日韩欧美亚洲| 国产成人av毛片| 亚洲无亚洲人成网站77777| 欧美大秀在线观看| av网站网址| 国产精品久久久久久无人区| eeuss影影院www在线播放| 欧美日韩一区视频| 波多野结衣大片| 欧美激情黄色片| 欧美激情精品久久久久久久变态| 亚洲大全视频| 精品国产91久久久久久久妲己| 国产视频中文字幕在线观看| 看**视频a级毛片| 粉嫩一区二区三区四区公司1| 污污的视频免费观看| 日韩视频免费在线观看| 日韩一区二区三免费高清| 国产精品一区二区免费| 性爽视频在线| 日本aⅴ免费视频一区二区三区| 欧美亚洲国产视频| 欧美成人乱码一二三四区免费| 福利资源在线观看| 国产欧美在线看| 在线观看av一区| 精品久久久久久中文字幕| 99视频在线免费观看| 欧美美女视频在线观看| 麻豆资源在线| 熟妇人妻久久中文字幕| 久久久久99精品成人片毛片| 黄色片子免费| 欧美在线观看一区二区| 人人妻人人澡人人爽人人精品| 青青草原综合久久大伊人精品优势| 亚洲精品推荐| 国产精品1区2区在线观看| 欧美无人高清视频在线观看| 亚洲人metart人体| 成人av在线不卡| 日韩精品视频久久| 97色伦图片97综合影院| 99久久精品国产观看| 亚洲一区日韩精品中文字幕| 无码aⅴ精品一区二区三区浪潮| 欧美在线免费视屏| 一区二区电影| 高跟丝袜一区二区三区| 在线观看免费91| 午夜精品一区二区三区视频| 9191国语精品高清在线| 欧美1—12sexvideos| 欧美一区二区三区| 日本黄xxxxxxxxx100| 国产亚洲欧洲在线| 日韩在线不卡视频| 久久精品一级片| √天堂中文官网8在线| 亚洲欧洲在线观看av| 久久久久久精| 久久精品久久久久电影| 亚洲精品一区二区三区在线| 亚洲免费人成在线视频观看| 综合区小说区图片区在线一区| 国内精品久久久久影院一蜜桃| 激情视频免费观看在线| 亚洲永久精品一区| av黄色免费在线观看| 欧美日韩色视频| 激情五月婷婷综合网| 日韩精品最新在线观看| 国产精品久久久久久久久久久久冷| 欧美 日韩 国产 一区二区三区| 日韩一区二区视频在线| 在线毛片观看| 色一情一乱一区二区三区| 又黄又爽在线免费观看| 成人在线免费高清视频| 999久久久久久| 先锋成人影音| 欧美性生交大片免网| 国产毛片在线看| 天堂一区二区在线| 红桃视频 国产| 欧美第一页草草影院浮力| 一广人看www在线观看免费视频| 激情另类小说区图片区视频区| 99热一区二区三区| 最好看的中文字幕| 91精品视频免费观看| 国产99久久久国产精品潘金| 国产精品熟女视频| 四虎国产精品免费久久5151| 国产精品日韩精品欧美精品| 深夜激情久久| 日本高清网站| 奇米四色…亚洲| 欧美肉体xxxx裸体137大胆| 一区二区三区在线观看免费视频| 大地资源中文在线观看免费版| jizz内谢中国亚洲jizz| 欧美久久久久久久久| 一区二区三区四区日本视频| 国产精品久久久久福利| 亚洲wwww| 91精品国产自产在线| 午夜精品久久久久久久99老熟妇| 伊人久久综合视频| 国产精品亚洲综合一区在线观看| 精品街拍一区二区| 成人有码视频在线播放| 日韩av在线中文字幕| 亚洲tv在线| 欧美激情综合五月色丁香| 国产又色又爽又黄又免费| 亚洲久草在线视频| 岛国毛片在线观看| 在线观看国产区| 奴色虐av一区二区三区| 亚洲丝袜在线观看| 欧美高清免费| 韩日精品一区| 亚洲第一精品网站| 欧美色爱综合| 国产伊人精品| 亚洲一区二区在线看| 成人免费视频视频在线观看免费| 四虎免费在线视频| 欧美亚洲天堂网| 久艹在线免费观看| 中文字幕avav| 亚洲午夜激情| 美女黄色一级视频| 国产男女猛烈无遮挡91| 久久精品国产亚洲精品| 一区二区三区四区视频精品免费| 欧美特黄视频| 欧美大学生性色视频| 亚洲国产精品一区制服丝袜| 99国产精品白浆在线观看免费| 欧美bbbbxxxx| 福利在线小视频| 久久久久久日本一区99| 精品第一国产综合精品aⅴ| 在线观看av中文字幕| 视频在线观看91| 午夜精品久久久久久不卡8050| 欧美高清一级片在线观看| 八戒八戒神马在线电影| 久久99精品国产麻豆婷婷| 永久91嫩草亚洲精品人人| 嫩草影院一区二区| 色av一区二区| 久久综合88中文色鬼| 欧美精品二区三区| 欧美黑人经典片免费观看| 亚洲熟妇一区二区| 欧美午夜丰满在线18影院| 免费黄色片视频| 亚洲三级电影在线观看| 日韩精品在线视频美女| 福利视频一区| 欧美视频第一页| 粉嫩av一区二区三区粉嫩| 色婷婷av金发美女在线播放| 香蕉影院在线| 视频在线观看你懂的| 国产福利一区二区三区在线视频| 国产精品成人免费一区二区视频| 一区二区免费电影| 欧美日韩中文字幕视频| 在线观看三级视频| 五月开心六月丁香综合色啪| 在线观看免费观看在线| 性xxxxfreexxxxx欧美丶| 日本在线观看不卡视频| 色噜噜亚洲精品中文字幕| 15—17女人毛片| 丁香六月婷婷综合| 国产在线91| 人人玩人人添人人澡免费| 久久久久久久高清| 如如影视在线观看经典| 亚洲成人中文字幕在线| 国产精品久久久久久精| 欧美成人黑人| 国产99午夜精品一区二区三区| 国产精品中文字幕在线观看| 日韩精品中文字幕在线一区| 中文字幕一区二区三区精华液| 国产成人精品一区二区三区在线| 日本午夜精品一区二区三区电影| 欧美极品另类videosde| 1000部精品久久久久久久久| 亚洲第一综合网| 99久久99久久精品免费看小说.| 亚洲天堂av图片| 久久高清内射无套| 国产亚av手机在线观看| 国产一区二区三区| 水莓100在线视频| av无码av天天av天天爽| 久久久久福利视频| 秋霞a级毛片在线看| 亚洲一区激情| 成黄免费在线| 亚洲综合偷拍欧美一区色| 午夜爱爱毛片xxxx视频免费看| 国产在线不卡一区二区三区| 午夜伦伦电影理论片费看| 男人日女人的bb| 中文字幕在线免费播放| 免费**毛片在线| 伊人久久婷婷| 日韩精品欧美一区二区三区| 色综合天天狠天天透天天伊人| 青草影院在线观看| 国产自产视频| 成人久久久精品国产乱码一区二区| 久久人人妻人人人人妻性色av| 五月天激情国产综合婷婷婷| 久久美女精品| 日韩av无码中文字幕| 中文幕无线码中文字蜜桃| 97se视频在线观看| 草草久久久无码国产专区| 国产丝袜精品视频| 成视频在线观看免费观看| 日韩欧美一区二区三区在线观看| 狠狠色丁香久久婷婷综合丁香| 99久久久精品免费观看国产蜜| 欧美电影院免费观看| 国产视频精品久久久| 成人午夜看片网址| 午夜裸体女人视频网站在线观看| 国产精品免费一区二区三区四区| 精品国语对白精品自拍视| 综合一区中文字幕| 奇米影音第四色| 色综合免费视频| 亚洲AV无码一区二区三区少妇| 国产一区精品视频| 日本性视频网| 国产高清自产拍av在线| 操操操日日日| av电影在线地址| 欧美大学生性色视频| 久久久免费网站| 亚洲男人都懂的| 国产普通话bbwbbwbbw| 国产天堂在线播放| 免费在线观看亚洲| 亚洲一区自拍| 欧美一级淫片免费视频| 免费羞羞视频网站| 99精品国产一区二区三区| 国产精品国产一区二区| 中文字幕av久久爽av| 欧美 丝袜 自拍 制服 另类| 极品尤物一区二区| 国产精品福利视频一区二区三区| 天天操狠狠操夜夜操| 亚洲第一视频在线播放| 日本小视频在线免费观看| 一本色道88久久加勒比精品| 一级一片免费播放| 美女被人操视频在线观看| 九九精品在线视频| 日韩网址在线观看| 末成年女av片一区二区下载| 精品国产一区二区三区久久久蜜月| 亚洲精品亚洲人成人网| 粉嫩av国产一区二区三区| caoporn视频在线| 国产中文字幕视频| 国产美女精品在线观看| 成人一区不卡| 亚洲成av人片一区二区| 欧美三级成人观看| 国产精品情侣自拍| 亚洲精品在线免费| 欧美日韩免费观看一区=区三区| 国产免费高清一区| 中文字幕不卡的av| www.成人影院| 亚洲视频每日更新| 熟女少妇精品一区二区| 日韩大胆成人| 亚洲精品自产拍在线观看app|