校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

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

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

熱門標(biāo)簽:開封便宜外呼系統(tǒng)報(bào)價(jià) 黃石智能營(yíng)銷電銷機(jī)器人效果 怎樣把地圖標(biāo)注出來 淮南騰訊地圖標(biāo)注 騰訊地圖標(biāo)注商戶改名注冊(cè)入駐 電話機(jī)器人的特色和創(chuàng)新 漯河辦理400電話 地圖標(biāo)注人員兼職 商丘百應(yīng)電話機(jī)器人有沒有效果
Lucene中的自定義排序功能和Java集合中的自定義排序的實(shí)現(xiàn)方法差不多,都要實(shí)現(xiàn)一下比較接口. 在Java中只要實(shí)現(xiàn)Comparable接口就可以了.但是在Lucene中要實(shí)現(xiàn)SortComparatorSource接口和ScoreDocComparator接口.在了解具體實(shí)現(xiàn)方法之前先來看看這兩個(gè)接口的定義吧.
SortComparatorSource接口的功能是返回一個(gè)用來排序ScoreDocs的comparator(Expert: returns a comparator for sorting ScoreDocs).該接口只定義了一個(gè)方法.如下:
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)造一個(gè)ScoreDocComparator 實(shí)例用來實(shí)現(xiàn)排序.所以我們還要實(shí)現(xiàn)ScoreDocComparator 接口.來看看ScoreDocComparator 接口.功能是比較來兩個(gè)ScoreDoc 對(duì)象來排序(Compares two ScoreDoc objects for sorting) 里面定義了兩個(gè)Lucene實(shí)現(xiàn)的靜態(tài)實(shí)例.如下:
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個(gè)方法與排序相關(guān),需要我們實(shí)現(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();
看個(gè)例子吧!
該例子為L(zhǎng)ucene in Action中的一個(gè)實(shí)現(xiàn),用來搜索距你最近的餐館的名字. 餐館坐標(biāo)用字符串"x,y"來存儲(chǔ).
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;
//實(shí)現(xiàn)了搜索距你最近的餐館的名字. 餐館坐標(biāo)用字符串"x,y"來存儲(chǔ)
//DistanceComparatorSource 實(shí)現(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 用來實(shí)現(xiàn)排序功能
public ScoreDocComparator newComparator(IndexReader reader, String fieldname) throws IOException {
return new DistanceScoreDocLookupComparator(reader, fieldname, x, y);
}
//DistanceScoreDocLookupComparator 實(shí)現(xiàn)了ScoreDocComparator 用來排序
private static class DistanceScoreDocLookupComparator implements ScoreDocComparator {
private float[] distances; // 保存每個(gè)餐館到指定點(diǎn)的距離
// 構(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(); // 取出每一個(gè)Term
if (term.field() != fieldname) // 與給定的域不符合則比較下一個(gè)
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;
// 計(jì)算距離
distances[termDocs.doc()] = (float) Math.sqrt(deltax * deltax + deltay * deltay);
}
}
while (enumerator.next());
} finally {
termDocs.close();
}
}
}
//有上面的構(gòu)造函數(shù)的準(zhǔn)備 這里就比較簡(jiǎ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;
//實(shí)現(xiàn)了搜索距你最近的餐館的名字. 餐館坐標(biāo)用字符串"x,y"來存儲(chǔ)
//DistanceComparatorSource 實(shí)現(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 用來實(shí)現(xiàn)排序功能
public ScoreDocComparator newComparator(IndexReader reader, String fieldname) throws IOException {
return new DistanceScoreDocLookupComparator(reader, fieldname, x, y);
}
//DistanceScoreDocLookupComparator 實(shí)現(xiàn)了ScoreDocComparator 用來排序
private static class DistanceScoreDocLookupComparator implements ScoreDocComparator {
private float[] distances; // 保存每個(gè)餐館到指定點(diǎn)的距離
// 構(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(); // 取出每一個(gè)Term
if (term.field() != fieldname) // 與給定的域不符合則比較下一個(gè)
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;
// 計(jì)算距離
distances[termDocs.doc()] = (float) Math.sqrt(deltax * deltax + deltay * deltay);
}
}
while (enumerator.next());
} finally {
termDocs.close();
}
}
}
//有上面的構(gòu)造函數(shù)的準(zhǔn)備 這里就比較簡(jiǎ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;
//實(shí)現(xiàn)了搜索距你最近的餐館的名字. 餐館坐標(biāo)用字符串"x,y"來存儲(chǔ)
//DistanceComparatorSource 實(shí)現(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 用來實(shí)現(xiàn)排序功能
    public ScoreDocComparator newComparator(IndexReader reader, String fieldname) throws IOException {
        return new DistanceScoreDocLookupComparator(reader, fieldname, x, y);
    }

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

        // 構(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(); // 取出每一個(gè)Term
                        if (term.field() != fieldname) // 與給定的域不符合則比較下一個(gè)
                            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;
                            // 計(jì)算距離
                            distances[termDocs.doc()] = (float) Math.sqrt(deltax * deltax + deltay * deltay);
                        }
                    }
                    while (enumerator.next());
                } finally {
                    termDocs.close();
                }
            }
        }
        //有上面的構(gòu)造函數(shù)的準(zhǔn)備 這里就比較簡(jiǎ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 + ")";
    }
}
這是一個(gè)實(shí)現(xiàn)了上面兩個(gè)接口的兩個(gè)類, 里面帶有詳細(xì)注釋, 可以看出 自定義排序并不是很難的. 該實(shí)現(xiàn)能否正確實(shí)現(xiàn),我們來看看測(cè)試代碼能否通過吧.
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;
//建立測(cè)試環(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)造一個(gè)SortField
Sort sort = new Sort(new SortField("location", new DistanceComparatorSource(0, 0)));
Hits hits = searcher.search(query, sort); // 搜索
//測(cè)試
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
//上面的測(cè)試實(shí)現(xiàn)了自定義排序,但是并不能訪問自定義排序的更詳細(xì)信息,利用
//TopFieldDocs 可以進(jìn)一步訪問相關(guān)信息
TopFieldDocs docs = searcher.search(query, null, 3, sort);
assertEquals(4, docs.totalHits);
assertEquals(3, docs.scoreDocs.length);
//取得FieldDoc 利用FieldDoc可以取得關(guān)于排序的更詳細(xì)信息 請(qǐng)查看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集合中的某個(gè)對(duì)象屬性進(jìn)行排序的實(shí)現(xiàn)代碼
  • Java ArrayList的不同排序方法
  • java教程之二個(gè)arraylist排序的示例分享
  • java對(duì)ArrayList排序代碼示例
  • java實(shí)現(xiàn)ArrayList根據(jù)存儲(chǔ)對(duì)象排序功能示例
  • java中實(shí)現(xiàn)Comparable接口實(shí)現(xiàn)自定義排序的示例
  • Java Collections.sort()實(shí)現(xiàn)List排序的默認(rèn)方法和自定義方法
  • Java針對(duì)ArrayList自定義排序的2種實(shí)現(xiàn)方法

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《java Lucene 中自定義排序的實(shí)現(xiàn)》,本文關(guān)鍵詞  java,Lucene,中,自定義,排序,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《java Lucene 中自定義排序的實(shí)現(xiàn)》相關(guān)的同類信息!
  • 本頁收集關(guān)于java Lucene 中自定義排序的實(shí)現(xiàn)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    欧美日韩一级片在线观看| 亚瑟在线精品视频| 日韩一级视频免费观看在线| 在线欧美日韩国产| 色狠狠色噜噜噜综合网| 99精品国产热久久91蜜凸| 成人午夜激情影院| 国产成人精品免费网站| 国产伦精一区二区三区| 国产一区二区女| 国产精品久久久久一区二区三区共 | 亚洲乱码国产乱码精品精的特点| 久久久青草青青国产亚洲免观| 久久婷婷色综合| 国产日韩欧美激情| 国产精品成人网| 国产v综合v亚洲欧| 一区二区三区四区激情| 亚洲综合成人网| 日韩精品乱码免费| 激情综合五月天| 成人激情午夜影院| 色先锋久久av资源部| 欧美亚男人的天堂| 欧美一卡2卡3卡4卡| 久久久另类综合| 国产精品久久久久婷婷| 成人综合婷婷国产精品久久蜜臀| 欧美国产日韩亚洲一区| 中文字幕一区二区三区视频| 亚洲男女一区二区三区| 视频在线在亚洲| 国产亚洲一区二区三区四区| 中文字幕乱码久久午夜不卡| 亚洲卡通动漫在线| 日韩高清不卡在线| 国产高清精品久久久久| 日本久久一区二区三区| 欧美二区乱c少妇| 久久理论电影网| 欧美中文字幕久久| 国产精品白丝av| 91社区在线播放| 一本一道综合狠狠老| 亚洲综合色在线| www国产成人| 视频一区国产视频| 国产高清不卡一区| 欧美高清hd18日本| 国产日韩欧美综合一区| 一卡二卡三卡日韩欧美| 91精品国产综合久久精品app | 亚洲一区在线观看免费观看电影高清 | 久久综合精品国产一区二区三区| 精品三级av在线| 毛片基地黄久久久久久天堂| 日韩vs国产vs欧美| 国产99久久久久| 欧美日韩亚州综合| 国产亚洲欧洲997久久综合| 亚洲精品国久久99热| 久久99在线观看| 欧美在线一区二区三区| 国产欧美一区二区三区鸳鸯浴| 亚洲电影中文字幕在线观看| 国产成人精品亚洲午夜麻豆| 91精品婷婷国产综合久久| 中文字幕一区三区| 久久成人免费日本黄色| 在线观看精品一区| 91亚洲精品久久久蜜桃网站| 精品国内片67194| 亚洲一区二区三区中文字幕 | 亚洲欧美日韩成人高清在线一区| 一区二区三区欧美日韩| 国内成+人亚洲+欧美+综合在线| 色婷婷综合久久久中文字幕| 欧美va亚洲va在线观看蝴蝶网| 国产91精品免费| 国产精品12区| 欧美一级国产精品| 亚洲综合久久久| 成人免费视频免费观看| 欧美tk—视频vk| 亚洲图片欧美色图| 成人黄色在线视频| 久久亚洲免费视频| 美国av一区二区| 日韩视频一区二区三区| 久久99精品久久久久久国产越南| 欧美男生操女生| 日韩欧美国产一二三区| 日韩亚洲电影在线| 久久综合久色欧美综合狠狠| 亚洲五月六月丁香激情| 欧美大尺度电影在线| 欧美亚洲日本国产| 欧美日韩一区在线观看| 久久久精品日韩欧美| 91精品久久久久久久91蜜桃| 成人小视频在线| 久久精品国产99久久6| 亚洲成人综合视频| 一区二区三区四区高清精品免费观看| 一区二区三区日韩| 久久久亚洲国产美女国产盗摄| 97se亚洲国产综合自在线| 三级一区在线视频先锋| 亚洲美女区一区| 国产女主播在线一区二区| 欧美日韩大陆在线| 色噜噜久久综合| 99久久国产综合色|国产精品| 久久66热偷产精品| 欧美酷刑日本凌虐凌虐| 日韩女优制服丝袜电影| 亚洲愉拍自拍另类高清精品| 亚洲aaa精品| 91色婷婷久久久久合中文| 极品少妇xxxx偷拍精品少妇| av在线不卡网| www.66久久| 欧洲中文字幕精品| 欧洲精品在线观看| 国产免费成人在线视频| 亚洲欧洲日产国码二区| 色哟哟精品一区| 无吗不卡中文字幕| 91精品国产高清一区二区三区 | 中文字幕一区二区5566日韩| 久久国产精品72免费观看| 精品国产乱码久久久久久闺蜜| 国产在线精品一区在线观看麻豆| 国产日韩三级在线| 在线一区二区观看| 秋霞影院一区二区| 久久精品一区蜜桃臀影院| 成人av一区二区三区| 一区二区三区四区精品在线视频| 欧美一二三在线| 成人网页在线观看| 亚洲一二三四区| 久久综合视频网| 亚洲国产成人高清精品| 欧美sm美女调教| 91网站最新地址| 免费成人在线视频观看| 国产精品乱码一区二区三区软件 | 国产一区二区剧情av在线| 免费看精品久久片| 成人18视频在线播放| 亚洲国产日韩一区二区| 久久综合中文字幕| 亚洲男人都懂的| 欧美自拍偷拍一区| 国产又粗又猛又爽又黄91精品| 一区视频在线播放| 日韩欧美国产三级| 日本伦理一区二区| 国产传媒久久文化传媒| 亚洲成人激情av| 国产精品无人区| 欧美精品 日韩| 99麻豆久久久国产精品免费优播| 日本中文一区二区三区| 国产精品国产三级国产a| 日韩午夜av一区| 一本大道久久a久久综合婷婷| 麻豆91在线观看| 亚洲美女少妇撒尿| 日本一区二区三区国色天香| 欧美日产国产精品| 99久久亚洲一区二区三区青草| 久久精品国产精品亚洲综合| 一区二区视频免费在线观看| 色偷偷成人一区二区三区91| 国产一区二区不卡在线| 午夜视频在线观看一区| 自拍偷拍亚洲激情| 久久久久久久久蜜桃| 91麻豆精品国产无毒不卡在线观看| 97精品久久久久中文字幕| 国产一区二区三区国产| 免费观看在线色综合| 午夜精品久久久久久久久久| 日韩美女久久久| 国产欧美一区在线| 日韩精品一区二区三区三区免费| 色噜噜狠狠色综合欧洲selulu| 日韩免费电影一区| 欧美日韩在线三级| 色综合天天综合给合国产| 高清不卡一二三区| 国产精品一区二区在线观看网站| 美腿丝袜亚洲三区| 成人a区在线观看| 国产真实乱偷精品视频免| 日本亚洲三级在线| 日韩制服丝袜av| 天天操天天干天天综合网|