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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

适用于Java开发人员的Elasticsearch:Java的Elasticsearch

發布時間:2023/12/3 java 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 适用于Java开发人员的Elasticsearch:Java的Elasticsearch 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文是我們學院課程的一部分,該課程的標題為Java開發人員的Elasticsearch教程 。

在本課程中,我們提供了一系列教程,以便您可以開發自己的基于Elasticsearch的應用程序。 我們涵蓋了從安裝和操作到Java API集成和報告的廣泛主題。 通過我們簡單易懂的教程,您將能夠在最短的時間內啟動并運行自己的項目。 在這里查看 !

1.簡介

在本教程的上半部分,我們僅通過命令行工具通過利用其大量RESTful API來掌握與Elasticsearch建立有意義的對話的技能。 這是非常少的知識,但是,當您開發Java / JVM應用程序時,您將需要比命令行更好的選擇。 幸運的是, Elasticsearch在這一領域提供了多種產品。

目錄

1.簡介 2.使用Java客戶端API 3.使用Java Rest客戶端 4.使用測試套件 5。結論 6.接下來

在本教程的這一部分中,我們將學習如何通過本地Java API與Elasticsearch進行通信。 我們的方法是編寫代碼并在幾個Java應用程序上工作,使用Apache Maven進行構建管理,使用出色的Spring Framework進行依賴關系接線和控制反轉 ,并使用出色的JUnit / AssertJ作為測試支架。

2.使用Java客戶端API

從早期版本開始, Elasticsearch隨每個發行版一起分發專用的Java客戶端API ,也稱為傳輸客戶端。 它談到了Elasticsearch本機傳輸協議,因此施加了這樣的約束:客戶端庫的版本應至少與您使用的Elasticsearch發行版的主要版本匹配(理想情況下,客戶端應具有完全相同的版本)。

當我們使用Elasticsearch版本5.2.0 ,將相應的客戶端版本依賴項添加到我們的pom.xml文件中是有意義的。

<dependency><groupId>org.elasticsearch.client</groupId><artifactId>transport</artifactId><version>5.2.0</version> </dependency>

由于我們選擇了Spring Framework來驅動我們的應用程序,因此實際上我們唯一需要的就是傳輸客戶端配置。

@Configuration public class ElasticsearchClientConfiguration {@Bean(destroyMethod = "close")TransportClient transportClient() throws UnknownHostException {return new PreBuiltTransportClient(Settings.builder()-.put(ClusterName.CLUSTER_NAME_SETTING.getKey(), "es-catalog").build()).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));} }

PreBuiltTransportClient遵循構建器模式 (與我們很快將要看到的大多數類一樣)來構造TransportClient實例,一旦存在,我們就可以使用Spring Framework支持的注入技術來訪問它:

@Autowired private TransportClient client;

CLUSTER_NAME_SETTING值得我們注意:它應該與我們要連接的Elasticsearch集群的名稱完全匹配,在本例中為es-catalog 。

太好了,我們已經初始化了傳輸客戶端,那么該如何處理呢? 本質上,傳輸客戶端公開了很多方法(遵循流暢的界面樣式),以打開對Java代碼中所有Elasticsearch API的訪問。 要邁出第一步,應該注意的是,傳輸客戶端在常規API和管理API之間有明確的分隔。 后者可以通過在傳輸客戶端實例上調用admin()方法獲得。

在翻開袖子弄臟手之前,有必要提到, Elasticsearch Java API設計為完全異步的,因此它們圍繞兩個關鍵抽象: ActionFuture<?>和ListenableActionFuture<?> 。 實際上, ActionFuture<?>只是一個普通的Java Future <?> ,其中添加了一些少數方法,請繼續關注。 另一方面, ListenableActionFuture<?>是更強大的抽象,具有執行回調并將執行結果通知調用方的能力。

選擇一種樣式完全取決于您的應用程序需求,因為這兩種樣式都有其優缺點。 事不宜遲,讓我們繼續前進,確保我們的Elasticsearch集群運行狀況良好并已準備就緒。

final ClusterHealthResponse response = client.admin().cluster().health(Requests.clusterHealthRequest().waitForGreenStatus().timeout(TimeValue.timeValueSeconds(5))).actionGet();assertThat(response.isTimedOut()).withFailMessage("The cluster is unhealthy: %s", response.getStatus()).isFalse();

該示例非常簡單明了。 我們要做的是向Elasticsearch集群查詢其狀態,同時明確要求最多等待5 seconds以使狀態變為green (如果不是這種情況)。 在client.admin().cluster().health(...) , client.admin().cluster().health(...)返回ActionFuture<?>所以我們必須調用actionGet方法之一來獲取響應。

這是使用Elasticsearch Java API的另一種稍有不同的方式,這次使用了prepareXxx方法家族。

final ClusterHealthResponse response = client.admin().cluster().prepareHealth().setWaitForGreenStatus().setTimeout(TimeValue.timeValueSeconds(5)).execute().actionGet();assertThat(response.isTimedOut()).withFailMessage("The cluster is unhealthy: %s", response.getStatus()).isFalse();

盡管這兩個代碼段均導致絕對相同的結果,但后一個代碼段是在鏈的末尾調用client.admin().cluster().prepareHealth().execute()方法,該方法返回ListenableActionFuture<?> 。 在這個例子中,它并沒有太大的區別,但是請牢記這一點,因為我們將看到更多有趣的用例,其中這樣的細節實際上會改變游戲規則。

最后,最后但并非最不重要的一點是,任何API的異步特性(并且Elasticsearch Java API也不例外)假定對該操作的調用將花費一些時間,并且調用者有責任決定如何處理該操作。 到目前為止,我們僅在ActionFuture<?>實例上調用actionGet ,它將有效地將異步執行轉換為阻塞(或ActionFuture<?> ,同步)調用。 此外,我們沒有在同意放棄之前等待執行完成的時間方面指定期望。 我們可以做得更好,在本節的其余部分中,我們將解決這兩點。

一旦我們的Elasticsearch集群狀態全部變為green ,就該創建一些索引了,就像我們在本教程的上一部分中所做的一樣,但是這次僅使用Java API。 創建catalog索引之前,最好確保catalog索引尚不存在。

final IndicesExistsResponse response = client.admin().indices().prepareExists("catalog").get(TimeValue.timeValueMillis(100));if (!response.isExists()) {... }

請注意,在上面的代碼段中,我們提供了完成操作的顯式超時get(TimeValue.timeValueMillis(100)) ,這實際上是execute().actionGet(TimeValue.timeValueMillis(100))的快捷方式。

對于catalog索引設置和映射類型,我們將使用與本教程上半部分相同的JSON文件catalog-index.json 。 我們將遵循Apache Maven約定將其放置在src/test/resources文件夾中。

@Value("classpath:catalog-index.json") private Resource index;

幸運的是, Spring Framework大大簡化了對類路徑資源的注入,因此我們在這里不需要做太多事情就可以訪問catalog-index.json內容并將其直接提供給Elasticsearch Java API。

try (final ByteArrayOutputStream out = new ByteArrayOutputStream()) {Streams.copy(index.getInputStream(), out);final CreateIndexResponse response = client.admin().indices().prepareCreate("catalog").setSource(out.toByteArray()).setTimeout(TimeValue.timeValueSeconds(1)).get(TimeValue.timeValueSeconds(2));assertThat(response.isAcknowledged()).withFailMessage("The index creation has not been acknowledged").isTrue(); }

該代碼塊說明了利用setSource方法調用來處理Elasticsearch Java API的另一種方法。 簡而言之,我們只是以不透明的Blob(或字符串)的形式自己提供請求有效負載,并將其按原樣發送到Elasticsearch節點。 但是,我們可以改用純Java數據結構,例如:

final CreateIndexResponse response = client.admin().indices().prepareCreate("catalog").setSettings(...).setMapping("books", ...).setMapping("authors", ...).setTimeout(TimeValue.timeValueSeconds(1)).get(TimeValue.timeValueSeconds(2));

好的,到此,我們將結束傳輸客戶端管理API并切換到文檔和搜索API,因為您通常會使用這些API。 我們記得, Elasticsearch說的是JSON,因此我們必須以某種方式使用Java將書籍和作者轉換為JSON表示形式。 實際上, Elasticsearch Java API通過支持對名為XContent的內容的通用抽象來提供XContent ,例如:

final XContentBuilder source = JsonXContent.contentBuilder().startObject().field("title", "Elasticsearch: The Definitive Guide. ...").startArray("categories").startObject().field("name", "analytics").endObject().startObject().field("name", "search").endObject().startObject().field("name", "database store").endObject().endArray().field("publisher", "O'Reilly").field("description", "Whether you need full-text search or ...").field("published_date", new LocalDate(2015, 02, 07).toDate()).field("isbn", "978-1449358549").field("rating", 4).endObject();

具有文檔表示形式后,我們可以將其發送給Elasticsearch進行索引。 為了兌現承諾,這次我們希望采用真正的異步方式,而不是等待響應,而是以ActionListener<IndexResponse>的形式提供通知回調。

client.prepareIndex("catalog", "books").setId("978-1449358549").setContentType(XContentType.JSON).setSource(source).setOpType(OpType.INDEX).setRefreshPolicy(RefreshPolicy.WAIT_UNTIL).setTimeout(TimeValue.timeValueMillis(100)).execute(new ActionListener() {@Overridepublic void onResponse(IndexResponse response) {LOG.info("The document has been indexed with the result: {}", response.getResult());}@Overridepublic void onFailure(Exception ex) {LOG.error("The document has been not been indexed", ex);}});

很好,所以我們在books有了第一個文件! 那authors呢? 提醒一下,這本書有多個作者,因此是使用文檔批量索引的絕佳時機。

final XContentBuilder clintonGormley = JsonXContent.contentBuilder().startObject().field("first_name", "Clinton").field("last_name", "Gormley").endObject();final XContentBuilder zacharyTong = JsonXContent.contentBuilder().startObject().field("first_name", "Zachary").field("last_name", "Tong").endObject();

XContent部分很清楚,坦白地說,您可能永遠都不會使用這種選項,而是希望對真實的類進行建模,并使用一種出色的Java庫來自動進行JSON轉換。 但是以下片段非常有趣。

final BulkResponse response = client.prepareBulk().add(Requests.indexRequest("catalog").type("authors").id("1").source(clintonGormley).parent("978-1449358549").opType(OpType.INDEX)).add(Requests.indexRequest("catalog").type("authors").id("2").source(zacharyTong).parent("978-1449358549").opType(OpType.INDEX)).setRefreshPolicy(RefreshPolicy.WAIT_UNTIL).setTimeout(TimeValue.timeValueMillis(500)).get(TimeValue.timeValueSeconds(1));assertThat(response.hasFailures()).withFailMessage("Bulk operation reported some failures: %s", response.buildFailureMessage()).isFalse();

我們正在單批發送兩個針對authors集合的索引請求。 您可能想知道這個parent("978-1449358549")含義,要回答這個問題,我們必須回想起, books和authors是使用父母/子女關系建模的。 因此,在這種情況下, parent鍵是對books各個父文檔的引用(通過_id屬性)。

做得好,所以我們知道如何使用索引以及如何使用Elasticsearch傳輸客戶端Java API對文檔建立索引。 現在是搜索時間!

final SearchResponse response = client.prepareSearch("catalog").setTypes("books").setSearchType(SearchType.DFS_QUERY_THEN_FETCH).setQuery(QueryBuilders.matchAllQuery()).setFrom(0).setSize(10).setTimeout(TimeValue.timeValueMillis(100)).get(TimeValue.timeValueMillis(200));assertThat(response.getHits().hits()).withFailMessage("Expecting at least one book to be returned").isNotEmpty();

可以提出的最簡單的搜索標準是匹配所有文檔,這就是我們在上面的摘錄中所做的(請注意,我們明確將返回的結果數限制為10文檔)。

幸運的是, Elasticsearch Java API以QueryBuilders和QueryBuilder類的形式全面實現了Query DSL ,因此編寫(和維護)復雜的查詢非常容易。 作為練習,我們將構建與本教程的上一部分相同的復合查詢:

final QueryBuilder query = QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery("rating").gte(4)).must(QueryBuilders.nestedQuery("categories", QueryBuilders.matchQuery("categories.name", "analytics"),ScoreMode.Total)).must(QueryBuilders.hasChildQuery("authors", QueryBuilders.termQuery("last_name", "Gormley"),ScoreMode.Total));

該代碼看起來漂亮,簡潔,易于閱讀。 如果您熱衷于使用Java編程語言的靜態導入功能,則查詢看起來會更加緊湊。

final SearchResponse response = client.prepareSearch("catalog").setTypes("books").setSearchType(SearchType.DFS_QUERY_THEN_FETCH).setQuery(query).setFrom(0).setSize(10).setFetchSource(new String[] { "title", "publisher" }, /* includes */ new String[0] /* excludes */).setTimeout(TimeValue.timeValueMillis(100)).get(TimeValue.timeValueMillis(200));assertThat(response.getHits().hits()).withFailMessage("Expecting at least one book to be returned").extracting("sourceAsString", String.class).hasOnlyOneElementSatisfying(source -> {assertThat(source).contains("Elasticsearch: The Definitive Guide.");});

為了使兩個版本的查詢保持相同,我們還通過setFetchSource方法提示搜索請求,我們只對返回文檔源的title和Publisher屬性感興趣。

好奇的讀者可能想知道如何將聚合與搜索請求一起使用。 這是一個非常好的話題,所以讓我們先討論一下。 與Query DSL一起 , Elasticsearch Java API還提供了聚合DSL ,圍繞AggregationBuilders和AggregationBuilder類展開。 例如,這就是我們可以通過publisher屬性構建存儲桶聚合的方法。

final AggregationBuilder aggregation = AggregationBuilders.terms("publishers").field("publisher").size(10);

定義好聚合之后,我們可以使用addAggregation方法調用將它們注入搜索請求中,如下面的代碼片段所示:

final SearchResponse response = client.prepareSearch("catalog").setTypes("books").setSearchType(SearchType.DFS_QUERY_THEN_FETCH).setQuery(QueryBuilders.matchAllQuery()).addAggregation(aggregation).setFrom(0).setSize(10).setTimeout(TimeValue.timeValueMillis(100)).get(TimeValue.timeValueMillis(200));final StringTerms publishers = response.getAggregations().get("publishers"); assertThat(publishers.getBuckets()).extracting("keyAsString", String.class).contains("O'Reilly");

匯總的結果在響應中可用,并且可以通過引用匯總名稱(例如本例中的publishers來檢索。 但是要謹慎并謹慎使用正確的聚合類型,以免以ClassCastException的形式出現意外。 因為已經定義了發布者聚合來將術語分組到存儲桶中,所以我們可以安全地將其從響應轉換為StringTerms類實例。

3.使用Java Rest客戶端

與使用Elasticsearch Java客戶端API相關的缺點之一是要求與您正在運行的Elasticsearch版本(獨立版本或集群版本)二進制兼容。

幸運的是,自5.0.0分支的第一個版本發布以來, Elasticsearch在表上帶來了另一個選擇: Java REST client 。 它使用HTTP協議來傾訴Elasticsearch通過調用它的RESTful API端點,是無視的版本Elasticsearch (從字面上看,它是兼容所有Elasticsearch版本)。

應當指出的是,盡管Java REST客戶端相當低級,并且使用起來不像Java客戶端API那樣方便,但實際上并非如此。 但是,出于很多原因,人們可能更喜歡使用Java REST客戶端而不是Java客戶端API與Elasticsearch進行通信,因此值得進行自己的討論。 首先,讓我們將相應的依賴項包含到我們的Apache Maven pom.xml文件中。

<dependency><groupId>org.elasticsearch.client</groupId><artifactId>rest</artifactId><version>5.2.0</version> </dependency>

從配置的角度來看,我們只需要通過調用RestClient.builder方法來構造RestClient的實例。

@Configuration public class ElasticsearchClientConfiguration {@Bean(destroyMethod = "close")RestClient transportClient() {return RestClient.builder(new HttpHost("localhost", 9200)).setRequestConfigCallback(new RequestConfigCallback() {@Overridepublic Builder customizeRequestConfig(Builder builder) {return builder.setConnectTimeout(1000).setSocketTimeout(5000);}}).build();} }

我們在這里取得了一些進步,但是請特別注意正確超時的配置,因為Java REST客戶端沒有提供(至少目前)基于每個請求級別指定超時的方法。 這樣,我們可以使用Spring Framework為我們提供的相同接線技術,在任何地方注入RestClient實例:

@Autowired private RestClient client;

為了公平地比較Java客戶端API和Java REST客戶端 ,我們將剖析上一部分中看到的幾個示例,并通過檢查Elasticsearch集群運行狀況來確定階段。

@Test public void esClusterIsHealthy() throws Exception {final Response response = client.performRequest(HttpGet.METHOD_NAME, "_cluster/health", emptyMap());final Object json = defaultConfiguration().jsonProvider().parse(EntityUtils.toString(response.getEntity()));assertThat(json, hasJsonPath("$.status", equalTo("green"))); }

確實,差異是顯而易見的。 您可能會猜到, Java REST客戶端實際上是更通用,知名和受人尊敬的Apache Http Client庫的一個瘦包裝。 響應以字符串或字節數組的形式返回,調用者有責任將其轉換為JSON并提取必要的數據。 為了在測試斷言中處理該問題,我們已經啟用了出色的JsonPath庫,但是您可以在這里自由選擇。

一組performRequest方法是使用Java REST客戶端 API進行同步(或阻止)通信的典型方法。 另外,還有一類performRequestAsync方法,應該在完全異步的流中使用。 在下一個示例中,我們將使用其中之一來將文檔編books 。

用Java語言表示類似于JSON的結構的最簡單方法是使用普通的舊Map<String, Object>如下面的代碼片段所示。

final Map<String, Object> source = new LinkedHashMap<>(); source.put("title", "Elasticsearch: The Definitive Guide. ..."); source.put("categories", new Map[] {singletonMap("name", "analytics"),singletonMap("name", "search"),singletonMap("name", "database store")} ); source.put("publisher", "O'Reilly"); source.put("description", "Whether you need full-text search or ..."); source.put("published_date", "2015-02-07"); source.put("isbn", "978-1449358549"); source.put("rating", 4);

現在,我們需要將此Java結構轉換為有效的JSON字符串。 這樣做有很多方法,但是我們將利用json-smart庫,因為它已經可以作為JsonPath庫的傳遞依賴項使用 。

final HttpEntity payload = new NStringEntity(JSONObject.toJSONString(source), ContentType.APPLICATION_JSON);

準備好有效負載后,沒有什么可以阻止我們調用Elasticsearch的 Indexing API將一本書添加到books集合中。

client.performRequestAsync(HttpPut.METHOD_NAME, "catalog/books/978-1449358549",emptyMap(),payload,new ResponseListener() {@Overridepublic void onSuccess(Response response) {LOG.info("The document has been indexed successfully");}@Overridepublic void onFailure(Exception ex) {LOG.error("The document has been not been indexed", ex);}});

這次我們決定不等待響應,而是提供一個回調( ResponseListener實例),以保持流真正異步。 最后,最好了解執行或多或少切合實際的搜索請求并解析結果所需的內容。

如您所料, Java REST客戶端不提供圍繞Query DSL的任何流暢的API,因此我們不得不再回退一次Map<String, Object>以便構建搜索條件。

final Map<String, Object> authors = new LinkedHashMap<>(); authors.put("type", "authors"); authors.put("query", singletonMap("term",singletonMap("last_name", "Gormley")) );final Map<String, Object> categories = new LinkedHashMap<>(); categories.put("path", "categories"); categories.put("query",singletonMap("match", singletonMap("categories.name", "search")) );final Map<String, Object> query = new LinkedHashMap<>(); query.put("size", 10); query.put("_source", new String[] { "title", "publisher" }); query.put("query", singletonMap("bool",singletonMap("must", new Map[] {singletonMap("range",singletonMap("rating", singletonMap("gte", 4))),singletonMap("has_child", authors),singletonMap("nested", categories)})) );

公開解決問題需要付出的代價是編寫許多繁瑣且容易出錯的代碼。 在這方面, Java客戶端API的一致性和簡潔性確實產生了巨大的差異。 您可能會爭辯說,實際上可能有人依賴更簡單,更安全的技術,例如數據傳輸對象 , 值對象 ,或者甚至具有帶有占位符的JSON搜索查詢模板,但重點是Java REST客戶端在此提供了一些幫助。時刻。

final HttpEntity payload = new NStringEntity(JSONObject.toJSONString(query), ContentType.APPLICATION_JSON);final Response response = client.performRequest(HttpPost.METHOD_NAME, "catalog/books/_search", emptyMap(), payload);final Object json = defaultConfiguration().jsonProvider().parse(EntityUtils.toString(response.getEntity()));assertThat(json, hasJsonPath("$.hits.hits[0]._source.title", containsString("Elasticsearch: The Definitive Guide.")));

在此處添加的內容不多,只需查閱格式的Search API文檔,然后從響應中提取您感興趣的詳細信息,就像我們通過聲明_source的title property所做的那樣。

到此,我們結束了關于Java REST client的討論。 坦率地說,與選擇Java生態系統所具有的通用HTTP客戶端之一相比,使用它是否有任何好處還不清楚。 確實,這確實是一個令人擔憂的問題,但是請記住, Java REST客戶端是Elasticsearch系列的新成員,希望我們很快就會看到很多激動人心的功能。

4.使用測試套件

隨著我們的應用程序變得越來越復雜和分散,正確的測試變得前所未有的重要。 多年來, Elasticsearch提供了卓越的測試工具 ,以簡化嚴重依賴其搜索和分析功能的應用程序的測試。 更具體地說,您的項目中可能需要兩種測試:

  • 單元測試 :那些正在獨立測試單個單元(例如fe類)的測試,通常不需要具有正在運行的Elasticsearch節點或集群。 這些測試由ESTestCase和ESTokenStreamTestCase支持。
  • 集成測試 :這些測試正在測試完整的流程,通常需要至少一個運行的Elasticsearch節點(或集群,以強調更實際的場景)。 這些測試由ESIntegTestCase , ESSingleNodeTestCase和ESBackCompatTestCase 。

讓我們再翻一次袖子,學習如何使用Elasticsearch提供的測試支架來開發我們自己的測試套件。 我們將從聲明依賴關系開始,仍然使用Apache Maven 。

<dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-test-framework</artifactId><version>6.4.0</version><scope>test</scope> </dependency><dependency><groupId>org.elasticsearch.test</groupId><artifactId>framework</artifactId><version>5.2.0</version><scope>test</scope> </dependency>

盡管這不是絕對必要的,但我們還將顯式依賴項添加到JUnit ,將其版本提高到4.12 。

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope><exclusions><exclusion><groupId>org.hamcrest</groupId><artifactId>hamcrest-core</artifactId></exclusion></exclusions> </dependency>

我們在這里需要提請注意: Elasticsearch測試框架對依賴項異常敏感,確保您的應用程序不會陷入每個Java開發人員都熟知的jar hell的問題 。 Elasticsearch測試框架所做的一項預檢查是確保classpath中沒有重復的類。 通常,您可能會在此過程中使用其他出色的測試庫,但如果您的Elasticsearch測試用例突然開始無法通過初始化階段,則很可能是由于檢測到jar地獄問題,因此必須進行一些排除。

還有一件事,很可能您需要在測試運行期間通過將tests.security.manager屬性設置為false來關閉安全管理器。 可以通過將-Dtests.security.manager=false參數直接傳遞給JVM或使用Apache Maven插件配置來完成。

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.19.1</version><configuration><argLine>-Dtests.security.manager=false</argLine></configuration> </plugin>

太棒了,所有前提條件都得到了解釋,我們都準備開始開發第一個測試用例。 適用于Elasticsearch的上下文中的單元測試對于測試您自己的分析器 , 令牌生成 器 , 令牌過濾器和字符過濾器非常有用。 在這方面,我們沒有做太多事情,但是集成測試是一個截然不同的故事。 讓我們看看如何啟動具有3節點的Elasticsearch集群。

@ClusterScope(numDataNodes = 3) public class ElasticsearchClusterTest extends ESIntegTestCase { }

……從字面上看,就是這樣。 當然,盡管群集已啟動,但它沒有索引或未預先配置的內容。 讓我們添加一些測試背景,以使用相同的catalog-index.json文件創建catalog索引及其映射類型。

@Before public void setUpCatalog() throws IOException {try (final ByteArrayOutputStream out = new ByteArrayOutputStream()) {Streams.copy(getClass().getResourceAsStream("/catalog-index.json"), out);final CreateIndexResponse response = admin().indices().prepareCreate("catalog").setSource(out.toByteArray()).get();assertAcked(response);ensureGreen("catalog");} }

如果您已經識別出此代碼,那是因為我們使用的是之前了解的相同傳輸客戶端! 如果您需要Java REST客戶端實例, Elasticsearch測試腳手架會在client()或admin()方法之后為您提供該功能,并與getRestClient()一起提供。 每次測試運行后清理集群都是一件好事,幸運的是,我們可以使用cluster()方法來訪問幾個非常有用的操作,例如:

@After public void tearDownCatalog() throws IOException, InterruptedException {cluster().wipeIndices("catalog"); }

總體而言, Elasticsearch測試工具的目標是兩個目標:簡化最常見的任務(我們已經看到了client() , admin() , cluster()實際運行)以及輕松進行驗證,聲明或期望(例如, ensureGreen(...) , assertAcked(...) )。 官方文檔有專門的部分介紹了輔助方法和斷言,因此請看一看。

首先,空索引中應該沒有文檔,因此我們的第一個測試用例將明確聲明這一事實。

@Test public void testEmptyCatalogHasNoBooks() {final SearchResponse response = client().prepareSearch("catalog").setTypes("books").setSearchType(SearchType.DFS_QUERY_THEN_FETCH).setQuery(QueryBuilders.matchAllQuery()).setFetchSource(false).get();assertNoSearchHits(response); }

一個簡單,但是創建真實文檔呢? Elasticsearch測試框架具有多種有用的方法,可以為大多數類型生成隨機值。 我們可以利用它來創建一本書,將其添加到圖書catalog索引中并對其發出查詢。

@Test public void testInsertAndSearchForBook() throws IOException {final XContentBuilder source = JsonXContent.contentBuilder().startObject().field("title", randomAsciiOfLength(100)).startArray("categories").startObject().field("name", "analytics").endObject().startObject().field("name", "search").endObject().startObject().field("name", "database store").endObject().endArray().field("publisher", randomAsciiOfLength(20)).field("description", randomAsciiOfLength(200)).field("published_date", new LocalDate(2015, 02, 07).toDate()).field("isbn", "978-1449358549").field("rating", randomInt(5)).endObject();index("catalog", "books", "978-1449358549", source);refresh("catalog");final QueryBuilder query = QueryBuilders.nestedQuery("categories", QueryBuilders.matchQuery("categories.name", "analytics"),ScoreMode.Total);final SearchResponse response = client().prepareSearch("catalog").setTypes("books").setSearchType(SearchType.DFS_QUERY_THEN_FETCH).setQuery(query).setFetchSource(false).get();assertSearchHits(response, "978-1449358549"); }

如您所見,除了categories之外,大多數書籍屬性都是隨機生成的,因此我們可以通過它們可靠地進行搜索。

Elasticsearch測試支持提供了許多有趣的機會,不僅可以測試成功的結果,而且可以模擬現實的集群行為和錯誤的條件(這里的internalCluster()提供的輔助方法非常有用)。 對于像Elasticsearch這樣的復雜分布式系統,此類測試的價值是無價的,因此請利用可用的選項來確保部署到生產中的代碼健壯并能夠應對故障。 舉個簡單的例子,我們可以在運行搜索請求時關閉隨機數據節點,并斷言它們仍在處理中。

@Test public void testClusterNodeIsDown() throws IOException {internalCluster().stopRandomDataNode();final SearchResponse response = client().prepareSearch("catalog").setTypes("books").setSearchType(SearchType.DFS_QUERY_THEN_FETCH).setQuery(QueryBuilders.matchAllQuery()).setFetchSource(false).get();assertNoSearchHits(response); }

我們只是簡單介紹了Elasticsearch測試工具的功能。 希望您在組織中實踐測試驅動的開發,并且我們所研究的示例可以很好地為您提供起點。

5。結論

在本教程的這一部分中,我們學習了Elasticsearch開箱即用提供的兩種Java客戶端API: Transport客戶端和REST客戶端 。 您可能會發現很難選擇要使用哪種Java客戶端API,但是總的來說,它高度依賴于應用程序。 在大多數情況下, 傳輸客戶端是最佳選擇,但是,如果您的項目僅使用幾個Elasticsearch API(或功能的非常有限的子集),則REST客戶端可能是一個更好的選擇。 另外,我們不要忘記Java REST客戶端是相當新的,并且肯定會在將來的版本中進行改進,因此請密切注意它。

當我們剖析傳輸客戶端時 ,已經指出了它的完全異步性質。 盡管這絕對是一件好事,但我們已經看到它基于回調(更確切地說是偵聽器),這可能會Swift導致稱為回調hell的問題。 強烈建議盡早解決此問題(幸運的是,有很多庫和可用的替代品,例如RxJava 2和Project Reactor , Java 9也在趕上)。

最后但并非最不重要的一點是,我們瀏覽了Elasticsearch的 測試工具 ,并有機會認識到它為Java / JVM開發人員提供的巨大幫助。

6.接下來

在接下來的部分 ,即教程的最后一部分 ,我們將討論圍繞Elasticsearch的出色項目的生態系統。 希望您再一次對Elasticsearch的功能感到驚訝,為您打開它的適用性的新視野。

所有項目的完整源代碼都可以下載: elasticsearch-client-rest , elasticsearch-testing , elasticsearch-client-java

翻譯自: https://www.javacodegeeks.com/2017/03/elasticsearch-java-developers-elasticsearch-java.html

總結

以上是生活随笔為你收集整理的适用于Java开发人员的Elasticsearch:Java的Elasticsearch的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

狠狠色综合欧美激情 | 亚洲一区日韩在线 | 色婷婷伊人 | 亚洲精品日韩在线观看 | 日韩av免费在线看 | 欧美超碰在线 | 色播亚洲婷婷 | 黄色视屏在线免费观看 | 色综合天| 日韩精品视频一二三 | 91网站观看 | 欧美性生活久久 | 精品亚洲免a | 国产一级高清 | 亚洲人成影院在线 | av在线看网站| 免费成人在线视频网站 | 亚洲国产精品500在线观看 | 亚州精品在线视频 | 久久久午夜影院 | 免费在线播放黄色 | 午夜精品999 | 麻豆免费在线播放 | 五月婷婷六月丁香激情 | 日韩在线视频网 | 国产国产人免费人成免费视频 | 成人性生活大片 | 夜夜夜草| 天天干天天干天天射 | 午夜手机电影 | 国产高清精 | 激情久久久久久久久久久久久久久久 | 97在线公开视频 | 在线观看视频中文字幕 | 天天天在线综合网 | 婷婷丁香激情综合 | 国产精品久久在线 | 久草在线电影网 | 国内精品久久久久久久久久久 | 欧美久久久一区二区三区 | 日日日干 | 日本黄色片一区二区 | 欧美日韩在线观看一区 | 国产亚洲视频在线免费观看 | 精品999在线 | 99精品国产99久久久久久福利 | 日韩在线观看网址 | 干综合网| 激情在线网站 | 日韩,精品电影 | 91喷水| 91中文字幕在线视频 | 国产不卡片 | 日韩在线大片 | 国产精品 9999 | 久久久电影网站 | 国产中文字幕久久 | 久久亚洲综合国产精品99麻豆的功能介绍 | 香蕉视频日本 | 97国产一区二区 | 91成人短视频在线观看 | 国产青春久久久国产毛片 | 久久爽久久爽久久av东京爽 | 日韩精品久久久久久久电影99爱 | 日日日网| 曰韩精品 | 国产精品视频999 | 青草视频在线播放 | 中文字幕丝袜制服 | 成 人 黄 色 视频 免费观看 | 高清av中文在线字幕观看1 | 狠狠干夜夜操天天爽 | 国产视频一区精品 | 三级黄色在线 | 一级黄色片在线 | 免费精品视频在线观看 | 亚洲精品福利在线 | 国产99久久久国产精品免费看 | 久久视频在线观看中文字幕 | 亚洲精品日韩在线观看 | 日韩肉感妇bbwbbwbbw | 91网站在线视频 | 精品国产一区二区三区不卡 | 日韩精品一区二区三区免费观看视频 | 欧美视频日韩视频 | 十八岁免进欧美 | 97久久久免费福利网址 | 久久婷亚洲五月一区天天躁 | 久久久久福利视频 | 日本激情动作片免费看 | 欧美日韩精品在线一区二区 | 欧美日韩国产在线一区 | 亚洲va欧美va人人爽春色影视 | 亚洲日本va午夜在线影院 | 日产中文字幕 | 四虎免费在线观看视频 | 91成人欧美 | 久久久精品欧美 | 免费人成网ww44kk44 | 亚洲乱码在线观看 | 日日操操操| 91九色成人蝌蚪首页 | 蜜臀av夜夜澡人人爽人人桃色 | 成人av电影免费 | 青青草国产免费 | 欧美一级裸体视频 | 国产精品黄色av | 久久精品视频一 | 91av在线看 | 欧美精品免费在线 | 欧美韩国日本在线观看 | www.久久免费视频 | 精品国产一区二区三区四区在线观看 | 成人a视频片观看免费 | 中文在线最新版天堂 | 久草在线免费看视频 | 国产黄色特级片 | 粉嫩aⅴ一区二区三区 | 国产五月色婷婷六月丁香视频 | 狠狠色狠狠色综合日日92 | 欧美久久久久久久 | 中文字幕免费播放 | 日韩xxxxxxxxx | 69性欧美 | 日韩欧美高清视频在线观看 | 久久xxxx| 精品国产理论片 | 免费黄色小网站 | 黄色官网在线观看 | 大荫蒂欧美视频另类xxxx | 2024av| 国内精品亚洲 | 中文字幕av播放 | 久久免费黄色网址 | 91av免费观看 | 国产在线毛片 | 色视频国产直接看 | 成人97人人超碰人人99 | 狠狠色噜噜狠狠狠狠 | 天天爽夜夜爽精品视频婷婷 | 97av影院| 国产成人精品一区二区三区福利 | 三级黄色在线观看 | 国产精品久久久 | www黄色软件 | 欧美 日韩精品 | 免费观看mv大片高清 | 免费观看视频的网站 | 午夜精品视频在线 | 韩国视频一区二区三区 | 欧美精品久久久久久久免费 | 日韩成人黄色av | 九九99靖品| 久久久一本精品99久久精品66 | 日韩精品在线看 | 91高清一区| 国产成人三级在线播放 | 色综合五月 | 人人精久 | 天堂av官网| 成人国产网址 | 韩国精品福利一区二区三区 | 亚洲 成人 一区 | 中文字幕在线观看网 | 免费成人av在线看 | 日韩精品一区二区三区视频播放 | 看全黄大色黄大片 | 国内丰满少妇猛烈精品播 | 亚洲午夜电影网 | 五月天久久综合 | 国产精品 9999 | 亚洲一级在线观看 | 91免费视频国产 | 国产精品自拍在线 | 中文亚洲欧美日韩 | 天天av天天 | 五月激情天 | 精品国产99国产精品 | 国产在线高清视频 | 国产手机在线观看视频 | 国产精品麻豆果冻传媒在线播放 | 91久久国产综合精品女同国语 | 久久久久综合 | 国产三级久久久 | 欧美精品首页 | 高清一区二区三区 | 精品亚洲男同gayvideo网站 | 久久精品一区二区三区四区 | 久久精品毛片基地 | 在线观看视频黄色 | 日韩综合一区二区 | 开心婷婷色 | 久久综合久久综合这里只有精品 | 五月天最新网址 | 国产美女精品在线 | 国产中文字幕免费 | 黄色一级影院 | 成人影视免费看 | 午夜精品福利一区二区三区蜜桃 | 欧洲精品视频一区 | 欧美成人影音 | 免费在线播放av电影 | 黄色精品在线看 | 国产一级视频在线 | av黄色免费看 | 香蕉视频在线播放 | 99久久精品无免国产免费 | 日韩av成人免费看 | 又黄又爽又色无遮挡免费 | 人人干天天干 | 青青河边草免费视频 | 有码一区二区三区 | 精品成人免费 | www.婷婷色 | 国内精品久久久久影院一蜜桃 | av天天澡天天爽天天av | 黄色一区三区 | 亚洲成a人片在线观看网站口工 | 亚洲精品理论片 | 久久高清精品 | 久草在线免费色站 | 日韩激情视频在线观看 | 福利视频精品 | 久久精品成人 | 色中色亚洲 | 免费观看黄色12片一级视频 | 国产精品免费在线视频 | 91九色国产蝌蚪 | 国产精品色婷婷视频 | 国产精品一区二区精品视频免费看 | 天天操天天射天天插 | 在线观看免费黄视频 | 九九热在线免费观看 | 五月开心色 | 日韩精品综合在线 | www免费| 日韩视频www | 久久夜色精品国产欧美一区麻豆 | 久久精品久久精品 | 婷婷草| 亚洲欧洲一区二区在线观看 | 亚洲精品国产视频 | 国产不卡高清 | 日韩在线免费高清视频 | 中字幕视频在线永久在线观看免费 | 99热官网| 精品久久久久久久久亚洲 | 激情婷婷综合网 | 欧美黑人性爽 | 国产小视频在线观看免费 | 国产一区 在线播放 | 五月网婷婷 | 999视频网站 | 韩国精品视频在线观看 | 欧美色伊人 | av福利在线导航 | 一区 二区电影免费在线观看 | 日韩小视频 | 国产精品一区二区av麻豆 | 黄色片网站免费 | 久久免费看毛片 | 成人小视频在线播放 | 国内视频1区 | 一区二区欧美日韩 | 国产黄在线 | 欧美另类网站 | 久久久久久久久久久久久影院 | 国产精品久久久区三区天天噜 | 在线视频中文字幕一区 | 成 人 黄 色视频免费播放 | 三级黄色大片在线观看 | 色综合天天综合 | 国产91学生粉嫩喷水 | 国产精品毛片久久久久久久久久99999999 | 免费在线观看亚洲视频 | 中文字幕在线观看视频一区二区三区 | 操操操日日 | 天天骚夜夜操 | 精品久久1 | 在线观看一区二区视频 | 欧美做受高潮电影o | 色偷偷网站视频 | 国产精品欧美久久久久无广告 | 狠狠色丁香婷婷综合久小说久 | 国产很黄很色的视频 | 九九热视频在线播放 | 国产伦精品一区二区三区在线 | 国产精品久久久久久久久久妇女 | 狠狠躁夜夜躁人人爽视频 | 国产精品麻豆一区二区三区 | 韩国av在线播放 | 久草在线播放视频 | 日韩免费一区二区 | 日韩av高清在线观看 | 天天综合中文 | 日本久久综合网 | 午夜成人免费影院 | 色婷婷亚洲 | 国产91精品高清一区二区三区 | 免费视频久久 | 久久综合之合合综合久久 | 国产成人av片 | jizz18欧美18| 久久精品国产精品亚洲 | 欧美性久久久久久 | 综合色久 | 色婷婷国产精品 | 国产精品99精品久久免费 | 夜夜夜影院 | 精品成人在线 | 成年人免费在线观看网站 | 午夜成人免费电影 | 亚洲午夜久久久久久久久电影网 | 亚洲最新精品 | 九九99 | 精品一区 在线 | 国内精品久久久久久久久 | 九九免费视频 | 草久久久久久 | 国产视 | 久久r精品 | www.夜夜爽 | 久久久免费播放 | 精品无人国产偷自产在线 | 国产91精品欧美 | 奇米影视999| 狠狠色狠狠色综合日日92 | 国产精品中文在线 | 最新精品国产 | 在线观看黄色免费视频 | 看毛片的网址 | 久久久久免费精品 | 在线观看国产日韩 | 午夜美女视频 | 婷婷丁香导航 | 三级av免费 | 久久午夜影院 | 成人精品一区二区三区电影免费 | 色999在线| 97免费中文视频在线观看 | 日韩三级中文字幕 | 国产亚洲欧美日韩高清 | 亚洲国产97在线精品一区 | 国产原创在线 | 91精品国产成人 | 日韩在线国产精品 | 日韩在线观看视频一区二区三区 | 高清国产午夜精品久久久久久 | 免费亚洲视频 | 午夜丁香网 | 在线黄色免费 | 久久久网 | 中文字幕精品一区久久久久 | 免费色黄| 97色在线观看 | 99re久久资源最新地址 | 中文字幕国产在线 | 一级久久久 | 久久精品一区二区国产 | 久久99精品热在线观看 | 91成人小视频 | 射久久久 | www激情久久 | 91麻豆精品国产91久久久更新时间 | 日韩黄色免费在线观看 | 91视频88av| 国产精品成人免费精品自在线观看 | 狠狠色免费| 成年人app网址 | 在线观看国产91 | 欧美a√大片 | 免费能看的av | 狠狠狠狠狠狠狠狠干 | 日韩免费一区二区在线观看 | 久久tv| 午夜黄色大片 | 一本—道久久a久久精品蜜桃 | 国产一级性生活视频 | 久久免费99精品久久久久久 | 久久精品老司机 | 97夜夜澡人人爽人人免费 | 人人躁 | 色偷偷人人澡久久超碰69 | 久久综合色天天久久综合图片 | 五月婷婷综合网 | 五月网婷婷 | 色综合久久久久综合 | 久久久香蕉视频 | 国产一级视频 | 婷婷综合久久 | 91av在线免费观看 | 成人四虎 | 国产高清在线观看 | 在线免费性生活片 | 久久免费美女视频 | av中文天堂在线 | 欧洲性视频 | 亚洲综合欧美精品电影 | 日韩久久精品一区二区三区 | 国产91精品一区二区麻豆亚洲 | 成人四虎 | 国产99久久久久 | 久久久久久久18 | 久久精品久久精品久久 | 久久久久久毛片精品免费不卡 | 亚洲精品男人天堂 | 久草在线视频免费资源观看 | 狠狠色噜噜狠狠狠狠2021天天 | 99av在线视频 | 最新真实国产在线视频 | www亚洲精品 | 在线视频日韩精品 | 久久呀| 91精品国产麻豆国产自产影视 | 人成在线免费视频 | 五月综合网站 | 爱情影院aqdy鲁丝片二区 | 黄色av一区 | 午夜黄色一级片 | 国产免费久久精品 | 狠狠综合 | 成人性生交视频 | 国产日韩欧美在线观看视频 | 99视频播放| 婷婷六月天天 | 亚洲高清视频一区二区三区 | 亚洲精品1区2区3区 超碰成人网 | 国产精品欧美久久 | 96国产精品| 九色91在线视频 | 草久久久久久 | 中文字幕色播 | 日日精品 | 在线亚洲观看 | 欧洲精品在线视频 | 国语对白少妇爽91 | 国产成年免费视频 | 久久天堂影院 | 欧美另类一二三四区 | 91久久精| 久久超碰网 | 久久精品久久久久电影 | 欧美ⅹxxxxxx| 六月激情 | 天天操天天干天天插 | 欧亚日韩精品一区二区在线 | 欧美日韩一区二区免费在线观看 | 四虎国产 | 国产亚洲午夜高清国产拍精品 | 久久免费看av | 91麻豆精品91久久久久同性 | 特级毛片在线 | 久久精品国产v日韩v亚洲 | 日韩久久久久久久久久久久 | 五月婷婷影视 | 欧美色久 | 黄色成年片 | 成人av一二三区 | 91亚色在线观看 | 91九色网址| 婷婷国产v亚洲v欧美久久 | 欧美一二三视频 | 一区二区三区手机在线观看 | 日韩美视频 | 婷婷色网视频在线播放 | 综合伊人av | 亚洲欧洲国产日韩精品 | 国产精品va| 超碰成人免费电影 | 超碰人人超 | 超碰97在线资源站 | 91资源在线视频 | 在线日韩中文字幕 | 91综合色 | 国产精品久久久久一区二区国产 | 日韩精品久久久久 | 日韩av在线不卡 | 又黄又爽又无遮挡免费的网站 | 免费h漫在线观看 | 国产成人精品亚洲 | 美女黄频 | 天天操天天添 | 亚洲狠狠干 | 色射色| 五月天婷婷在线视频 | 99国内精品久久久久久久 | 久久伊人综合 | 欧美天天射 | 欧美a性| 国产精品久久一卡二卡 | 国产精品久久久久久69 | www色网站 | 97精品国产一二三产区 | 午夜久久福利视频 | 成人蜜桃视频 | 日本中文字幕视频 | 国产乱对白刺激视频在线观看女王 | 九九在线高清精品视频 | 久久综合色综合88 | 久久久夜色 | 欧美精品一区二区三区一线天视频 | 亚洲精品免费在线观看视频 | 国产精品入口久久 | 欧美福利视频 | 国产亚洲精品久久19p | 国产精选视频 | 九九视频免费在线观看 | 一区二区三区在线免费观看视频 | 一二区精品 | 日韩av专区 | 国产精品久久久久久久久岛 | 亚洲成av人片在线观看www | 日韩中文字幕a | 国产一级黄色片免费看 | 999久久国精品免费观看网站 | 美女国产| 久久久国产影院 | 日韩美女黄色片 | 亚洲精品乱码久久久久久蜜桃动漫 | 日韩中文字幕在线不卡 | 最新中文字幕在线观看视频 | 成人一级在线观看 | 97在线精品视频 | 91豆麻精品91久久久久久 | 中文字幕免费高清在线 | 国产原创91| 五月婷婷影院 | 亚洲精品视频网站在线观看 | 久草在线视频中文 | 日本精品久久久久中文字幕 | 免费在线观看视频a | 一级黄色视屏 | 国产白浆视频 | 99精品免费视频 | 97超碰人人澡人人爱学生 | 一区二区三区av在线 | 999成人 | 亚洲精品福利在线 | 精品视频免费 | 99在线精品免费视频九九视 | 国产精品久久久久婷婷二区次 | 久久这里只有精品视频首页 | 中文字幕乱码电影 | 91成人看片 | 欧美一二三区在线观看 | 久久国产精品一国产精品 | 国产色视频网站2 | 在线免费观看视频一区二区三区 | 久青草影院 | 一级特黄aaa大片在线观看 | 999久久国精品免费观看网站 | 又爽又黄又无遮挡网站动态图 | 久久国产高清视频 | 久久专区| 欧美91片| 综合在线色 | 欧洲精品在线视频 | 国产一级做a | 91人人揉日日捏人人看 | 九九久久影院 | 成年人黄色av | 这里只有精彩视频 | 久久亚洲影院 | 亚洲三级影院 | 国产精品一区免费看8c0m | 亚洲不卡123 | 91av视频网 | 天天天天天干 | 91精品毛片| 久久综合婷婷 | 成人国产精品一区二区 | 天天射射天天 | 亚洲精品中文字幕在线观看 | 亚洲国产视频网站 | 正在播放久久 | 三级黄色免费片 | 玖操| 精品a级片 | a级黄色片视频 | 国产精品免费视频观看 | 五月婷婷中文网 | 亚洲自拍自偷 | 日韩精品无码一区二区三区 | 天天爽人人爽 | 国产精品18久久久久白浆 | 欧洲在线免费视频 | 国产成人精品一区二区三区在线 | 久久久国产精品电影 | 九九九国产 | 久艹视频免费观看 | 国产99自拍 | 欧美一级视频在线观看 | 最近中文字幕大全中文字幕免费 | 国产淫片| 91麻豆精品国产91久久久久久久久 | 欧美一区,二区 | 欧美片一区二区三区 | 国产精品18videosex性欧美 | 日日日干 | 91成人小视频 | 成人av免费电影 | 国产aaa免费视频 | 久久影院中文字幕 | 国产精品自产拍在线观看网站 | 草久中文字幕 | a视频在线看 | 91免费观看 | 免费看污污视频的网站 | 色综合天天干 | 免费手机黄色网址 | 四虎成人免费观看 | 在线91网| 九色福利视频 | 国产精品久久一区二区三区不卡 | 中文字幕国产一区 | 国产做a爱一级久久 | 91精品久久久久久久91蜜桃 | 天天伊人狠狠 | 国产精品videossex国产高清 | 999久久久欧美日韩黑人 | 啪啪凸凸 | 日日操天天操夜夜操 | 在线a人片免费观看视频 | 欧美一级视频一区 | 2020天天干夜夜爽 | 午夜视频在线观看欧美 | 99精品在线视频播放 | 伊人色播 | 天天草天天操 | 天天综合色网 | 国产精品免费视频久久久 | 狠狠干网 | 国产精品亚洲a | 涩涩资源网 | www五月 | 亚洲男人天堂a | 五月天婷婷在线视频 | 精品一区在线看 | 深夜免费小视频 | 久久精品一区八戒影视 | 在线观看国产高清视频 | 国产小视频在线看 | 日韩久久一区 | 国产一区不卡在线 | 黄色一级性片 | 欧美在线a视频 | www91在线观看 | 91在线资源 | 国产精品久久精品 | 日日干夜夜骑 | 欧美性爽爽 | 肉色欧美久久久久久久免费看 | 日韩一级电影在线观看 | 国产国语在线 | 欧美永久视频 | av一区二区在线观看中文字幕 | 国产美女搞久久 | 国产精品久久婷婷六月丁香 | 狠狠操导航 | 久久99亚洲热视 | 久久久久| 美女网色 | 美女视频a美女大全免费下载蜜臀 | 精品国产伦一区二区三区免费 | 九九九视频在线 | 最新中文字幕在线观看视频 | 91片在线观看 | 天天干天天综合 | 91精品国产乱码久久桃 | 96久久久| 亚洲五月 | 激情综合啪啪 | 亚洲精品视频第一页 | 玖玖色在线观看 | 成人aⅴ视频 | 久草免费看 | 欧美一区二区精品在线 | 99久久久久久国产精品 | 久草视频首页 | 欧美福利视频 | 亚洲精品电影在线 | 日韩免费三区 | 96亚洲精品久久久蜜桃 | 国产第页 | 在线观看国产 | 97香蕉超级碰碰久久免费软件 | 国产精品第一页在线观看 | 欧美一级艳片视频免费观看 | 香蕉视频亚洲 | 亚洲综合最新在线 | 成年人在线观看网站 | 国产二区电影 | 久久亚洲电影 | 特黄特黄的视频 | 欧洲精品亚洲精品 | 视频一区在线播放 | 99久久er热在这里只有精品15 | www看片网站| 人人狠狠综合久久亚洲婷 | 97在线看| av电影不卡在线 | 亚洲黄色av| 精品在线免费观看 | 亚洲视频免费在线 | 日本三级吹潮在线 | 中文字幕资源在线观看 | 精品国产诱惑 | 久久免费精品一区二区三区 | 亚洲国产69 | 天天爽天天爽天天爽 | 久久国精品| 免费精品在线 | 天天操天天摸天天干 | 91av超碰| 成年人在线免费看 | 欧美极品一区二区三区 | www.亚洲激情.com | 久久再线视频 | 精品成人a区在线观看 | 开心色激情网 | 激情网五月天 | 亚洲综合国产精品 | 日韩av影视 | www.天天干 | 国产成人av一区二区三区在线观看 | 国产系列在线观看 | 亚洲精品国产高清 | 精品久久久久久久久久久久久久久久 | 久久精品香蕉 | 亚在线播放中文视频 | 999国内精品永久免费视频 | 日韩免费视频播放 | 久久国产精品系列 | 日韩欧美在线一区二区 | 成年人黄色免费看 | 成人在线电影观看 | 天天干干| 在线播放亚洲激情 | 国产夫妻自拍av | 国产无限资源在线观看 | 国产成人一区二区三区在线观看 | 国产成人l区 | 黄色av影视 | 久久你懂得 | 国产免费又粗又猛又爽 | 国产精品观看在线亚洲人成网 | 婷婷久久综合九色综合 | 狠狠色丁婷婷日日 | 国产亚洲成人网 | 麻豆久久久久 | 日韩精品一区二区三区第95 | 久热这里有精品 | 久久久久女人精品毛片九一 | 99精品热 | 91精品视频一区 | 成人午夜电影网站 | 亚洲一区二区天堂 | 激情婷婷久久 | 久久不见久久见免费影院 | 色综合久久88色综合天天人守婷 | 日韩在线在线 | 成人免费中文字幕 | 久久黄色a级片 | 天天亚洲综合 | aa级黄色大片 | 中文字幕在线观看完整 | 欧美色插| 国产不卡一区二区视频 | av大片网址 | 亚洲黄色在线观看 | 亚洲国产精品成人va在线观看 | 国产69熟 | 国产视频18| a电影免费看 | 99久久99视频 | 久草在线视频看看 | 日本特黄一级片 | 久久免费视屏 | 国产精品成人一区二区三区吃奶 | 99这里有精品 | 欧美一二三区在线观看 | 国产99久久精品一区二区300 | 人人插人人做 | 久久人人爽人人爽人人片 | 91插插影库| 国产一区二区观看 | 国产视频欧美视频 | 成人国产精品入口 | 国产无套一区二区三区久久 | 国产日本在线播放 | 久久人人爽人人爽人人片av软件 | 在线观看 亚洲 | 成人国产精品 | 精品国模一区二区 | 五月激情丁香图片 | 蜜臀久久99精品久久久久久网站 | 久久躁日日躁aaaaxxxx | 国产成人久久av977小说 | 国产自产在线视频 | 久久久久久黄色 | 日韩高清精品免费观看 | 亚洲高清不卡av | 91九色性视频 | 国产97视频| 色九九影院 | 日本在线中文在线 | 亚洲黄色成人av | 欧美日韩首页 | 亚洲少妇久久 | 国产在线观看,日本 | 午夜视频在线观看一区二区三区 | 色视频网址 | 国产成人精品av | 婷婷日 | 最新午夜电影 | 精品国产免费人成在线观看 | 中文字幕一区二区三区四区视频 | 国产黄色精品网站 | 91九色视频观看 | 91亚洲精品久久久蜜桃网站 | 久久国产乱 | 91精品在线视频观看 | 日韩av线观看 | 91大神免费在线观看 | 国产91丝袜在线播放动漫 | 在线看黄色的网站 | 亚洲三级在线播放 | 丰满少妇高潮在线观看 | 日韩国产精品久久久久久亚洲 | 国产精品一区二区在线观看免费 | 成人在线播放av | 中文字幕在线看 | 操操操日日 | 国产午夜麻豆影院在线观看 | 亚洲激情在线播放 | 国模精品在线 | 国产精品久久一 | 在线观看中文字幕网站 | 美女黄频 | 国产精品一区二区三区在线免费观看 | 99在线免费视频 | 免费看搞黄视频网站 | 午夜在线观看影院 | 久草精品视频在线观看 | 最新真实国产在线视频 | 国产中文字幕视频在线观看 | 亚洲成人av免费 | 激情xxxx | 国产999精品视频 | 久久久免费高清视频 | 国产 视频 高清 免费 | 一区二区三区高清在线观看 | 亚洲无吗av | 99久久国产免费免费 | 九热在线 | 久久精品国产精品亚洲精品 | 久久激情网站 | 国产不卡免费视频 | 成人资源站 | 国产va饥渴难耐女保洁员在线观看 | 天堂网一区| 国产精品丝袜在线 | 天天想夜夜操 | 午夜12点 | 国产很黄很色的视频 | 日韩中文字幕免费在线观看 | 国产成人免费在线 | 亚洲成人精品 | 人人澡视频 | 99久久精品久久久久久清纯 | 国内精品视频久久 | 久草在线免费播放 | 久久久久免费精品 | 成年人视频在线 | 国产婷婷视频在线 | 成人中文字幕在线观看 | 亚洲九九九在线观看 | 最新中文字幕视频 | 九九九在线观看视频 | 免费日韩一级片 | a天堂最新版中文在线地址 久久99久久精品国产 | 91免费高清视频 | 欧美日韩一区二区三区不卡 | 日本少妇高清做爰视频 | 新版资源中文在线观看 | 免费高清在线观看成人 | 天天射天天操天天干 | 免费精品在线视频 | 亚洲 在线 | 国产日本高清 | 日韩在线视频免费观看 | 日韩欧美高清视频在线观看 | 久草久草在线 | 久久99热精品 | www久久com| 成人黄在线观看 | 亚洲伊人网在线观看 | 激情婷婷欧美 | 久久激情小视频 | 天天操夜夜曰 | 日免费视频 | 国产精品99久久久久久人免费 | 国产a网站| 成年人免费在线观看网站 | 免费日韩 精品中文字幕视频在线 | 欧美色图30p | 精品免费一区二区三区 | 色激情在线 | 伊人亚洲综合网 | 国产精品美女网站 | 激情视频免费在线观看 | 在线免费观看黄色av | 免费看精品久久片 | 亚洲一级影院 | 99视频精品全部免费 在线 | 最新日韩视频 | 国产精品久久久99 | 韩日精品中文字幕 | 最近中文字幕免费视频 | 免费黄a| 欧美日韩一区二区在线观看 | 综合久久久久久 | 中文字幕乱码在线播放 | 日韩网站在线看片你懂的 | 国产99久久久国产精品免费看 | 亚洲电影第一页av | 四虎成人精品永久免费av九九 | 久久精彩免费视频 | 久久久综合 | 伊人国产在线观看 | 亚洲资源在线观看 | 天天看天天操 | 天天操天天添天天吹 | 久久国产精品影片 | 久视频在线 | 成人免费视频网址 | av在线播放网址 | 亚洲精品小视频在线观看 | 欧美日韩中文字幕在线视频 | 99综合电影在线视频 | 国产成人精品一区二 | 国产精品免费在线播放 | 免费人成网ww44kk44 | 黄色片免费电影 | 国产男女免费完整视频 | 婷婷激情av | 中文字幕av一区二区三区四区 | 国产精品午夜久久久久久99热 | 日韩在线免费观看视频 | 福利视频午夜 | 午夜 在线| 三级黄色a | 久久久久久久久久久久电影 | 亚洲黄色免费网站 | 国产不卡网站 | 精精国产xxxx视频在线播放 | 欧美日韩在线精品 | 欧美一区二区在线免费看 | 国产精品美女久久久久久久 | 美女av在线免费 | 视频在线亚洲 | 亚洲国产婷婷 | 国产高清综合 | 国产四虎影院 | 97超碰人人澡人人爱 | 国产精品白丝av | 99久久精品网 | 中文字幕三区 | 精品国产人成亚洲区 | 国产精品videoxxxx | 精品国产一区二区三区久久久久久 | 久久www免费视频 | a在线免费 | 中文字幕在线观看91 | 亚洲黄色免费 | 国产精品久久久久久妇 | 精品视频| 色偷偷男人的天堂av | 日韩视频免费在线观看 | 欧美日韩亚洲第一页 | 亚洲精品乱码久久久久久蜜桃91 | 久久免费视频3 | 国产 一区二区三区 在线 | 91精品国产92久久久久 | 91九色在线 | 99久久精品日本一区二区免费 | 国产精品九九热 | 色网站在线 | 91在线精品观看 | 手机av网站 | 特级a毛片 | 成人在线免费观看网站 | 中文字幕人成乱码在线观看 | 91人人揉日日捏人人看 | 亚洲国产日韩欧美在线 | 欧美人牲| 色99色| 日韩午夜电影院 |