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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

ElasticSearch初体验之使用Java进行最基本的增删改查

發(fā)布時(shí)間:2023/12/10 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ElasticSearch初体验之使用Java进行最基本的增删改查 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

好久沒寫博文了, 最近項(xiàng)目中使用到了ElaticSearch相關(guān)的一些內(nèi)容, 剛好自己也來做個(gè)總結(jié)。
現(xiàn)在自己也只能算得上入門, 總結(jié)下自己在工作中使用Java操作ES的一些小經(jīng)驗(yàn)吧。

本文總共分為三個(gè)部分:
一:ES相關(guān)基本概念及原理
二:ES使用場(chǎng)景介紹
三:使用Java進(jìn)行ES的增刪改查及代碼講解

一:ES相關(guān)基本概念:
ElasticSearch(簡(jiǎn)稱ES)是一個(gè)基于Lucene構(gòu)建的開源、分布式、RESTful的全文本搜索引擎。

不過,ElasticSearch卻也不僅只是一個(gè)全文本搜索引擎,它還是一個(gè)分布式實(shí)時(shí)文檔存儲(chǔ),其中每個(gè)field均是被索引的數(shù)據(jù)且可被搜索;也是一個(gè)帶實(shí)時(shí)分析功能的分布式搜索引擎,并且能夠擴(kuò)展至數(shù)以百計(jì)的服務(wù)器存儲(chǔ)及處理PB級(jí)的數(shù)據(jù)。

如前所述,ElasticSearch在底層利用Lucene完成其索引功能,因此其許多基本概念源于Lucene。
我們先說說ES的基本概念。

  • 索引 Index:對(duì)數(shù)據(jù)的邏輯存儲(chǔ)(倒排索引),不存儲(chǔ)原
    始值。
  • 類型 Type:對(duì)索引的邏輯分類,可以有?個(gè)或多個(gè)分類。
  • ?檔 Document:基本數(shù)據(jù)單元,JSON。
  • 字段 Filed

關(guān)系型數(shù)據(jù)與ES對(duì)比:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields

這里再說下ES中很重要的概念--倒排索引。這同樣也是solr,lucene中所使用的索引方式。

例如我們正常的索引:

當(dāng)我們?cè)陉P(guān)系型數(shù)據(jù)庫中,都是有id索引的, 我們通過id去查value速度是很快的。
但是如果我們想查value中包含字母b的值呢?特別是數(shù)據(jù)量很大的時(shí)候, 這種以id為索引的方式是不是就不適合了?
那么這里就適合使用倒排索引了:

這里將value進(jìn)行分詞, 然后將分詞結(jié)果拿出來當(dāng)做索引
跟正向的索引比較,也就是做了一個(gè)倒置,這就是倒排索引的思想

二,ES使用場(chǎng)景介紹
1、全文搜索(搜索引擎)
在一組文檔中查找某一單詞所在文檔及位置
2、模糊匹配
通過用戶的輸入去匹配詞庫中符合條件的詞條
3、商品搜索
通過商品的關(guān)鍵字去數(shù)據(jù)源中查找符合條件的商品

在我自己的項(xiàng)目中使用的情況是我有上百萬的文章需要被通過各種條件檢索到, 所以這里就直接使用ES, 現(xiàn)在線上檢索速度都是10ms之內(nèi)返回。

下面看看ES數(shù)據(jù)在瀏覽器的展示形式以及可視化界面的搜索:

三:使用Java進(jìn)行ES的增刪改查及代碼講解
1, 使用ES進(jìn)行增加和更新操作。

//首先在項(xiàng)目啟動(dòng)的時(shí)候生成esClient, 這個(gè)我們公司自己封裝好了的。 @PostConstructpublic void init() {esClient = new ESClient<>(esConfig.getAddress(), esConfig.getCluster(), esConfig.getIndex(),esConfig.getUsername(), esConfig.getPassword(), ES_TYPE_MIXEDDATA, EsMixedDataDto.class);}

上面EsMixedDataDto是自己構(gòu)建的一個(gè)類, ES中保存的字段就是這個(gè)類中的所有字段。
接著是增加和更新操作了:

//同步到ES中 articleEsService.upsertDocument(esMixedDataDto);/** * 創(chuàng)建或更新索引 * * @param esMixedDataDto * @return */ public boolean upsertDocument(EsMixedDataDto esMixedDataDto) {return esClient.upsertDocument(esMixedDataDto.getMixId(), esMixedDataDto);}

這個(gè)還是調(diào)用了系統(tǒng)封裝好的esClient中的insertOrUpdate方法,最后我會(huì)把ESClient中所有封裝的方法都貼出來, 其內(nèi)部就是調(diào)用了ES原生的insert或者update方法的。

2,使用ES進(jìn)行刪除操作

/** * 刪除索引 */ public void deleteIndex(String id) throws Exception{esClient.deleteDocument(id); }

同上,也是使用了esClient中的delete方法,后面我會(huì)貼上esClient中所有方法。

3,使用ES進(jìn)行查詢
3.1 當(dāng)然ES最重要的還是多維度的查詢, 這里也是我要講的重點(diǎn)。
首先來個(gè)最簡(jiǎn)單的搜索一篇文章的標(biāo)題:

//通過關(guān)鍵詞來查詢文章集合 public PageResponse<EsMixedDataDto> queryForKeyword(String searchText, boolean highlight, PageRequest pageRequesto) {SearchRequestBuilder searchRequestBuilder = esClient.prepareSearch().setTypes(ES_TYPE_MIXEDDATA).setSearchType(SearchType.QUERY_THEN_FETCH).setQuery(QueryBuilders.multiMatchQuery(searchText, "title").type(MultiMatchQueryBuilder.Type.BEST_FIELDS)).setFrom(pageRequest.getOffset()).setSize(pageRequest.getLimit()).setExplain(false);if (highlight) {searchRequestBuilder.addHighlightedField("title", 100, 1).setHighlighterPreTags("<font color='red'>").setHighlighterPostTags("</font>");}try {//這里就是給es發(fā)送搜索指令了return getMixedData(searchRequestBuilder);} catch (Exception e) {log.error("ES搜索異常!", e.getMessage());throw new RuntimeException(e);} }

這里先說說search_type, 也就是上面setSearchType(SearchType.QUERY_THEN_FETCH)的內(nèi)容:

  • query_then_fetch:執(zhí)?查詢得到對(duì)?檔進(jìn)?排序的所需信息(在所
    有分?上執(zhí)?),然后在相關(guān)分?上查詢?檔實(shí)際內(nèi)容。返回結(jié)果的
    最?數(shù)量等于size參數(shù)的值。
  • query_and_fetch:查詢?cè)谒蟹?上并?執(zhí)?,所有分?返回等于
    size值的結(jié)果數(shù),最終返回結(jié)果的最?數(shù)量等于size的值乘以分?
    數(shù)。分?較多時(shí)會(huì)消耗過多資源。
  • count:只返回匹配查詢的?檔數(shù)量。
  • scan:?般在需要返回?量結(jié)果時(shí)使?。在發(fā)送第?次請(qǐng)求后,ES
    會(huì)返回?個(gè)滾動(dòng)標(biāo)識(shí)符,類似于數(shù)據(jù)庫中的游標(biāo)。

我這里使用的是query_then_fetch。

3.2 緊接著說個(gè)多條件復(fù)雜的查詢:

/** * @param jiaxiaoId: 駕校id * @param title 文章的title關(guān)鍵詞 * @param publishStatus 發(fā)布狀態(tài) * @param stickStatus 置頂狀態(tài) * @param pageRequest 請(qǐng)求的頁碼和條數(shù) * @param highlight 搜索結(jié)果是否高亮顯示 */ public PageResponse<EsMixedDataDto> queryByConditions(Long jiaxiaoId, String title, PageRequest pageRequest, int publishStatus, int stickStatus, boolean highlight) {BoolQueryBuilder booleanQueryBuilder = QueryBuilders.boolQuery();booleanQueryBuilder.must(QueryBuilders.termQuery("jiaxiaoId", jiaxiaoId));if (StringUtils.isNotBlank(title)) {booleanQueryBuilder.must(QueryBuilders.multiMatchQuery(title, "title").type(MultiMatchQueryBuilder.Type.BEST_FIELDS));}//這里是添加是否發(fā)布的搜索條件, 默認(rèn)是只展示已發(fā)布的文章if (publishStatus == CommonConstants.DataStatus.INIT_STATUS) {booleanQueryBuilder.must(QueryBuilders.termQuery("publishStatus", CommonConstants.DataStatus.INIT_STATUS));} else {booleanQueryBuilder.mustNot(QueryBuilders.termQuery("publishStatus", CommonConstants.DataStatus.INIT_STATUS));}//這里是添加是否置頂?shù)乃阉鳁l件if (stickStatus == CommonConstants.DataStatus.PUBLISH_STATUS) {booleanQueryBuilder.must(QueryBuilders.termQuery("stickStatus", CommonConstants.DataStatus.PUBLISH_STATUS));} else if(stickStatus == CommonConstants.DataStatus.INIT_STATUS){booleanQueryBuilder.mustNot(QueryBuilders.termQuery("stickStatus", CommonConstants.DataStatus.PUBLISH_STATUS));}SearchRequestBuilder searchRequestBuilder = esClient.prepareSearch().setTypes(ES_TYPE_MIXEDDATA).setSearchType(SearchType.QUERY_THEN_FETCH).setQuery(booleanQueryBuilder).setFrom(pageRequest.getOffset()).setSize(pageRequest.getLimit()).addSort("stickStatus", SortOrder.DESC).setExplain(false);if (jiaxiaoId == null) {BoolFilterBuilder filterBuilder = FilterBuilders.boolFilter().must(FilterBuilders.missingFilter("jiaxiaoId"));searchRequestBuilder.setPostFilter(filterBuilder);}if (highlight) {searchRequestBuilder.addHighlightedField("title", 100, 1).setHighlighterPreTags("<font color='red'>").setHighlighterPostTags("</font>");} else {searchRequestBuilder.addSort("publishTime", SortOrder.DESC);}try {return getMixedData(searchRequestBuilder);} catch (Exception e) {log.error("ES搜索異常!", e.getMessage());throw new RuntimeException(e);} }

這里不用的就是使用query和filterBuilder,searchRequestBuilder中可以設(shè)置query和postFilter。
Debug到這里, 其實(shí)寫的查詢語句最終還是拼接成了一個(gè)ES可讀的結(jié)構(gòu)化查詢語句:

3.3 最后貼上最重要的一個(gè)類ESClient.java, 這是我們針對(duì)于ElasticSearch封裝的一個(gè)類。

public class ESClient<T> {private static final Logger LOG = LoggerFactory.getLogger(ESClient.class);private static final String DEFAULT_ANALYZER = "ik_smart";private static final DozerBeanMapper dozerBeanMapper = new DozerBeanMapper();private final Client client;private String index;private Class<T> clazz;private String type;private BulkProcessor bulkProcessor;private List<String> serverHttpAddressList = Lists.newArrayList();private Map<String, JSONObject> sqlJsonMap = Maps.newHashMap();/** * 初始化一個(gè)連接ElasticSearch的客戶端 * * @param addresses ES服務(wù)器的Transport地址和端口的列表,多個(gè)服務(wù)器用逗號(hào)分隔,例如 localhost:9300,localhost:9300,... * @param clusterName 集群名稱 * @param index 索引名稱,這里應(yīng)該使用項(xiàng)目名稱 * @param username 用戶名稱 * @param password 用戶密碼 * @param type 索引類型 * @param clazz 存儲(chǔ)類 */public ESClient(String addresses, String clusterName, String index,String username, String password, String type, Class<T> clazz) {if (StringUtils.isBlank(addresses)) {throw new RuntimeException("沒有給定的ES服務(wù)器地址。");}this.index = index;this.type = type;this.clazz = clazz;// 獲得鏈接地址對(duì)象列表List<InetSocketTransportAddress> addressList = Lists.transform(Splitter.on(",").trimResults().omitEmptyStrings().splitToList(addresses),new Function<String, InetSocketTransportAddress>() {@Overridepublic InetSocketTransportAddress apply(String input) {String[] addressPort = input.split(":");String address = addressPort[0];Integer port = Integer.parseInt(addressPort[1]);serverHttpAddressList.add(address + ":" + 9200);return new InetSocketTransportAddress(address, port);}});// 建立關(guān)于ES的配置ImmutableSettings.Builder builder = ImmutableSettings.settingsBuilder().put("cluster.name", clusterName).put("client.transport.sniff", false);if (StringUtils.isNotBlank(username)) {builder.put("shield.user", username + ":" + password);}Settings settings = builder.build();// 生成原生客戶端TransportClient transportClient = new TransportClient(settings);for (InetSocketTransportAddress address : addressList) {transportClient.addTransportAddress(address);}client = transportClient;bulkProcessor = BulkProcessor.builder(client, new BulkProcessor.Listener() {@Overridepublic void beforeBulk(long executionId, BulkRequest request) {}@Overridepublic void afterBulk(long executionId, BulkRequest request, BulkResponse response) {}@Overridepublic void afterBulk(long executionId, BulkRequest request, Throwable failure) {throw new RuntimeException(failure);}}).build();}/** * 初始化連接ElasticSearch的客戶端 * * @param client 原生客戶端 * @param index 索引名稱 * @param type 類型 * @param clazz 存儲(chǔ)類 */public ESClient(Client client, String index, String type, Class<T> clazz) {this.client = client;this.index = index;this.type = type;this.clazz = clazz;}/** * 向ES發(fā)送存儲(chǔ)請(qǐng)求,將一個(gè)對(duì)象存儲(chǔ)到服務(wù)器。 * * @param id 該對(duì)象的id * @param t 存儲(chǔ)實(shí)例 * @return 是否存儲(chǔ)成功 */public boolean indexDocument(String id, T t) {return indexDocument(id, type, t);}/** * 向ES發(fā)送存儲(chǔ)請(qǐng)求,將一個(gè)對(duì)象存儲(chǔ)到服務(wù)器。 * * @param t 存儲(chǔ)實(shí)例 * @return 返回存儲(chǔ)之后在ES服務(wù)器內(nèi)生成的隨機(jī)ID */public String indexDocument(T t) {IndexResponse indexResponse = client.prepareIndex(index, type).setSource(toJSONString(t)).execute().actionGet();return indexResponse.getId();}/** * 向ES發(fā)送存儲(chǔ)請(qǐng)求,將一個(gè)對(duì)象存儲(chǔ)到服務(wù)器,這個(gè)方法允許用戶手動(dòng)指定該對(duì)象的存儲(chǔ)類型名稱 * * @param id 對(duì)象id * @param type 存儲(chǔ)類型 * @param t 存儲(chǔ)實(shí)例 * @return 是否存儲(chǔ)成功 */public boolean indexDocument(String id, String type, T t) {IndexResponse indexResponse = client.prepareIndex(index, type, id).setSource(toJSONString(t)).execute().actionGet();return true;}/** * 向ES發(fā)送批量?jī)?chǔ)存請(qǐng)求, 請(qǐng)求不會(huì)馬上提交,而是會(huì)等待到達(dá)bulk設(shè)置的閾值后進(jìn)行提交.<br/> * 最后客戶端需要調(diào)用{@link #flushBulk()}方法. * * @param id 對(duì)象id * @param t 存儲(chǔ)實(shí)例 * @return 成功表示放入到bulk成功, 可能會(huì)拋出runtimeException */ public boolean indexDocumentBulk(String id, T t) { return indexDocumentBulk(id, type, t); } /** * 向ES發(fā)送批量存儲(chǔ)請(qǐng)求,將一個(gè)對(duì)象存儲(chǔ)到服務(wù)器,這個(gè)方法允許用戶手動(dòng)指定該對(duì)象的存儲(chǔ)類型名稱 * * @param id 對(duì)象id * @param type 存儲(chǔ)類型 * @param t 存儲(chǔ)實(shí)例 * @return 成功表示放入到bulk成功, 可能會(huì)拋出runtimeException * @see #indexDocument(String, Object) */ public boolean indexDocumentBulk(String id, String type, T t) { IndexRequest indexRequest = new IndexRequest(index, type, id).source(toJSONString(t)); bulkProcessor.add(indexRequest); return true; } /** * 向ES發(fā)送批量存儲(chǔ)請(qǐng)求, 請(qǐng)求不會(huì)馬上提交,而是會(huì)等待到達(dá)bulk設(shè)置的閾值后進(jìn)行提交.<br/> * 最后客戶端需要調(diào)用{@link #flushBulk()}方法. * * @param t 存儲(chǔ)實(shí)例 * @return 成功表示放入到bulk成功, 可能會(huì)拋出runtimeException */ public boolean indexDocumentBulk(T t) { IndexRequest indexRequest = new IndexRequest(index, type).source(toJSONString(t)); bulkProcessor.add(indexRequest); return true; } public boolean indexDocumentBulk(List<T> list) { for (T t : list) { indexDocumentBulk(t); } return true; } /** * 向ES發(fā)送批量存儲(chǔ)請(qǐng)求, 允許傳入一個(gè)Function, 用來從對(duì)象中獲取ID. * * @param list 對(duì)象列表 * @param idFunction 獲取ID * @return 成功表示放入到bulk成功, 可能會(huì)拋出runtimeException */ public boolean indexDocumentBulk(List<T> list, Function<T, String> idFunction) { for (T t : list) { indexDocumentBulk(idFunction.apply(t), t); } return true; } /** * 向ES發(fā)送更新文檔請(qǐng)求,將一個(gè)對(duì)象更新到服務(wù)器,會(huì)替換原有對(duì)應(yīng)ID的數(shù)據(jù)。 * * @param id id * @param t 存儲(chǔ)對(duì)象 * @return 是否更新成功 */ public boolean updateDocument(String id, T t) { return updateDocument(id, type, t); } /** * 向ES發(fā)送更新文檔請(qǐng)求,將一個(gè)對(duì)象更新到服務(wù)器,會(huì)替換原有對(duì)應(yīng)ID的數(shù)據(jù)。 * * @param id id * @param type 存儲(chǔ)類型 * @param t 存儲(chǔ)對(duì)象 * @return 是否更新成功 */ public boolean updateDocument(String id, String type, T t) { client.prepareUpdate(index, type, id).setDoc(toJSONString(t)) .execute().actionGet(); return true; } /** * 向ES發(fā)送批量更新請(qǐng)求 * * @param id 索引ID * @param t 存儲(chǔ)對(duì)象 * @return 成功表示放入到bulk成功, 可能會(huì)拋出runtimeException */ public boolean updateDocumentBulk(String id, T t) { UpdateRequest updateRequest = new UpdateRequest(index, type, id).doc(toJSONString(t)); bulkProcessor.add(updateRequest); return true; } /** * 向ES發(fā)送upsert請(qǐng)求, 如果該document不存在將會(huì)新建這個(gè)document, 如果存在則更新. * * @param id id * @param t 存儲(chǔ)對(duì)象 * @return 是否執(zhí)行成功 */ public boolean upsertDocument(String id, T t) { return upsertDocument(id, type, t); } /** * 向ES發(fā)送upsert請(qǐng)求, 如果該document不存在將會(huì)新建這個(gè)document, 如果存在則更新. * * @param id id * @param type 存儲(chǔ)類型 * @param t 存儲(chǔ)對(duì)象 * @return 是否執(zhí)行成功 */ public boolean upsertDocument(String id, String type, T t) { client.prepareUpdate(index, type, id).setDocAsUpsert(true).setDoc(toJSONString(t)) .execute().actionGet(); return true; } /** * 向ES發(fā)送批量upsert的請(qǐng)求. * * @param id id * @param t 儲(chǔ)存對(duì)象 * @return 是否執(zhí)行成功 */ public boolean upsertDocumentBulk(String id, T t) { UpdateRequest updateRequest = new UpdateRequest(index, type, id) .doc(toJSONString(t)); updateRequest.docAsUpsert(true); bulkProcessor.add(updateRequest); return true; } /** * 向ES發(fā)送獲取指定ID文檔的請(qǐng)求 * * @param id id * @return 搜索引擎實(shí)例 * @throws Exception */ public T getDocument(String id) throws Exception { try { GetResponse getResponse = client.prepareGet(index, type, id) .execute().actionGet(); if (getResponse.getSource() == null) { return null; } JSONObject jsonObject = new JSONObject(getResponse.getSource()); T t = clazz.newInstance(); toObject(t, jsonObject); return t; } catch (Exception e) { throw new RuntimeException(e); } } /** * 向ES發(fā)送刪除指定ID文檔的請(qǐng)求 * * @param id id * @return 是否刪除成功 * @throws Exception */ public boolean deleteDocument(String id) throws Exception { return deleteDocument(id, type); } /** * 向ES發(fā)送刪除指定ID文檔的請(qǐng)求 * * @param id id * @param type 存儲(chǔ)類型 * @return 是否刪除成功 * @throws Exception */ public boolean deleteDocument(String id, String type) throws Exception { DeleteResponse deleteResponse = client.prepareDelete(index, type, id) .execute().actionGet(); return deleteResponse.isFound(); } /** * 向ES發(fā)送搜索文檔的請(qǐng)求,返回分頁結(jié)果 * * @param searchText 搜索內(nèi)容 * @return 分頁結(jié)果 * @throws Exception */ public PageResponse<T> searchDocument(String searchText) throws Exception { PageRequest pageRequest = WebContext.get().page(); SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index) .setTypes(type) .setQuery(QueryBuilders.matchQuery("_all", searchText)) .setFrom(pageRequest.getOffset()) .setSize(pageRequest.getLimit()) .setFetchSource(true); return searchDocument(searchRequestBuilder); } /** * 向ES發(fā)送搜索文檔的請(qǐng)求,返回列表結(jié)果 * * @param searchText 搜索內(nèi)容 * @param start 起始位置 * @param size 獲取數(shù)據(jù)大小 * @return 返回?cái)?shù)據(jù)列表 * @throws Exception */ public List<T> searchDocument(String searchText, int start, int size) throws Exception { SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index) .setTypes(type) .setQuery(QueryBuilders.matchQuery("_all", searchText)) .setFrom(start) .setSize(size) .setFetchSource(true); PageResponse<T> pageResponse = searchDocument(searchRequestBuilder); return pageResponse.getItemList(); } /** * 向ES發(fā)送搜索文檔的請(qǐng)求,返回列表結(jié)果 * * @param searchText 搜索內(nèi)容 * @param type 類型 * @param start 起始位置 * @param size 數(shù)據(jù)大小 * @return 返回?cái)?shù)據(jù)列表 * @throws Exception */ public List<T> searchDocument(String searchText, String type, int start, int size) throws Exception { SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index) .setTypes(type) .setQuery(QueryBuilders.matchQuery("_all", searchText)) .setFrom(start) .setSize(size) .setFetchSource(true); PageResponse<T> pageResponse = searchDocument(searchRequestBuilder); return pageResponse.getItemList(); } /** * 向ES發(fā)送搜索文檔的請(qǐng)求,返回分頁結(jié)果 * * @param searchRequestBuilder 搜索構(gòu)造器 * @return 分頁結(jié)果 * @throws Exception */ public PageResponse<T> searchDocument(SearchRequestBuilder searchRequestBuilder) throws Exception { SearchResponse searchResponse = search(searchRequestBuilder); return searchResponseToPageResponse(searchResponse); } /** * 獲得scrollId對(duì)應(yīng)的數(shù)據(jù). 請(qǐng)查看{@link #getScrollId(SearchRequestBuilder, int, int)}.<br/> * 可以反復(fù)調(diào)用該方法, 直到返回?cái)?shù)據(jù)為0. * * @param scrollId 給定的scrollId * @param keepSeconds scroll數(shù)據(jù)保留時(shí)間 * @return 分頁結(jié)果 * @throws Exception */ public PageResponse<T> scrollSearchDocument(String scrollId, int keepSeconds) throws Exception { return searchResponseToPageResponse(scrollSearch(scrollId, keepSeconds)); } /** * 向ES發(fā)送搜索請(qǐng)求,然后直接返回原始結(jié)果。 * * @param searchRequestBuilder 搜索構(gòu)造器 * @return 返回結(jié)果 */ public SearchResponse search(SearchRequestBuilder searchRequestBuilder) { return searchRequestBuilder.setTypes(type).execute().actionGet(); } /** * 向ES發(fā)送搜索請(qǐng)求,然后直接返回原始結(jié)果。 * * @param searchRequestBuilder 搜索構(gòu)造器 * @param type 類型 * @return 返回結(jié)果 */ @Deprecated public SearchResponse search(SearchRequestBuilder searchRequestBuilder, String type) { return searchRequestBuilder.setTypes(type).execute().actionGet(); } /** * 通過scrollId獲得數(shù)據(jù).請(qǐng)查看{@link #getScrollId(SearchRequestBuilder, int, int)}.<br/> * 可以反復(fù)調(diào)用該方法, 直到返回?cái)?shù)據(jù)為0. * * @param scrollId 給定的scrollId * @param keepSeconds scroll繼續(xù)保留的時(shí)間, 建議60秒 * @return 返回獲取的數(shù)據(jù) */ public SearchResponse scrollSearch(String scrollId, int keepSeconds) { return client.prepareSearchScroll(scrollId).setScroll(new TimeValue(keepSeconds * 1000)) .execute().actionGet(); } /** * 提供搜索構(gòu)造器來獲得搜索scrollId, 這個(gè)scrollId用作{@link #scrollSearch(String, int)} * 和{@link #scrollSearchDocument(String, int)}的參數(shù). <br/> * 當(dāng)需要獲取大量數(shù)據(jù)的時(shí)候, 請(qǐng)使用scrollSearch來進(jìn)行. * * @param searchRequestBuilder 搜索構(gòu)造器 * @param keepSeconds scroll搜索保留時(shí)間, 建議60秒 * @param sizePerShard 每次每個(gè)分片獲取的尺寸 * @return 返回scrollId, 用于scrollSearch方法. */ public String getScrollId(SearchRequestBuilder searchRequestBuilder, int keepSeconds, int sizePerShard) { SearchResponse searchResponse = searchRequestBuilder.setSearchType(SearchType.SCAN) .setScroll(new TimeValue(keepSeconds * 1000)) .setSize(sizePerShard).execute().actionGet(); return searchResponse.getScrollId(); } /** * 返回搜索指定內(nèi)容后,總共ES找到匹配的數(shù)據(jù)量。 * * @param searchText 搜索內(nèi)容 * @return 搜索結(jié)果數(shù)據(jù)量 */ @Deprecated public long countSearchResult(String searchText) { CountRequestBuilder countRequestBuilder = client.prepareCount(index) .setTypes(type) .setQuery(QueryBuilders.matchQuery("_all", searchText)); return countSearchResult(countRequestBuilder); } /** * 返回搜索指定內(nèi)容后,總共ES找到匹配的數(shù)據(jù)量。 * * @param searchText 搜索內(nèi)容 * @param type 類型 * @return 搜索結(jié)果數(shù)據(jù)量 */ @Deprecated public long countSearchResult(String searchText, String type) { CountRequestBuilder countRequestBuilder = client.prepareCount(index) .setTypes(type) .setQuery(QueryBuilders.matchQuery("_all", searchText)); return countSearchResult(countRequestBuilder); } /** * 返回搜索指定內(nèi)容后,總共ES找到匹配的數(shù)據(jù)量。 * * @param countRequestBuilder 計(jì)數(shù)請(qǐng)求構(gòu)造器實(shí)例 * @return 搜索結(jié)果數(shù)據(jù)量 * @see #prepareCount() */ @Deprecated public long countSearchResult(CountRequestBuilder countRequestBuilder) { return countRequestBuilder.execute().actionGet().getCount(); } /** * 用默認(rèn)的分詞器進(jìn)行文本分詞。 * * @param docText 給定的文本 * @param order 是否使用排序,如果使用排序,則相同分詞會(huì)被合并,并且出現(xiàn)次數(shù)最高的排在返回列表最頭部。 * @return 分詞器將文本分詞之后的詞語列表 */ public List<String> analyzeDocument(String docText, boolean order) { List<AnalyzeToken> tokenList = analyzeDocument(docText, DEFAULT_ANALYZER); if (order) { // 如果是使用排序,按照分詞出現(xiàn)次數(shù)進(jìn)行排序,并且會(huì)合并相同的分詞。 // 構(gòu)造分詞Map,key為分詞,value為出現(xiàn)次數(shù)。 Map<String, Integer> tokenMap = Maps.newHashMap(); for (AnalyzeToken token : tokenList) { if (tokenMap.get(token.getTerm()) == null) { tokenMap.put(token.getTerm(), 1); } else { tokenMap.put(token.getTerm(), tokenMap.get(token.getTerm()) + 1); } } // 將分詞Map進(jìn)行排序 List<Map.Entry<String, Integer>> tokenSortList = Ordering.from(new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return o2.getValue().compareTo(o1.getValue()); } }).sortedCopy(tokenMap.entrySet()); // 返回分詞列表。 return Lists.transform(tokenSortList, new Function<Map.Entry<String, Integer>, String>() { @Override public String apply(Map.Entry<String, Integer> input) { return input.getKey(); } }); } else { // 返回所有分詞結(jié)果 return Lists.transform(tokenList, new Function<AnalyzeToken, String>() { @Override public String apply(AnalyzeToken input) { return input.getTerm(); } }); } } /** * 用指定分詞器來分析給定的文本 * * @param docText 給定的文本 * @param analyzer 指定的分析器 * @return 分詞器將文本分詞之后的詞語列表 */ public List<AnalyzeToken> analyzeDocument(String docText, String analyzer) { AnalyzeResponse analyzeResponse = client.admin().indices().prepareAnalyze(index, docText) .setAnalyzer(analyzer) .execute().actionGet(); return analyzeResponse.getTokens(); } /** * 獲得一個(gè)搜索請(qǐng)求構(gòu)造器的實(shí)例,通過這個(gè)實(shí)例,可以進(jìn)行查詢相關(guān)操作。<br/> * 使用這個(gè)方法{@link ESClient#searchDocument(SearchRequestBuilder)}進(jìn)行查詢。 * <pre> * prepareSearch("telepathy") * .setTypes("article") * .setSearchType(SearchType.QUERY_THEN_FETCH) * .setQuery(QueryBuilders.matchQuery("_all", searchText)) * .setFrom(pageRequest.getLimit() * (pageRequest.getPage() - 1)) * .setSize(pageRequest.getLimit()) * .setExplain(true) * .addHighlightedField("title", 100, 1) * .setFetchSource(new String[]{}, new String[]{}); * </pre> * * @return 搜索請(qǐng)求構(gòu)造器實(shí)例 */ public SearchRequestBuilder prepareSearch() { return client.prepareSearch(index); } /** * 獲得一個(gè)計(jì)數(shù)請(qǐng)求構(gòu)造器的實(shí)例,通過這個(gè)實(shí)例可以進(jìn)行查詢選項(xiàng)的構(gòu)造。 * * @return 計(jì)數(shù)請(qǐng)求構(gòu)造器實(shí)例 * @see #prepareSearch() */ @Deprecated public CountRequestBuilder prepareCount() { return client.prepareCount(index); } /** * 獲得一個(gè)Document的term vector (doc frequency, positions, offsets) * * @return TermVectorResponse * @see #termVector() */ public ActionFuture<TermVectorResponse> termVector(TermVectorRequest request) { return client.termVector(request); } /** * 將SQL轉(zhuǎn)換成ES的JSON查詢對(duì)象. * * @param sql 給定的SQL * @return JSON對(duì)象 */ public JSONObject convertSqlToJSON(String sql) { if (sqlJsonMap.get(sql) != null) { return sqlJsonMap.get(sql); } List<String> addresses = Lists.newArrayList(serverHttpAddressList); while (addresses.size() > 0) { String sqlPluginUrl = "http://" + addresses.remove(RandomUtils.nextInt(0, addresses.size())) + "/_sql/_explain"; try { JSONObject json = JSONObject.parseObject( MucangHttpClient.getDefault().httpPostBody(sqlPluginUrl, sql, "text/plain") ); sqlJsonMap.put(sql, json); return json; } catch (Exception e) { LOG.error("調(diào)用elasticsearch-sql插件時(shí)遇到錯(cuò)誤, 原因:{}", e); } } throw new RuntimeException("調(diào)用elasticsearch-sql插件多次失敗, 請(qǐng)檢查服務(wù)器或者插件功能是否正常."); } /** * 用SQL語句進(jìn)行搜索. 使用${keyName}的方式代表需要替換的字符串(需要替換的字符串請(qǐng)用雙引號(hào)或者單引號(hào)引起來, 否則插件不能解析)<br/> * 例如: select * from table where mediaId="${mediaId}"<br/> * * @param sql 指定的SQL * @param kvPairs 替換鍵值對(duì) * @return 搜索結(jié)果 * @throws Exception */ public SearchResponse searchSql(String sql, final Map<String, String> kvPairs) throws Exception { JSONObject jsonQuery = convertSqlToJSON(sql); PropertyPlaceholderHelper propertyPlaceholderHelper = new PropertyPlaceholderHelper("${", "}"); String queryString = propertyPlaceholderHelper.replacePlaceholders( jsonQuery.toJSONString(), new PropertyPlaceholderHelper.PlaceholderResolver() { @Override public String resolvePlaceholder(String placeholderName) { if (StringUtils.isBlank(kvPairs.get(placeholderName))) { return ""; } else { return kvPairs.get(placeholderName); } } }); SearchRequestBuilder searchRequestBuilder = prepareSearch() .setSource(XContentFactory.jsonBuilder().value(JSONObject.parseObject(queryString))); return search(searchRequestBuilder); } /** * 將給定的對(duì)象轉(zhuǎn)換成JSON字符串,如果有特殊需求,可以覆蓋該方法。 * * @param t 給定的對(duì)象 * @return JSON字符串 */ public String toJSONString(T t) { return JSON.toJSONString(t); } /** * 將給定的Map里面的值注入到目標(biāo)對(duì)象。如果有特殊需求,可以覆蓋該方法。 * * @param t 目標(biāo)對(duì)象 * @param map 給定的map * @throws Exception */ public void toObject(T t, Map<String, ?> map) throws Exception { dozerBeanMapper.map(map, t); } /** * 將BulkProcessor的緩沖內(nèi)容進(jìn)行立即提交. */ public void flushBulk() { this.bulkProcessor.flush(); } public BulkProcessor getBulkProcessor() { return bulkProcessor; } public void setBulkProcessor(BulkProcessor bulkProcessor) { this.bulkProcessor = bulkProcessor; } public PageResponse<T> searchResponseToPageResponse(SearchResponse searchResponse) throws Exception { PageResponse<T> pageResponse = new PageResponse<>(); for (SearchHit searchHit : searchResponse.getHits().getHits()) { // 將結(jié)果實(shí)例化成對(duì)應(yīng)的類型實(shí)例 T t = this.clazz.newInstance(); Map<String, Object> hitMap; if (searchHit.getSource() != null) { hitMap = searchHit.getSource(); } else { hitMap = Maps.newHashMap(Maps.transformValues(searchHit.getFields(), new Function<SearchHitField, Object>() { @Override public Object apply(SearchHitField input) { return input.getValues(); } } )); } for (HighlightField highlightField : searchHit.getHighlightFields().values()) { hitMap.put(highlightField.getName(), StringUtils.join(highlightField.getFragments(), "...")); } // 將數(shù)據(jù)轉(zhuǎn)換成對(duì)應(yīng)的實(shí)例 toObject(t, hitMap); pageResponse.getItemList().add(t); } pageResponse.setTotal(searchResponse.getHits().getTotalHits()); return pageResponse; } /** * 關(guān)閉native的鏈接. */ public void close() { IOUtils.closeQuietly(bulkProcessor); this.client.close(); }}

如果有問題大家可以留言一起交流, 我也是一個(gè)es初學(xué)者。

分類: 工作經(jīng)驗(yàn),全文檢索 標(biāo)簽: ElasticSearch

總結(jié)

以上是生活随笔為你收集整理的ElasticSearch初体验之使用Java进行最基本的增删改查的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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

九九热在线视频免费观看 | 亚洲第一中文网 | 国产免费久久 | 9在线观看免费 | 婷婷在线免费视频 | 亚洲国产精品一区二区久久,亚洲午夜 | 一区二区视频在线观看免费 | 国产一级一级国产 | 五月激情六月丁香 | 色99网| 狠狠色综合网站久久久久久久 | 久久美女电影 | 米奇四色影视 | 色播五月激情五月 | 久久这里只有精品1 | 欧美电影在线观看 | 国产69精品久久久久9999apgf | 五月天六月色 | 日韩免费一区二区 | 国产黄色片一级三级 | 久草视频一区 | 欧美精品九九99久久 | 激情在线网 | 日韩精品视频免费专区在线播放 | 超碰在线94 | 国产四虎在线 | 国产精品高清在线 | 999久久久久久久久 69av视频在线观看 | 人人揉人人揉人人揉人人揉97 | 夜夜干天天操 | 最近日本mv字幕免费观看 | 久久综合九色综合欧美就去吻 | 国产91精品看黄网站在线观看动漫 | 欧美日韩精品二区第二页 | 人人草人| 久青草视频在线观看 | 欧美性色网站 | 99精品欧美一区二区蜜桃免费 | 亚洲天堂视频在线 | 香蕉影视在线观看 | 日韩在线观看一区二区 | 91亚洲精品乱码久久久久久蜜桃 | 亚洲高清视频在线 | 色妞色视频一区二区三区四区 | 欧洲视频一区 | 人人超碰在线 | 色诱亚洲精品久久久久久 | 人人超碰在线 | 色婷婷a| 人人舔人人 | 精品欧美在线视频 | 美女视频免费精品 | 精品一区二区在线看 | 久久精品国产99国产 | 成人av高清在线 | 久久免费视频这里只有精品 | 涩涩网站在线播放 | 欧美亚洲成人免费 | 亚洲91视频 | 一区二区三区四区在线免费观看 | av在观看 | 亚洲专区 国产精品 | 亚洲精品乱码久久 | 亚洲成人资源在线 | 天天五月天色 | 国产成人精品一区二区三区在线 | 99re久久资源最新地址 | 国产麻豆剧传媒免费观看 | 国产精品热视频 | 国产一卡在线 | 激情欧美xxxx | 干综合网 | 日韩二区在线观看 | 国产一级视频 | 91在线在线观看 | 亚洲无线视频 | 日韩影视精品 | 欧美日韩三区二区 | 亚洲精品视频国产 | 国产精品久久久久高潮 | 国产毛片久久 | 欧美日韩一级久久久久久免费看 | 久久久久久久久福利 | 69人人| 在线国产能看的 | 国产在线观看一区 | 91亚洲精品久久久中文字幕 | 成人久久久久久久久 | 国产精品免费视频一区二区 | 国产精品美女久久久久久久 | 久草在线综合 | 国产精品剧情在线亚洲 | 国产a级精品| 在线观看中文字幕亚洲 | 深爱五月激情五月 | 国产精品欧美一区二区 | 91av社区| 午夜影视一区 | 97在线观看视频 | 色吊丝在线永久观看最新版本 | 日本久久精| 国产在线精品区 | 亚洲日韩欧美视频 | 特级毛片在线观看 | 国产精品地址 | 成人网在线免费视频 | 天天艹天天爽 | 91精品视频在线 | 久久精品2| 日韩天堂网 | 天天干天天拍天天操天天拍 | 久久草在线视频国产 | 一区二区三区国产欧美 | 久久国产精品色婷婷 | 久久久久成人精品 | 在线观看色网站 | 99热在线网站| 一区二区三区韩国免费中文网站 | 一区二区三区免费在线 | 日韩精品中文字幕在线 | 国产精品二区三区 | 中文字幕色综合网 | 色视频 在线 | 午夜久久成人 | 97在线观看免费视频 | 欧美一区二区视频97 | 欧美日韩久| 最新的av网站 | 久久人人爽人人片av | 国产最新精品视频 | 成人黄大片视频在线观看 | 97国产超碰在线 | 欧美坐爱视频 | 毛片网站免费 | 日本中出在线观看 | 国产高清在线免费视频 | 日本三级不卡 | 福利电影久久 | 一级成人免费 | 婷婷五天天在线视频 | 国产精品大尺度 | 丁香六月婷婷 | 国产成人精品福利 | 在线观看理论 | 丁香婷婷在线观看 | 欧美不卡在线 | 亚洲国产午夜 | 97视频网站 | 国产在线精品观看 | 插综合网 | 丝袜制服天堂 | 免费在线观看av网址 | 天天综合网久久综合网 | 毛片永久新网址首页 | 久久99热国产| 美女网站视频久久 | 婷婷5月激情5月 | 日本成人中文字幕在线观看 | 不卡的av在线 | 不卡电影免费在线播放一区 | 99精品国产高清在线观看 | 中文字幕av在线免费 | 久久看免费视频 | 成人亚洲网 | 日韩免费一级a毛片在线播放一级 | 中文字幕在线免费播放 | 日日干av| 亚洲精品www久久久 www国产精品com | 九九欧美 | 四虎影视成人永久免费观看视频 | 在线免费黄色av | 国产精品一二 | 欧美综合在线视频 | 伊人网综合在线观看 | 免费精品视频在线 | 麻豆91在线看 | 亚洲手机天堂 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 麻豆视频免费播放 | 天天天天爱天天躁 | 91丨九色丨91啦蝌蚪老版 | 在线观看日本高清mv视频 | 国产精品一区二区在线播放 | 91av在线不卡 | 国产免费一区二区三区最新6 | 人人超碰在线 | 天天干天天插 | 美女黄频在线观看 | 日韩视频1 | 一区 在线 影院 | 激情av在线资源 | 免费观看一区二区 | 又黄又刺激视频 | 久久伊人五月天 | 99热99re6国产在线播放 | 亚洲在线看 | 日本中文字幕高清 | 午夜av免费在线观看 | 成人在线播放av | 456免费视频 | 久久99精品久久久久久秒播蜜臀 | 久久国产剧场电影 | 精品视频久久久 | 久久久影片 | 亚洲欧美怡红院 | 人人玩人人爽 | 色成人亚洲网 | 亚洲成av| 日韩欧美在线一区 | 国产99久久精品一区二区永久免费 | 亚一亚二国产专区 | 91精品视频免费看 | 在线观看视频h | 国产日韩中文字幕在线 | 精品一区二区在线免费观看 | 国产一区在线免费观看 | 国产精品第7页 | 亚洲天堂va | 亚洲经典在线 | 92国产精品久久久久首页 | 国产黄免费看 | 最近中文字幕在线播放 | 久久久午夜影院 | 69国产精品视频 | 国产精品久久av | www.色com| 中文字幕影片免费在线观看 | 五月天高清欧美mv | 中文字幕在线看视频国产 | 亚洲欧洲中文日韩久久av乱码 | 日韩va亚洲va欧美va久久 | 精品极品在线 | 四虎国产精品成人免费影视 | 婷婷视频在线观看 | 国产亚洲综合性久久久影院 | 探花视频在线版播放免费观看 | 欧美精品久久久久a | 国产美女精彩久久 | 日韩精品免费在线观看视频 | 一区二区三区高清在线 | 欧美a视频 | 国产精品午夜免费福利视频 | 久久久高清免费视频 | 欧美精品中文在线免费观看 | 中文国产在线观看 | 成年人黄色大片在线 | 精品欧美一区二区三区久久久 | 天天操婷婷 | 欧美成人精品三级在线观看播放 | 国产高清av | 欧美一区二区三区特黄 | 久久综合婷婷综合 | 在线观看日韩av | 粉嫩av一区二区三区免费 | 亚洲精品一区中文字幕乱码 | 天天操天天操天天操天天操天天操天天操 | 国产中文字幕视频在线观看 | 97电影在线观看 | 久久免费公开视频 | 久精品视频免费观看2 | www.五月天 | 九九免费观看全部免费视频 | 亚洲成熟女人毛片在线 | 欧美一区二区精品在线 | av网站手机在线观看 | 国产精品日韩欧美 | 一区二区 久久 | 99精品视频免费观看 | 日韩r级电影在线观看 | 天天干国产 | 亚洲精品高清在线 | 久草在线视频新 | 久久久片 | 久久精品日本啪啪涩涩 | 色综合久久88色综合天天人守婷 | 日韩电影在线一区 | 97精品国产一二三产区 | 日p在线观看 | 在线免费观看国产精品 | 久久午夜网 | 国产精品久久久久久模特 | 91九色porn在线资源 | 91黄视频在线 | 91丨精品丨蝌蚪丨白丝jk | 天天夜夜亚洲 | 丁香婷五月 | 国产精品专区h在线观看 | 91人网站 | 在线影院中文字幕 | 五月综合色 | 麻豆小视频在线观看 | 美女网站在线观看 | 亚洲91网站 | 国产精品久久久久久妇 | .精品久久久麻豆国产精品 亚洲va欧美 | 色在线视频 | 丁香在线视频 | 免费视频色| 亚洲激色 | 国产日韩中文字幕 | 午夜av影院 | 精品一区二区日韩 | 九九视频网站 | 成 人 免费 黄 色 视频 | 日韩精品久久久久久中文字幕8 | 999毛片| 99久久电影 | 欧美亚洲另类在线视频 | 中文字幕中文字幕中文字幕 | 久久久久久国产精品免费 | 在线观看视频97 | 久久久久综合网 | 超碰97国产 | 久久久久北条麻妃免费看 | 日韩在线网 | 婷婷在线视频 | 色婷婷国产精品一区在线观看 | 久草视频在 | 天天综合网 天天 | 欧美a影视| 精品国产乱码久久久久久浪潮 | 狠狠色噜噜狠狠狠狠2021天天 | 中文字幕在线播放视频 | 久久a级片 | 日韩精品久久久久久 | 精品视频999| 国产精品9区 | 99久久99久久精品 | 亚洲精品视频在线观看视频 | 婷婷视频导航 | 在线播放一区 | 国产五十路毛片 | 免费日韩视| 日韩精品一区二区三区第95 | 欧美aa一级片 | 免费看的av片| 激情五月婷婷综合 | 国产成人亚洲在线观看 | 亚洲欧美在线视频免费 | 国产精品视频地址 | 久久久久久麻豆 | 九九九九九国产 | 国产裸体永久免费视频网站 | 91视频电影| www日韩视频 | 99精品视频免费 | 国产一区在线视频观看 | 激情深爱五月 | 在线观看中文字幕视频 | 国产精品久久艹 | 激情五月在线视频 | 日韩中文字幕亚洲一区二区va在线 | 91大片网站 | 国产精品久久久久久久久久免费 | 日韩乱码中文字幕 | 在线观看av不卡 | 国产98色在线 | 日韩 | 亚洲精品 在线视频 | 91av久久| 中文字幕在线国产 | 麻豆果冻剧传媒在线播放 | h动漫中文字幕 | 精品视频区 | 国产成人一级 | 久久久天堂 | 精品国产一区二区三区久久久蜜臀 | 99精品国产亚洲 | 国产精品大全 | 亚洲成人欧美 | 粉嫩av一区二区三区免费 | 中文字幕日韩国产 | 日韩精品无 | 丁香婷婷深情五月亚洲 | 免费在线精品视频 | 爱色婷婷 | 天堂av官网 | 香蕉视频在线免费 | av大片免费看 | 午夜国产在线观看 | 久久久久一区二区三区四区 | 国产欧美日韩视频 | 色妞色视频一区二区三区四区 | 97超视频 | 日韩免费电影网站 | 色婷婷精品大在线视频 | 99久久日韩精品免费热麻豆美女 | 中文字幕2021| 午夜精品久久久久久久久久久 | 亚洲三级在线免费观看 | 国产精品永久免费在线 | 婷婷激情网站 | 免费一级日韩欧美性大片 | 天天插日日插 | 97人人人人| 中文字幕在线视频一区二区三区 | 国产亚洲亚洲 | 毛片基地黄久久久久久天堂 | 狠狠色丁香婷婷综合基地 | 成人黄色免费在线观看 | 国产成人精品av在线观 | 综合色久 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 日韩欧在线| 青青河边草免费直播 | 亚洲精品2区 | 国产精品淫 | 男女精品久久 | 插综合网 | 日韩久久久久久久久久 | 国产成人在线网站 | 精品一区二区久久久久久久网站 | 精品亚洲免费视频 | 亚洲精品系列 | 精品国产精品久久 | 欧美男男激情videos | 在线婷婷| 欧洲亚洲国产视频 | 久久国产精品一区二区 | 国产精品video | 亚洲成人资源在线观看 | 免费三级骚| 在线中文字幕观看 | 亚洲综合激情网 | 视频福利在线观看 | 99视 | 二区三区在线观看 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 极品嫩模被强到高潮呻吟91 | 六月婷婷色 | 91在线视频免费91 | 日韩久久午夜一级啪啪 | 天天综合区 | 国产黄色精品在线 | 婷婷激情在线 | av免费观看在线 | 超碰最新网址 | 免费观看版 | 国产精品一区二区久久精品爱涩 | 黄色大片免费播放 | 亚洲成人频道 | 456成人精品影院 | 精品日韩视频 | 国产精品久久久久av | 永久免费在线 | 国产精品久久久久久久久久久久午 | a√天堂中文在线 | 欧美美女视频在线观看 | 中文字幕久久精品 | a极黄色片 | 国产精品视频免费在线观看 | 色综合久久久久 | 成人av网站在线观看 | 波多野结衣在线中文字幕 | 久久九九免费 | 国产亚洲精品v | 日日干av| 久久黄色影视 | 韩国一区二区三区视频 | 激情综合网天天干 | 深爱五月激情网 | 免费男女网站 | 国产成人久久久77777 | 欧美日本一区 | 成人免费xxx在线观看 | 狠狠干免费| 久热这里有精品 | 在线观看黄 | 日韩视频免费在线 | 国产成人精品999在线观看 | 国产无吗一区二区三区在线欢 | 国产 一区二区三区 在线 | 视色网站 | 亚欧日韩av | 91丨九色丨高潮丰满 | 久久国产网站 | 成人综合免费 | 日韩精选在线 | av电影一区二区 | 美女福利视频在线 | 六月激情婷婷 | 97成人精品视频在线播放 | 美州a亚洲一视本频v色道 | 日韩高清在线看 | 日韩欧美专区 | 91久久久国产精品 | 中文字幕在线观看你懂的 | 亚洲激情视频 | 五月婷婷激情 | 久久久2o19精品 | 亚洲国产成人高清精品 | 久久五月婷婷丁香 | 国产一区二区三区高清播放 | 久久免费播放视频 | 香蕉精品在线观看 | 日日久视频 | 91视频中文字幕 | 国产成人一区二区三区影院在线 | 成人动漫一区二区三区 | 日本在线观看视频一区 | 少妇搡bbbb搡bbb搡69 | 日韩一区在线播放 | 中文字幕日本电影 | 91在线永久| 日一日操一操 | 91精品视频一区 | 一区二区三区四区精品视频 | 亚洲精品动漫久久久久 | 日韩精品一区不卡 | 亚洲国产欧洲综合997久久, | 中文字幕视频观看 | 久久国产影视 | 激情影院在线观看 | 最新国产精品亚洲 | 丁香婷婷综合激情五月色 | 99精品视频在线观看免费 | 一级欧美一级日韩 | 人人超碰在线 | 91桃色国产在线播放 | av超碰在线| 欧美国产高清 | 一区二区三区在线免费播放 | 天天搞天天干 | 日韩午夜在线播放 | 狠狠综合| 午夜色婷婷 | 深爱五月激情五月 | 99re国产| 久久久久久久久久久久亚洲 | 国产精品久久久久一区二区三区共 | 日本在线观看一区二区 | 国产色一区 | 日韩精品一区二区在线 | 美女天天操 | 97精品国自产拍在线观看 | 亚洲精品色婷婷 | 婷婷在线视频观看 | 亚洲久久视频 | 天天摸日日摸人人看 | www.久久com| 伊人开心激情 | 亚洲成av人片在线观看香蕉 | 激情五月伊人 | 亚洲视频久久久 | 97高清免费视频 | 国产一级a毛片视频爆浆 | 91久久久国产精品 | 国产精品18久久久久久久久久久久 | 亚洲精品欧洲精品 | 视频 国产区 | 日韩在线色视频 | 精精国产xxxx视频在线播放 | 婷婷色社区 | 日韩高清在线一区二区 | 久草国产视频 | 91看片成人| 天天综合精品 | 日韩在观看线 | 激情在线网 | 欧美日韩一区二区视频在线观看 | www·22com天天操 | 久久综合中文色婷婷 | 91精品国产欧美一区二区 | 欧美激情在线网站 | 精品国产伦一区二区三区 | 中文日韩在线视频 | 日韩精品欧美一区 | 黄色三级网站在线观看 | 久久综合久久综合久久综合 | 97精品久久人人爽人人爽 | 网站免费黄色 | 免费精品久久久 | 欧美韩国日本在线 | 国产一二区视频 | 黄色一级大片免费看 | 欧美久久久久 | 欧美91精品久久久久国产性生爱 | 黄色在线观看www | 亚州精品天堂中文字幕 | 久久综合成人网 | 午夜电影av| 午夜aaaa| 免费观看成人网 | 久草视频在线资源 | 日韩精品一区二区久久 | 欧美激情第十页 | 中国一级片在线观看 | 婷婷伊人综合亚洲综合网 | 亚洲精品中文在线 | 乱男乱女www7788 | 欧美二区三区91 | 六月色丁香| 免费色视频网站 | 国产精品不卡av | 视频91在线| 久久五月天色综合 | 四季av综合网站 | 久久蜜臀一区二区三区av | 日韩精品国产一区 | 亚洲成人动漫在线观看 | 在线免费高清一区二区三区 | 国产精品美女免费看 | 精品电影一区 | 国产在线资源 | 91精品视频一区 | 久久精品91久久久久久再现 | 久久久久这里只有精品 | 麻豆传媒视频在线免费观看 | 久久婷婷国产色一区二区三区 | 午夜婷婷在线播放 | 久久久免费视频播放 | 国产高清视频免费观看 | 中文字幕精品视频 | 色婷婷色| 黄色三级网站在线观看 | 色网站在线免费 | 91看片淫黄大片一级在线观看 | 欧美一级艳片视频免费观看 | 超碰在线人| 不卡av免费在线观看 | 黄视频网站大全 | 久久国产精品成人免费浪潮 | 五月婷网站 | 国产成人av电影 | 色婷婷播放 | 免费在线精品视频 | 在线超碰av | 亚洲激情校园春色 | 国产在线传媒 | 夜夜操天天干, | 日日操操 | 国产免费久久av | 国产精品mm | 一本一本久久a久久精品牛牛影视 | 国产一级做a | www欧美色| 免费福利小视频 | 国产视频欧美视频 | 在线免费av网 | 亚洲2019精品 | 国产黑丝袜在线 | 少妇bbw揉bbb欧美 | 日韩激情片在线观看 | 久草视频免费观 | 久久国产精品二国产精品中国洋人 | 精品国产亚洲一区二区麻豆 | 五月婷婷视频在线 | 欧美一区二区在线 | 亚洲国产日韩一区 | 美女网站黄免费 | 久久精品99国产精品亚洲最刺激 | 一区二区视频电影在线观看 | 国产高清免费av | 精品国产电影一区 | 人人擦| 98精品国产自产在线观看 | 在线观看日韩专区 | 欧美日本一二三 | 国产精品久久久久久久久搜平片 | 国产涩图 | 久久久免费精品国产一区二区 | 人人添人人澡人人澡人人人爽 | 免费成人在线观看视频 | 欧美性一级观看 | 91精品欧美 | 日韩天天干 | 91色国产| 亚洲精品久久视频 | 国产又粗又猛又黄视频 | 欧美成年网站 | 成年人在线免费看片 | 久久亚洲人 | 久久亚洲综合国产精品99麻豆的功能介绍 | 成人黄色片在线播放 | 国产免码va在线观看免费 | 久久av免费电影 | 日韩成人中文字幕 | 91人人射| 国产精品99久久久久久久久 | 精品国内自产拍在线观看视频 | 欧美analxxxx| 久久久久日本精品一区二区三区 | 欧美成人基地 | 天天干天天玩天天操 | 中文字幕最新精品 | 91成人免费 | 日韩电影一区二区三区 | 成人91在线 | 亚洲精品无 | 九九九九九国产 | 中文字幕影片免费在线观看 | 国产美女被啪进深处喷白浆视频 | 91精品在线播放 | 00av视频 | 亚洲成人资源在线观看 | 99视频网站 | 亚洲综合视频在线观看 | 国产午夜精品久久久久久久久久 | 精品国产免费人成在线观看 | 丁香花在线视频观看免费 | 超碰人人舔 | 国产女人18毛片水真多18精品 | 久久久久99精品成人片三人毛片 | 丁香五婷| 欧美日韩在线精品 | 久久国产精品一国产精品 | 97超碰影视 | 久久亚洲精品电影 | 精品视频免费看 | 国产一级在线观看视频 | 国产一级在线观看视频 | 91中文字幕在线 | 99精品视频在线观看 | 国产福利在线免费观看 | 日韩电影在线一区 | 成人午夜黄色影院 | 久久艹艹 | 97超碰人人看 | 成人v| 国产精品 日韩 | 国产手机免费视频 | 国产精品a成v人在线播放 | 99视频在线观看免费 | 国产一级片直播 | 中文永久免费观看 | 国产视频二 | 久久亚洲二区 | 国产录像在线观看 | 亚洲成人中文在线 | 欧美有色 | 国内外成人免费在线视频 | 国产一级免费电影 | 97成人精品视频在线播放 | 中文字幕韩在线第一页 | 在线观看www.| 国产露脸91国语对白 | 免费a v观看 | 国产男女无遮挡猛进猛出在线观看 | 天天躁日日躁狠狠躁av中文 | 亚洲在线高清 | 一区二区亚洲精品 | 欧美精品乱码久久久久久 | 99免费看片 | 久久免费黄色网址 | 婷婷5月激情5月 | 免费在线观看一区二区三区 | 日韩中文字幕视频在线观看 | 日韩v欧美v日本v亚洲v国产v | 国产午夜精品一区二区三区在线观看 | 9色在线视频 | 国产盗摄精品一区二区 | 国内精自线一二区永久 | 国产精品v欧美精品v日韩 | 精品国产1区二区 | 黄色av成人在线观看 | 婷婷六月天在线 | 又黄又刺激又爽的视频 | 日本久久久精品视频 | 久久国产精品99久久久久久老狼 | 91亚洲影院 | 1000部国产精品成人观看 | 国产一区二区三区免费视频 | 97在线视频免费观看 | 综合久久久久久 | 九九视频免费 | 久草在线观 | 永久免费毛片 | 成年人国产在线观看 | 免费在线观看黄 | 久久视频6 | 亚洲黄色一级大片 | 不卡中文字幕在线 | 911亚洲精品第一 | 极品美女被弄高潮视频网站 | 97日日碰人人模人人澡分享吧 | 奇米网在线观看 | 中文字幕无吗 | 日本爱爱免费 | 亚洲视频久久久 | 亚洲激情在线观看 | 国产成人精品午夜在线播放 | 国产精品av在线 | 992tv在线成人免费观看 | 久久er99热精品一区二区三区 | 国产尤物在线观看 | 天海翼一区二区三区免费 | 日韩av伦理片 | 国产视频 久久久 | а天堂中文最新一区二区三区 | 日韩高清不卡一区二区三区 | 99热99| 国产99久久久国产精品成人免费 | 蜜桃传媒一区二区 | 欧美日韩二区三区 | 国产亚洲欧美日韩高清 | 日韩av视屏在线观看 | 国产91在线免费视频 | 国产特黄色片 | 五月婷婷综合在线观看 | 中文字幕刺激在线 | 99久久精品网 | 久久色在线播放 | 久久久午夜精品理论片中文字幕 | 国产精品18久久久久久久久 | 欧美日韩国产一区二区三区在线观看 | 久久a久久 | 美国三级黄色大片 | 在线成人看片 | 久久国产精品一区二区 | 午夜影院一区 | 一区二区电影网 | 99精品视频免费观看视频 | www操操| 久久久久麻豆 | 麻豆免费在线视频 | 亚洲精品99久久久久久 | 欧美日韩在线观看视频 | 超碰公开在线观看 | 九九激情视频 | 国产精品久久久久久久久久尿 | 国产精品视频不卡 | 欧美二区三区91 | 亚洲精品久久久久58 | 99视频在线观看视频 | av在线网站观看 | 日韩欧美精品免费 | 国产视频精品免费播放 | 日韩在线在线 | 93久久精品日日躁夜夜躁欧美 | 丁香婷婷色月天 | www.夜色.com | 在线成人免费电影 | 一级黄色片在线 | 亚洲精品人人 | 亚洲精品在线一区二区 | 国产精品久久久久久久电影 | 激情网站网址 | 欧美日韩伦理一区 | 综合天天色 | 久久视频在线观看 | 黄色特级毛片 | 日韩丝袜视频 | 9999在线 | 欧美一级特黄aaaaaa大片在线观看 | 亚洲在线a| 欧美视屏一区二区 | 国产啊v在线观看 | 在线视频观看91 | 精品国内 | 久视频在线播放 | 精品一区二区精品 | 久久久久久国产一区二区三区 | 婷婷视频导航 | 亚洲区视频在线 | 国产精品区二区三区日本 | 97超碰伊人 | 婷婷精品在线视频 | 成人一级视频在线观看 | 欧美一级片免费观看 | 国产中文字幕在线视频 | 玖草影院 | 91精品一| 欧美另类性 | mm1313亚洲精品国产 | 91传媒免费观看 | 天天干夜夜擦 | 国产欧美综合视频 | 久久综合久久久久88 | 欧美色图亚洲图片 | 国产69精品久久99不卡的观看体验 | 黄色日批网站 | 人人爱人人添 | 久久免费一级片 | av中文在线影视 | 麻豆视频在线免费观看 | 国产小视频你懂的 | 一区二区三区四区五区六区 | 九色精品在线 | 成人免费看视频 | 国产精品久免费的黄网站 | 日本女人的性生活视频 | 日韩视频三区 | 99久久久久国产精品免费 | 久草线| 日韩欧美有码在线 | 18性欧美xxxⅹ性满足 | 日韩午夜在线观看 | 亚洲乱码国产乱码精品天美传媒 | 中文字幕亚洲欧美 | 特级西西人体444是什么意思 | 国际av在线 | 2018好看的中文在线观看 | 国产精品免费在线视频 | 手机色站 | 免费情趣视频 | 中文字幕在线视频精品 | 精品久久久久久久久久久院品网 | 久久久国产一区二区三区四区小说 | 精品嫩模福利一区二区蜜臀 | 日韩精品一区二区三区在线视频 | 中文字幕有码在线观看 | 欧美在线a视频 | 天天干 天天摸 天天操 | 亚洲激情在线 | 国产a视频免费观看 | 五月婷婷中文网 | 特级aaa毛片 | 又黄又爽又无遮挡免费的网站 | 日韩av不卡播放 | 欧美日韩国产色综合一二三四 | 国产免费激情久久 | 国产精品大尺度 | 免费能看的黄色片 | 久久久黄视频 | 日韩一区二区三区免费视频 | 亚洲精品国产精品国产 | 中文字幕第一 | 日韩啪啪小视频 | 日本爽妇网 | 日韩三级.com| 国产黄在线观看 | 色综合久| 国产麻豆精品免费视频 | 国产中文字幕三区 | 国产成人av福利 | 国产精品久一 | 国产一线天在线观看 | 六月丁香激情综合 | 国内视频在线观看 | 四虎成人精品永久免费av | 色综合婷婷久久 | 久久精品中文视频 | 久久国产美女 | 伊人天堂网 | 久久综合五月天婷婷伊人 | 97av视频在线观看 | 国产一区二区不卡视频 | 亚洲精品456在线播放乱码 | 国产中文字幕在线看 | 日韩av成人 | 永久免费毛片在线观看 | 成人av一区二区兰花在线播放 | 亚洲欧美一区二区三区孕妇写真 | 欧美日韩国产精品一区二区 | 久久精品国产99国产 | 青青啪| 欧美色图东方 | 日韩av高清在线观看 | 免费在线成人av | 国产精品区二区三区日本 | 国产免费视频一区二区裸体 | 特级西西444www高清大视频 | 午夜视频一区二区 | 中文字幕国产亚洲 | 色欧美成人精品a∨在线观看 | 人人揉人人揉人人揉人人揉97 | 天天干天天射天天操 | 久久99久久99精品免视看婷婷 | 日韩69视频 | 青青草在久久免费久久免费 | 日本精品视频在线 | 欧美一级xxxx | 久草精品在线播放 | 国产福利不卡视频 | www免费看片com| 国产一二区在线观看 | 午夜av不卡 | 亚洲精品国精品久久99热 | 中文字幕在线视频国产 | 九九热.com | 黄色免费网| 免费看的黄网站 | 成人av片在线观看 | 欧美日韩国产色综合一二三四 | 日韩一区二区三区在线看 | 久草国产在线观看 | 综合网色| 干干日日| 国产精品久久久久av福利动漫 | 欧美aa级| 在线天堂亚洲 | 精品一区二区免费视频 | 四虎国产精品成人免费影视 | 久久精品www人人爽人人 | 亚洲欧美经典 | 午夜久久久久久久 | 999超碰 | 亚洲在线激情 | 天天综合成人 | 香蕉视频亚洲 | 国产福利一区二区在线 | 久久撸在线视频 | 国产精品三级视频 | 国产一区二区免费在线观看 | 嫩草av在线 | 激情五月在线观看 | 国产精品毛片久久久久久 | 婷婷视频导航 | 伊人天天色 |