精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring Boot + Elasticsearch 快速整合指南

開(kāi)發(fā) 前端
倒排索引是整個(gè)Elasticsearch的核心,正常的搜索以一本書為例,應(yīng)該是由目錄 -> 章節(jié) -> 頁(yè)碼 -> 內(nèi)容這樣的查找順序,這樣是正排索引的思想。

引言

Elasticsearch作為高性能的分布式搜索引擎,在現(xiàn)代應(yīng)用開(kāi)發(fā)中被廣泛使用。具有如下特點(diǎn):

  • 一個(gè)分布式的實(shí)時(shí)文檔存儲(chǔ)引擎,每個(gè)字段都可以被索引與搜索。
  • 一個(gè)分布式實(shí)時(shí)分析搜索引擎,支持各種查詢和聚合操作。
  • 能勝任上百個(gè)服務(wù)節(jié)點(diǎn)的擴(kuò)展,并可以支持PB級(jí)別的結(jié)構(gòu)化或者非結(jié)構(gòu)化數(shù)據(jù)。

倒排索引

倒排索引是整個(gè)Elasticsearch的核心,正常的搜索以一本書為例,應(yīng)該是由目錄 -> 章節(jié) -> 頁(yè)碼 -> 內(nèi)容這樣的查找順序,這樣是正排索引的思想。

但是設(shè)想一下,我在一本書中快速查找elasticsearch這個(gè)關(guān)鍵字所在的頁(yè)面該怎么辦?

倒排索引的思路是通過(guò)單詞到文檔ID的關(guān)系對(duì)應(yīng)。

圖片圖片

本文將詳細(xì)介紹通過(guò)ElasticsearchRepository和ElasticsearchRestTemplate兩種方式實(shí)現(xiàn)整合的方法。

案例

使用 ElasticsearchRepository

ElasticsearchRepository是Spring Data提供的接口,通過(guò)繼承該接口,可快速實(shí)現(xiàn)基本的CRUD操作,極大地簡(jiǎn)化了開(kāi)發(fā)流程。

1. 創(chuàng)建Repository接口:繼承ElasticsearchRepository,并指定實(shí)體類和主鍵類型,還可自定義查詢方法。

public interface DemoRepository extends ElasticsearchRepository<Demo, String> {
    // 自定義查詢方法
    List<Demo> findByImsi(String imsi);

    // 使用@Query注解定義DSL查詢
    @Query("{\"bool\": {\"must\": [{\"match\": {\"imsi\": \"?0\"}}], \"filter\": {\"range\": {\"costTime\": {\"gte\": ?1, \"lte\": ?2}}}}}")
    List<Demo> findByImsiAndPriceRange(String imsi, double min, double max);

}

2. 服務(wù)層實(shí)現(xiàn):在服務(wù)類中注入Repository,調(diào)用其方法完成數(shù)據(jù)操作。

@Service
public class DemoService {

    @Autowired
    private DemoRepository demoRepository;

    public Demo save(Demo demo) {
        return demoRepository.save(demo);
    }

    public Optional<Demo> findById(String id) {
        return demoRepository.findById(id);
    }

    public List<Demo> findByName(String imsi) {
        return demoRepository.findByImsi(imsi);
    }

    public Iterable<Demo> findAll() {
        return demoRepository.findAll();
    }

    public void delete(Demo demo) {
        demoRepository.delete(demo);
    }
    public List<Demo> findByImsiAndPriceRange(String imsi, double min, double max) {
        return demoRepository.findByImsiAndPriceRange(imsi, min, max);
    }
}

使用 ElasticsearchRestTemplate

1. 配置ElasticsearchRestTemplate

@Configuration
public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
    @Value("${spring.elasticsearch.uris: localhost:9200}")
    private String[] uris;


    @Bean(name = { "elasticsearchOperations", "elasticsearchRestTemplate" })
    public ElasticsearchRestTemplate elasticsearchTemplate() {
        return new ElasticsearchRestTemplate(elasticsearchClient());
    }

    @Override
    public RestHighLevelClient elasticsearchClient() {
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("username", "password"));
        HttpHost[] httpHosts = Arrays.stream(uris).map(HttpHost::create).toArray(HttpHost[]::new);
        RestClientBuilder restClientBuilder = RestClient.builder(httpHosts)
                .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
        return new RestHighLevelClient(restClientBuilder);
    }
}

2. 服務(wù)層實(shí)現(xiàn):在服務(wù)類中注入ElasticsearchRestTemplate,通過(guò)構(gòu)建查詢條件實(shí)現(xiàn)各種數(shù)據(jù)操作。

@Service
public class DslQueryService {

    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    // 1. 基本Match查詢
    public List<Demo> searchByKeyword(String keyword) {
        NativeSearchQuery query = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.matchQuery("imsi", keyword))
                .build();

        SearchHits<Demo> searchHits = elasticsearchRestTemplate.search(query, Demo.class);
        return searchHits.getSearchHits().stream()
                .map(SearchHit::getContent)
                .collect(Collectors.toList());
    }

    // 2. 組合Bool查詢
    public List<Demo> complexSearch(String imsi, Double min, Double max, String desc) {
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

        if (imsi != null &&!imsi.isEmpty()) {
            boolQuery.must(QueryBuilders.matchQuery("imsi", imsi));
        }

        if (min != null && max != null) {
            boolQuery.filter(QueryBuilders.rangeQuery("costTime").gte(min).lte(max));
        }

        if (desc != null &&!desc.isEmpty()) {
            boolQuery.filter(QueryBuilders.termQuery("desc", desc));
        }

        NativeSearchQuery query = new NativeSearchQueryBuilder()
                .withQuery(boolQuery)
                .withPageable(PageRequest.of(0, 20))
                .build();

        SearchHits<Demo> searchHits = elasticsearchRestTemplate.search(query, Demo.class);
        return searchHits.getSearchHits().stream()
                .map(SearchHit::getContent)
                .collect(Collectors.toList());
    }

    // 3. 聚合查詢示例
    public void getCategoryCounts() {
        SearchRequest searchRequest = new SearchRequest("demo");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(QueryBuilders.termsQuery("imsi", "test","000","1"));

        searchSourceBuilder.query(boolQueryBuilder);
        searchSourceBuilder.size(0);
        searchSourceBuilder.trackTotalHits(true);

        Script scriptGroup = new Script("doc['imsi'].value");
        TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("by_imsi").script(scriptGroup).size(10);
        termsAggregationBuilder.subAggregation(AggregationBuilders.sum("sumTime").field("costTime"));

//        Map<String, String> bucketsPathsMap = new HashMap<>();
//        bucketsPathsMap.put("sumTime", "sumTime");
//        BucketSelectorPipelineAggregationBuilder selectorPipelineAggregationBuilder = PipelineAggregatorBuilders
//                .bucketSelector("having_count", bucketsPathsMap, new Script("params.sumTime<10000"));
//        termsAggregationBuilder.subAggregation(selectorPipelineAggregationBuilder);

        TopHitsAggregationBuilder topHit = new TopHitsAggregationBuilder("top_result").size(10);
        termsAggregationBuilder.subAggregation(topHit);

        searchSourceBuilder.aggregation(termsAggregationBuilder);

        searchRequest.source(searchSourceBuilder);

        SearchResponse searchResponse = elasticsearchRestTemplate.execute(client  -> {
            return client.search(searchRequest, RequestOptions.DEFAULT);
        });
        Terms terms = (Terms) searchResponse.getAggregations().get("by_imsi");
        for(Terms.Bucket bucket : terms.getBuckets()) {
            Aggregations aggregations = bucket.getAggregations();
            Sum sum = aggregations.get("sumTime");
            System.out.println(bucket.getKeyAsString()+":"+bucket.getDocCount()+":"+sum.getValueAsString());
        }


    }


    // 4. 滾動(dòng)查詢示例
    public List<Demo> scrollSearch(String scrollId, int pageSize) {
        SearchScrollHits<Demo> searchScrollHits;
        if (scrollId == null) {
            NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
                    .withQuery(QueryBuilders.matchAllQuery())
                    .withPageable(PageRequest.of(0, pageSize))
                    .build();
            searchScrollHits = elasticsearchRestTemplate.searchScrollStart(30000L, searchQuery, Demo.class, IndexCoordinates.of("demo"));
        } else {
            searchScrollHits = elasticsearchRestTemplate.searchScrollContinue(scrollId, 30000L, Demo.class, IndexCoordinates.of("demo"));
        }
        elasticsearchRestTemplate.searchScrollClear(Collections.singletonList(searchScrollHits.getScrollId()));
        return searchScrollHits.getSearchHits().stream()
                .map(SearchHit::getContent)
                .collect(Collectors.toList());
    }
}

測(cè)試方法

@Slf4j
@SpringBootTest
public class TestDemo {

    @Autowired
    private DemoService demoService;

    @Autowired
    private DslQueryService dslQueryService;

    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;


    @Test
    public void test1(){
        demoService.findById("vkwztJMBXiMbcxs-8Npt").ifPresent(demo -> log.info(demo.toString()));
    }

    @Test
    public void test2(){
        demoService.findByImsiAndPriceRange("test", 0.0, 50.0).forEach(demo -> log.info(demo.toString()));
    }

    @Test
    public void test3(){
        dslQueryService.searchByKeyword("test").forEach(demo -> log.info(demo.toString()));
    }

    @Test
    public void test4(){
        dslQueryService.getCategoryCounts();
    }

    @Test
    public void test5(){
        dslQueryService.scrollSearch(null, 10).forEach(demo -> log.info(demo.toString()));
    }

    @Test
    public void test6(){
        Boolean flag = elasticsearchRestTemplate.indexOps(Demo.class).exists();
        if (flag == false) {
            log.info(" createIndex.......");
            elasticsearchRestTemplate.indexOps(Demo.class).create();
            elasticsearchRestTemplate.indexOps(Demo.class).putMapping(Demo.class);
        } else {
            String indexName = elasticsearchRestTemplate.getIndexCoordinatesFor(Demo.class).getIndexName();
            log.info(" refreshIndex......");
            refreshAsync(indexName);
        }
    }
    @Test
    public void test7(){
        List list = new ArrayList();
        Demo bean = new Demo("test", "test", "test", "test", "test", 1L);
        IndexQuery indexQuery = new IndexQueryBuilder().withSource(JSONObject.toJSONString(bean)).build();
        list.add(indexQuery);
        elasticsearchRestTemplate.bulkIndex(list, Demo.class);

    }


    public void refreshAsync(String index) {
        try {
            elasticsearchRestTemplate.execute(client -> client.indices().refreshAsync(refreshRequest(index), RequestOptions.DEFAULT, new ActionListener<RefreshResponse>() {
                @Override
                public void onResponse(RefreshResponse refreshResponse) {
                }
                @Override
                public void onFailure(Exception e) {
                    log.info("failed callback to refresh index={},exception--->{}" + index, e);
                }
            }));
        } catch (Exception e) {
            log.info("failed to refresh index={},exception--->{}" + index, e);
        }
    }
}

復(fù)制聚合場(chǎng)景

  • 使用嵌套的terms聚合實(shí)現(xiàn)三級(jí)分組:時(shí)間、域和 IMSI
  • 對(duì)每個(gè)分組添加計(jì)數(shù)聚合,計(jì)算總數(shù)和失敗數(shù)
  • 使用filter聚合篩選失敗記錄(resulCode 不為 "0000")
// 構(gòu)建基礎(chǔ)查詢條件
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();

        // 時(shí)間范圍條件
        String startTime = jsonParam.getString("startTime");
        String endTime = jsonParam.getString("endTime");
        if (!StringUtils.isEmpty(startTime) && !StringUtils.isEmpty(endTime)) {
            startTime = startTime + ":00";
            endTime = endTime + ":59";
            boolQueryBuilder.must(QueryBuilders.rangeQuery("rtime").gte(startTime).lte(endTime));
        }

        // 數(shù)據(jù)域權(quán)限條件
        List<String> vpndomains = CommonTools.strList(perms);
        if (CollectionUtils.isNotEmpty(vpndomains)) {
            boolQueryBuilder.must(QueryBuilders.termsQuery("vpdndomain", vpndomains));
        }

        // 數(shù)據(jù)源類型條件
        if (!StringUtils.isEmpty(publicPerms) && publicPerms.contains("oldora")) {
            boolQueryBuilder.must(QueryBuilders.matchQuery("sourceType", 4)); 
        } else {
            boolQueryBuilder.must(QueryBuilders.matchQuery("sourceType", 1)); 
        }

        // 構(gòu)建聚合查詢
        NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(boolQueryBuilder)
                // 使用date_histogram聚合按分鐘分組
                .addAggregation(
                        AggregationBuilders.dateHistogram("by_minute")
                                .field("rtime")
                                .fixedInterval(DateHistogramInterval.MINUTE)
                                .format("yyyy-MM-dd HH:mm")
                                .subAggregation(
                                        AggregationBuilders.terms("by_domain")
                                                .field("vpdndomain")
                                                .subAggregation(
                                                        AggregationBuilders.terms("by_imsi")
                                                                .field("imsi")
                                                                .subAggregation(
                                                                        // 統(tǒng)計(jì)總數(shù)
                                                                        AggregationBuilders.count("total_count").field("_index")
                                                                )
                                                                .subAggregation(
                                                                        // 統(tǒng)計(jì)失敗數(shù)
                                                                        AggregationBuilders.filter("fail_count",QueryBuilders.boolQuery()
                                                                                .mustNot(QueryBuilders.termQuery("resulCode", "0000")))
                                                                )
                                                )
                                )
                )
                .build();

        // 執(zhí)行查詢
        SearchHits<Authlog> searchHits = elasticsearchRestTemplate.search(searchQuery, Authlog.class, IndexCoordinates.of(authlog_index_name));

        // 處理聚合結(jié)果
        List<Map> statsList = new ArrayList<>();
        Integer overLimitCount = jsonParam.getInteger("overLimitCount");

        Histogram timeTerms = searchHits.getAggregations().get("by_minute");
        if (timeTerms != null) {
            for (Histogram.Bucket timeBucket : timeTerms.getBuckets()) {
                String rtime = timeBucket.getKeyAsString();

                Terms domainTerms = timeBucket.getAggregations().get("by_domain");
                for (Terms.Bucket domainBucket : domainTerms.getBuckets()) {
                    String vpdndomain = domainBucket.getKeyAsString();

                    Terms imsiTerms = domainBucket.getAggregations().get("by_imsi");
                    for (Terms.Bucket imsiBucket : imsiTerms.getBuckets()) {
                        String imsi = imsiBucket.getKeyAsString();

                        // 獲取總數(shù)
                        ValueCount totalCount = imsiBucket.getAggregations().get("total_count");
                        long total = totalCount.getValue();

                        // 跳過(guò)不滿足閾值的記錄
                        if (total < overLimitCount) continue;

                        // 獲取失敗數(shù)
                        Filter failCount = imsiBucket.getAggregations().get("fail_count");
                        long fail = failCount.getDocCount();

                        // 構(gòu)建結(jié)果
                        Map<Object, Object> result = MapUtil.builder()
                                .put("rtime", rtime)
                                .put("vpdndomain", vpdndomain)
                                .put("imsi", imsi)
                                .put("total", total)
                                .put("fail", fail)
                                .map();
                        statsList.add(result);
                    }
                }
            }
        }

在實(shí)際項(xiàng)目中,可根據(jù)需求靈活選擇:

  • 對(duì)于簡(jiǎn)單的CRUD操作和基礎(chǔ)查詢,優(yōu)先選擇ElasticsearchRepository,其簡(jiǎn)潔的代碼結(jié)構(gòu)能快速完成開(kāi)發(fā)。
  • 若涉及復(fù)雜的查詢邏輯、聚合分析或自定義操作,ElasticsearchRestTemplate更能滿足需求,開(kāi)發(fā)者可通過(guò)構(gòu)建DSL實(shí)現(xiàn)強(qiáng)大的搜索功能。
責(zé)任編輯:武曉燕 來(lái)源: 一安未來(lái)
相關(guān)推薦

2025-05-09 07:20:02

Spring數(shù)據(jù)庫(kù)檢索

2022-07-21 11:04:53

Swagger3Spring

2024-11-11 10:02:37

Spring搜索數(shù)據(jù)

2017-05-19 14:47:24

Spring Boot Elasticsea場(chǎng)景

2020-11-17 08:43:20

ElasticSear

2022-12-23 08:28:42

策略模式算法

2022-07-11 09:36:38

SpringJava開(kāi)發(fā)

2017-04-17 10:35:40

Spring BooRedis 操作

2017-10-17 15:14:33

Spring BooThymeleafWeb

2022-06-28 15:04:32

容器Docker

2022-06-28 15:06:35

容器Spring

2025-08-15 07:39:11

2020-07-14 11:00:12

Spring BootRedisJava

2024-09-27 08:25:47

2020-09-02 17:28:26

Spring Boot Redis集成

2022-03-07 09:00:00

HTTPS證書中間件

2025-10-13 07:56:07

2020-12-01 08:32:12

Spring Boot

2025-06-27 02:44:00

2024-03-26 08:08:08

SpringBPMN模型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

www.4hu95.com四虎| 青青草视频在线免费播放 | 成人在线国产| 制服丝袜中文字幕亚洲| 污污污污污污www网站免费| 亚洲av激情无码专区在线播放| 久久在线精品| 日韩中文字幕精品| v天堂中文在线| 精品三级在线| 五月天激情综合| 中文字幕久久一区| 日韩大片b站免费观看直播| 麻豆精品视频在线观看视频| 欧美激情xxxxx| 人人爽人人爽人人片| 视频一区中文字幕精品| 在线观看欧美日本| 99热亚洲精品| 米奇777四色精品人人爽| 99久久综合国产精品| 国产精品综合不卡av| 久久久精品人妻一区二区三区四| 美日韩中文字幕| 日韩欧美卡一卡二| 色戒在线免费观看| 精品捆绑调教一区二区三区| 亚洲日本一区二区三区| 日本一区二区三区视频在线观看| 亚洲精品国产精品乱码不卡| 美女视频黄久久| 欧美整片在线观看| 国产精品第二十页| 欧美黄色大片网站| 久久九九免费视频| 极品久久久久久久| 香蕉久久99| 亚洲精品国偷自产在线99热| 少妇欧美激情一区二区三区| 色综合天天色| 色婷婷av一区二区三区之一色屋| 国产精品videossex国产高清| 麻豆91在线| 国产精品欧美极品| 亚洲一区二区三区加勒比| 国产午夜精品一区理论片| 91亚洲男人天堂| 国产女人水真多18毛片18精品 | 免费国产羞羞网站美图| 欧美日韩有码| 国产亚洲精品久久久优势| 国产色视频一区二区三区qq号| 精品精品精品| 亚洲国产成人精品久久| 亚洲无人区码一码二码三码| 日韩精品一区国产| 日韩欧美国产不卡| 国产在线视频三区| 秋霞影院一区| 欧美videos大乳护士334| 男人添女人荫蒂国产| 亚洲高清在线一区| 欧美白人最猛性xxxxx69交| 又黄又爽又色的视频| 日韩精品中文字幕吗一区二区| 欧美一区二区三区视频| 国产精品偷伦视频免费观看了| 亚洲va欧美va人人爽成人影院| 日韩欧美高清一区| 国模无码视频一区| 天堂综合网久久| 亚洲美女av黄| 内射毛片内射国产夫妻| 婷婷久久国产对白刺激五月99| 日韩在线视频导航| 国产性xxxx| 亚洲国产99| 国产成人精品999| 在线观看免费高清视频| 国产毛片精品视频| 国产亚洲二区| 国产综合在线观看| 日韩美女精品在线| 欧美乱大交xxxxx潮喷l头像| 精品国产第一福利网站| 欧美日韩免费一区二区三区视频| 中文字幕av一区二区三区人妻少妇| 日韩区欧美区| 亚洲欧美一区二区三区四区 | 欧美极品在线观看| 日韩在线资源网| 久久老司机精品视频| 国产亚洲精品v| 国产精品久久久久久av下载红粉| 国产99久久九九精品无码免费| 成人sese在线| 视频在线观看成人| 欧美videossex| 色系网站成人免费| 1314成人网| 中国av一区| 久久亚洲影音av资源网| 99久热在线精品996热是什么| 蜜臀av一级做a爰片久久| av一区二区三区免费| 毛片在线能看| 亚洲卡通欧美制服中文| 国内外免费激情视频| 玖玖精品一区| 亚洲欧美一区二区三区情侣bbw| 国产乱国产乱老熟300| 欧美亚洲一区二区三区| 51国产成人精品午夜福中文下载| 国产在线电影| 亚洲成av人片一区二区梦乃| 久久久久久久久久一区二区| 欧美绝顶高潮抽搐喷水合集| 久久av中文字幕| 精品黑人一区二区三区| 成人免费视频视频| 成年人三级视频| 小明成人免费视频一区| 日韩av在线免费观看| 综合五月激情网| 日本免费新一区视频| 久久99久久99精品蜜柚传媒| 美女航空一级毛片在线播放| 欧美日韩一区中文字幕| 亚洲天堂资源在线| 欧美激情五月| 成人精品一区二区三区| 国产1区2区3区在线| 狠狠躁夜夜躁人人爽天天天天97| a级大片免费看| 天天av综合| 国产欧美一区二区三区在线看| 日本一级在线观看| 亚洲成av人在线观看| 中文字幕亚洲日本| 91精品蜜臀一区二区三区在线| 国产精品久久久久9999| 欧美一区二区少妇| 欧美性极品xxxx娇小| 精品视频站长推荐| 亚洲久久一区| 国产伦理一区二区三区| 欧美黄色视屏| 日韩免费视频线观看| 国产高潮国产高潮久久久91| 国产在线视频精品一区| 中文字幕一区综合| crdy在线观看欧美| 久久av.com| 亚洲精品网站在线| 亚洲一区成人在线| 欧亚乱熟女一区二区在线| 亚洲国产精品一区制服丝袜| 国产尤物99| 日韩欧美一中文字暮专区| 亚洲精品久久视频| 日本午夜视频在线观看| 久久一区二区三区国产精品| 日本成人在线免费视频| 日韩精品免费| 51成人做爰www免费看网站| 青青草视频在线免费直播| 精品国产区一区| 精品成人久久久| 久久先锋资源网| 国产一级做a爰片久久| 欧美成人直播| 成人毛片网站| 色偷偷偷在线视频播放| 国产午夜精品全部视频播放 | 日韩专区欧美专区| 亚洲一区二三| 日韩欧美中文在线观看| 97精品在线观看| 免费播放片a高清在线观看| 欧美性欧美巨大黑白大战| 免费在线观看a级片| 成a人片国产精品| 国产天堂在线播放| 欧美aⅴ99久久黑人专区| 国产一区二区免费在线观看| 99热播精品免费| 欧美巨大黑人极品精男| 午夜黄色小视频| 欧美日韩精品免费观看视频| 麻豆成人在线视频| 久久精品夜色噜噜亚洲a∨| 三区视频在线观看| 性8sex亚洲区入口| 综合一区中文字幕| 伦理一区二区三区| 国产欧美最新羞羞视频在线观看| 国产乱码在线| 国产亚洲一级高清| 亚洲精品国产一区二| 在线观看日韩国产| 日本少妇xxxx动漫| 1000精品久久久久久久久| 日本黄色动态图| 经典一区二区三区| 国产超级av在线| 亚洲精品网址| 欧美一区三区二区在线观看| 视频精品一区二区三区| 国产精品久久一区| 欧美办公室脚交xxxx| 久久久久北条麻妃免费看| 日韩大胆视频| 精品日产卡一卡二卡麻豆| 一级黄色在线观看| 精品久久久久久久久久| www.超碰在线观看| 国产精品免费视频一区| 亚洲天堂网一区二区| 国产精品一区二区果冻传媒| 国产福利影院在线观看| 日韩一级大片| 97碰在线视频| 亚洲h色精品| 日韩一区二区三区资源| 香蕉视频一区二区三区| 成人av中文| 色播一区二区| 91精品综合久久久久久五月天| 久久久一本精品| 5566日本婷婷色中文字幕97| 精品精品导航| 粗暴蹂躏中文一区二区三区| 婷婷视频在线| 在线午夜精品自拍| 国产毛片av在线| 亚洲欧美国产一区二区三区| 天天操天天射天天舔| 亚洲精品一区二区三区在线观看| 亚洲a视频在线| 日韩一区二区三区视频在线观看| 一级黄色短视频| 欧美日韩一卡二卡| 亚洲影视一区二区| 欧美主播一区二区三区| 中文区中文字幕免费看| 欧美性受xxxx| 中文字幕激情视频| 欧美中文字幕一区| 亚洲无码精品在线观看| 欧美性欧美巨大黑白大战| 中文在线最新版天堂| 欧美日韩极品在线观看一区| 国产成人精品亚洲| 欧美视频一区在线| 在线视频1卡二卡三卡| 欧美日韩精品欧美日韩精品一 | 日韩免费在线观看| 不卡av中文字幕| 亚洲成人av在线| 日本黄色一区二区三区| 日韩av最新在线观看| 亚洲欧美日韩精品永久在线| 亚洲精品一区二区网址| 九一在线视频| 在线色欧美三级视频| 一级毛片视频在线| 久久国产色av| ririsao久久精品一区| 51ⅴ精品国产91久久久久久| 九九热线视频只有这里最精品| 国产精品99免视看9| 大胆国模一区二区三区| 国产精品99久久久久久久| 日本国产精品| 亚洲精品国产精品国自产观看| 四虎成人av| 国产二区视频在线| 视频一区视频二区中文字幕| www.99r| 国产成人av影院| av网站有哪些| 亚洲欧洲日本在线| 日本午夜小视频| 在线观看亚洲专区| 朝桐光av在线一区二区三区| 日韩国产欧美区| 国产视频一区二区| 97在线视频免费播放| 99热播精品免费| 国产福利久久精品| av在线不卡免费观看| 无码人妻精品一区二区蜜桃百度| 一区二区三区高清视频在线观看| av在线无限看| 成人久久18免费网站麻豆| 91视频在线网站| 亚洲精品国产a| 成人小视频在线播放| 日韩一级二级三级| 第一页在线观看| 欧美丰满老妇厨房牲生活| 韩国美女久久| av一区二区三区四区电影| 日韩精品电影| 熟女少妇在线视频播放| 极品少妇xxxx偷拍精品少妇| 国产 中文 字幕 日韩 在线| 国产精品成人免费| 亚洲精品男人的天堂| 精品美女被调教视频大全网站| 北条麻妃在线| 欧美一区三区三区高中清蜜桃| 久久伊人影院| 一道精品一区二区三区| 久久av一区| av电影在线播放| 亚洲日本欧美天堂| 亚洲精品国产精品国自产网站按摩| 亚洲成人免费在线视频| 成人片在线看| 国产欧美精品在线| 欧美精品一区二区三区中文字幕| 精品少妇在线视频| 粉嫩aⅴ一区二区三区四区| 中文字幕求饶的少妇| 欧美亚洲国产bt| 国产在线视频网| 欧美与黑人午夜性猛交久久久| ccyy激情综合| 欧美一级爱爱视频| 极品尤物av久久免费看| 黄色国产在线播放| 色婷婷av一区二区三区大白胸| 桃花色综合影院| 韩国美女主播一区| 一区二区三区视频免费视频观看网站 | 99在线精品视频免费观看20| 视频直播国产精品| 日韩国产网站| 日本一区二区视频| 日韩高清不卡一区二区| 无码 人妻 在线 视频| 日本高清成人免费播放| 久久视频www| 国产成人精品av在线| 国产在线日韩精品| 人人爽人人av| 国产精品欧美精品| 亚洲一卡二卡在线| 日韩视频免费在线| 久久av网站| 青青草视频在线视频| 丰满白嫩尤物一区二区| 久久免费公开视频| 亚洲成人中文字幕| 在线最新版中文在线| 欧美系列一区| 美女视频一区在线观看| 任我爽在线视频| 日韩欧美中文字幕制服| 波多野结衣中文字幕久久| 国产麻豆日韩| 首页国产欧美久久| 国产精品免费在线视频| 日韩一区二区三区视频在线| 不卡一本毛片| 蜜桃导航-精品导航| 日韩av成人高清| 视频国产一区二区| 亚洲精品一线二线三线| 偷拍视频一区二区三区| 亚洲精品高清国产一线久久| 国产在线一区二区综合免费视频| 精品亚洲永久免费| 亚洲欧美在线一区二区| 日韩电影免费观看高清完整版在线观看| 中国老女人av| 99精品国产热久久91蜜凸| 免费黄色片视频| 久热爱精品视频线路一| 国产精品久久久网站| 蜜桃免费在线视频| 一级日本不卡的影视| 国产综合在线观看| 亚洲精品欧美日韩专区| 亚洲免费影视| 国产探花在线视频| 亚洲国产中文字幕久久网| 99久久久国产精品免费调教网站 | fc2ppv国产精品久久| 精品国产乱码久久久久| 捆绑调教一区二区三区| 国产在线一区视频| 这里只有视频精品| 精品三级av在线导航| 男人的天堂最新网址| 欧美性高潮在线| 久久香蕉av| 亚洲精品一区二区三区四区五区| 丁香激情综合五月|