婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > java Lucene 中自定義排序的實現

java Lucene 中自定義排序的實現

熱門標簽:開封便宜外呼系統報價 黃石智能營銷電銷機器人效果 怎樣把地圖標注出來 淮南騰訊地圖標注 騰訊地圖標注商戶改名注冊入駐 電話機器人的特色和創新 漯河辦理400電話 地圖標注人員兼職 商丘百應電話機器人有沒有效果
Lucene中的自定義排序功能和Java集合中的自定義排序的實現方法差不多,都要實現一下比較接口. 在Java中只要實現Comparable接口就可以了.但是在Lucene中要實現SortComparatorSource接口和ScoreDocComparator接口.在了解具體實現方法之前先來看看這兩個接口的定義吧.
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
該方法只是創造一個ScoreDocComparator 實例用來實現排序.所以我們還要實現ScoreDocComparator 接口.來看看ScoreDocComparator 接口.功能是比較來兩個ScoreDoc 對象來排序(Compares two ScoreDoc objects for sorting) 里面定義了兩個Lucene實現的靜態實例.如下:
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個方法與排序相關,需要我們實現 分別如下:
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中的一個實現,用來搜索距你最近的餐館的名字. 餐館坐標用字符串"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;
//實現了搜索距你最近的餐館的名字. 餐館坐標用字符串"x,y"來存儲
//DistanceComparatorSource 實現了SortComparatorSource接口
public class DistanceComparatorSource implements SortComparatorSource {
private static final long serialVersionUID = 1L;
// x y 用來保存 坐標位置
private int x;
private int y;
public DistanceComparatorSource(int x, int y) {
this.x = x;
this.y = y;
}
// 返回ScoreDocComparator 用來實現排序功能
public ScoreDocComparator newComparator(IndexReader reader, String fieldname) throws IOException {
return new DistanceScoreDocLookupComparator(reader, fieldname, x, y);
}
//DistanceScoreDocLookupComparator 實現了ScoreDocComparator 用來排序
private static class DistanceScoreDocLookupComparator implements ScoreDocComparator {
private float[] distances; // 保存每個餐館到指定點的距離
// 構造函數 , 構造函數在這里幾乎完成所有的準備工作.
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();
}
}
}
//有上面的構造函數的準備 這里就比較簡單了
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;
//實現了搜索距你最近的餐館的名字. 餐館坐標用字符串"x,y"來存儲
//DistanceComparatorSource 實現了SortComparatorSource接口
public class DistanceComparatorSource implements SortComparatorSource {
private static final long serialVersionUID = 1L;
// x y 用來保存 坐標位置
private int x;
private int y;
public DistanceComparatorSource(int x, int y) {
this.x = x;
this.y = y;
}
// 返回ScoreDocComparator 用來實現排序功能
public ScoreDocComparator newComparator(IndexReader reader, String fieldname) throws IOException {
return new DistanceScoreDocLookupComparator(reader, fieldname, x, y);
}
//DistanceScoreDocLookupComparator 實現了ScoreDocComparator 用來排序
private static class DistanceScoreDocLookupComparator implements ScoreDocComparator {
private float[] distances; // 保存每個餐館到指定點的距離
// 構造函數 , 構造函數在這里幾乎完成所有的準備工作.
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();
}
}
}
//有上面的構造函數的準備 這里就比較簡單了
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;
//實現了搜索距你最近的餐館的名字. 餐館坐標用字符串"x,y"來存儲
//DistanceComparatorSource 實現了SortComparatorSource接口
public class DistanceComparatorSource implements SortComparatorSource {
    private static final long serialVersionUID = 1L;

    // x y 用來保存 坐標位置
    private int x;
    private int y;

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

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

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

        // 構造函數 , 構造函數在這里幾乎完成所有的準備工作.
        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();
                }
            }
        }
        //有上面的構造函數的準備 這里就比較簡單了
        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 + ")";
    }
}
這是一個實現了上面兩個接口的兩個類, 里面帶有詳細注釋, 可以看出 自定義排序并不是很難的. 該實現能否正確實現,我們來看看測試代碼能否通過吧.
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;
//建立測試環境
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來構造一個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))); // 工作的坐標 10,10
//上面的測試實現了自定義排序,但是并不能訪問自定義排序的更詳細信息,利用
//TopFieldDocs 可以進一步訪問相關信息
TopFieldDocs docs = searcher.search(query, null, 3, sort);
assertEquals(4, docs.totalHits);
assertEquals(3, docs.scoreDocs.length);
//取得FieldDoc 利用FieldDoc可以取得關于排序的更詳細信息 請查看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); // 顯示相關信息
}
// 顯示有關排序的信息
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集合中的某個對象屬性進行排序的實現代碼
  • Java ArrayList的不同排序方法
  • java教程之二個arraylist排序的示例分享
  • java對ArrayList排序代碼示例
  • java實現ArrayList根據存儲對象排序功能示例
  • java中實現Comparable接口實現自定義排序的示例
  • Java Collections.sort()實現List排序的默認方法和自定義方法
  • Java針對ArrayList自定義排序的2種實現方法

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

巨人網絡通訊聲明:本文標題《java Lucene 中自定義排序的實現》,本文關鍵詞  java,Lucene,中,自定義,排序,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《java Lucene 中自定義排序的實現》相關的同類信息!
  • 本頁收集關于java Lucene 中自定義排序的實現的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲乱码国产乱码精品精98午夜| 九九在线精品视频| 91丨九色porny丨蝌蚪| 午夜精品久久久久久久99水蜜桃 | 一区二区三区高清| 欧美日韩激情一区| av电影在线观看不卡| 国产一区二区三区高清播放| 亚洲永久精品大片| 亚洲国产一区二区在线播放| 国产精品久久久久久久久快鸭| 久久婷婷国产综合精品青草 | 国产黄色成人av| 久久精品99国产精品| 免费欧美高清视频| 久久99久久99精品免视看婷婷| 亚洲黄色小视频| 一区二区高清在线| 亚洲大片在线观看| 日韩激情一区二区| 玖玖九九国产精品| 看片的网站亚洲| 成人福利在线看| 91在线码无精品| 欧美日韩高清影院| 久久美女高清视频| 欧美韩国日本不卡| 亚洲在线一区二区三区| 日韩电影免费一区| 久久亚洲精精品中文字幕早川悠里 | 九九精品一区二区| 日本成人在线不卡视频| 成人app下载| 亚洲精品一线二线三线| 国产日韩欧美精品在线| 亚洲男同1069视频| 福利一区福利二区| 久久久久成人黄色影片| 日韩精品免费专区| 欧美三级电影在线观看| 中文字幕在线观看一区| 国产一区999| 日韩亚洲欧美高清| 美女视频黄久久| 色天天综合久久久久综合片| 中文字幕欧美国产| 成人午夜免费av| 成人欧美一区二区三区小说 | 国产精品久久久久影院老司| 午夜伦理一区二区| 欧美草草影院在线视频| 激情久久五月天| 国产精品乱人伦中文| 99精品欧美一区二区三区小说 | 91香蕉视频mp4| 成人午夜碰碰视频| 国产激情视频一区二区三区欧美| 久久99国产精品免费网站| 亚洲色图在线视频| 亚洲视频一二区| 一区二区三区产品免费精品久久75| 国产精品久久久久一区 | 日韩精品电影在线| 亚洲福利一二三区| 秋霞午夜鲁丝一区二区老狼| 日本精品免费观看高清观看| 日本aⅴ精品一区二区三区 | 色噜噜狠狠色综合中国| 蜜臀国产一区二区三区在线播放 | 久久精品国产一区二区| 中文字幕免费观看一区| 日韩欧美电影一二三| 色婷婷久久久综合中文字幕| 日本视频一区二区三区| 一区二区三区视频在线观看| 最新高清无码专区| 欧美激情在线一区二区| 久久青草国产手机看片福利盒子| 欧美日韩成人综合天天影院| 91免费精品国自产拍在线不卡| 国产成人在线看| 国产91在线观看| 播五月开心婷婷综合| 99久久婷婷国产综合精品| av亚洲精华国产精华精| 欧美视频一区二区三区四区 | 成人精品视频.| 精品福利在线导航| 亚洲国产精品久久不卡毛片 | 中文字幕五月欧美| 亚洲精品成人a在线观看| 国产精品自产自拍| 国产精品久久夜| 欧美乱妇一区二区三区不卡视频| 麻豆91免费观看| 另类小说综合欧美亚洲| 精品亚洲免费视频| 99这里都是精品| 欧美日韩国产综合视频在线观看| 欧美老肥妇做.爰bbww| 久久久久久久精| 亚洲一区二区在线播放相泽| 久久精品国产秦先生| 国产成人精品免费在线| 欧美午夜片在线看| 精品噜噜噜噜久久久久久久久试看 | 国产在线日韩欧美| 成人午夜在线视频| 91精品国产乱| 亚洲久草在线视频| 国产成人午夜视频| 欧美v国产在线一区二区三区| 成人免费一区二区三区在线观看| 日本欧美韩国一区三区| 欧美性猛交xxxxxx富婆| 日韩一区欧美小说| 99久久精品免费| 国产色一区二区| 黄色日韩网站视频| 久久久国产精品不卡| 久久丁香综合五月国产三级网站 | 欧美亚洲国产怡红院影院| 久久亚洲一级片| 美女mm1313爽爽久久久蜜臀| 色综合天天综合色综合av| 国产色产综合产在线视频| 久久精品国产澳门| 久久中文字幕电影| 国产一区二区免费看| 久久一区二区视频| 成人黄色在线视频| 综合婷婷亚洲小说| 91麻豆国产精品久久| 亚洲综合999| 欧美电视剧在线看免费| 成人免费视频一区二区| 亚洲人成伊人成综合网小说| 欧美色综合影院| 午夜伦欧美伦电影理论片| 精品久久免费看| 在线观看91精品国产入口| 免费在线观看一区| 中文字幕av不卡| 欧美一区日本一区韩国一区| 国产美女娇喘av呻吟久久| 中文字幕一区二区三区在线不卡 | 亚洲图片另类小说| 88在线观看91蜜桃国自产| 久久99热这里只有精品| 亚洲欧美偷拍另类a∨色屁股| 制服丝袜激情欧洲亚洲| 成人激情小说乱人伦| 蜜桃精品视频在线观看| 亚洲欧美日韩国产另类专区 | 国产亚洲欧美日韩日本| 日韩一二三四区| 制服视频三区第一页精品| 色欧美日韩亚洲| 91黄色免费观看| 99re视频精品| av成人老司机| 97精品久久久午夜一区二区三区| 国产激情视频一区二区三区欧美| 男人的天堂久久精品| 日韩激情中文字幕| 日本视频在线一区| 久久国产精品无码网站| 国模娜娜一区二区三区| 久久精品国产99国产| 韩国一区二区三区| 国产69精品一区二区亚洲孕妇| 国产激情91久久精品导航| 国产不卡免费视频| 91偷拍与自偷拍精品| 欧美制服丝袜第一页| 91精品国产综合久久蜜臀| 日韩精品中文字幕在线不卡尤物 | 国产精品88av| 色菇凉天天综合网| 欧美日本一区二区在线观看| 欧美日韩精品高清| 精品女同一区二区| 亚洲免费成人av| 日本色综合中文字幕| 成人av免费网站| 欧美一区二区日韩| 亚洲日穴在线视频| 久久国产精品99久久人人澡| 成人美女视频在线观看18| 欧美性大战久久久久久久 | 国产日韩欧美麻豆| 亚洲免费观看在线视频| 免费观看91视频大全| 日本高清不卡一区| 国产日韩欧美精品电影三级在线| 亚洲高清不卡在线观看| 91香蕉视频mp4| 亚洲欧美日韩在线| 国产麻豆成人传媒免费观看| 欧美精品一二三区|