天天看點

elasticsearch 用戶端工具_在springBoot 中使用Elasticsearch在springBoot 中使用Elasticsearch1.啟用ELASTICSEARCH支援2.運作ELASTICSEARCH3.建立SPRING資料倉庫4.實體對象5.初始化6.檢視資料并運作查詢7.測試

在springBoot 中使用Elasticsearch

elasticsearch 用戶端工具_在springBoot 中使用Elasticsearch在springBoot 中使用Elasticsearch1.啟用ELASTICSEARCH支援2.運作ELASTICSEARCH3.建立SPRING資料倉庫4.實體對象5.初始化6.檢視資料并運作查詢7.測試

Elasticsearch是一個全文本搜尋引擎,專門用于處理大型資料集。根據此描述,自然使用它來存儲和搜尋應用程式日志。與Logstash和Kibana一起,它是稱為Elastic Stack的強大解決方案的一部分。

保留應用程式日志并不是Elasticsearch的唯一的一種用法。它通常用作具有主關系資料庫的應用程式的輔助資料庫。如果您必須對大型資料集執行全文搜尋,或者僅存儲許多不再由應用程式修改的曆史記錄,則這種方法特别有用。當然,對于這種方法的優缺點總是存在疑問。 當使用包含相同資料的兩個不同資料源時,必須首先考慮同步。您有幾種選擇。根據關系資料庫供應商的不同,您可以利用包含SQL更新曆史記錄的二進制或事務日志。這種方法需要一些中間件,該中間件先讀取日志,然後将資料放入Elasticsearch。您始終可以将全部責任移到資料庫端(觸發)或Elasticsearch端(JDBC插件)。 無論您如何将資料導入Elasticsearch,都必須考慮另一個問題。資料結構。您可能在關系資料庫中的幾個表之間配置設定了資料。如果您想利用Elasticsearch的優勢,則應将其存儲為單個類型。它迫使您保留備援資料,進而導緻更大的磁盤空間使用。當然,如果查詢比關系資料庫中的等效查詢運作得更快,那麼這種效果是可以接受的。好的,在介紹了很長時間之後,讓我們繼續該示例。Spring Boot提供了一種通過Spring Data存儲庫與Elasticsearch進行互動的簡便方法。

1.啟用ELASTICSEARCH支援

按照Spring Boot的習慣,我們不必在上下文中提供任何其他Bean來支援對Elasticsearch的支援。我們隻需要包括以下對我們的依賴pom.xml:

    org.springframework.boot    spring-boot-starter-data-elasticsearch
           

預設情況下,應用程式嘗試與localhost上的Elasticsearch連接配接。如果我們使用另一個目标URL,則需要在配置設定中覆寫它。這是我們application.yml檔案的片段,它将預設叢集名稱和位址覆寫為在Docker容器上啟動的Elasticsearch的位址:

spring:  data:    elasticsearch:      cluster-name: docker-cluster      cluster-nodes: 192.168.99.100:9300
           

應用程式可以通過Spring Boot Actuator health端點公開Elasticsearch連接配接的健康狀态。首先,您需要包括以下Maven依賴項:

    org.springframework.boot    spring-boot-starter-actuator
           

預設情況下,運作狀況檢查是啟用的,并且Elasticsearch檢查是自動配置的。但是,此驗證是通過Elasticsearch Rest API用戶端執行的。在這種情況下,我們需要重寫spring.elasticsearch.rest.uris負責設定REST用戶端使用的位址的屬性:

spring:  elasticsearch:    rest:      uris: http://192.168.99.100:9200
           

2.運作ELASTICSEARCH

對于我們的測試,我們需要在開發模式下運作的單節點Elasticsearch執行個體。和往常一樣,我們将使用Docker容器。這是啟動Docker容器并将其公開在port 9200和上的指令9300。

$ docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.6.2

3.建立SPRING資料倉庫

要啟用Elasticsearch存儲庫,我們隻需要使用以下方法注釋main或configuration類

@EnableElasticsearchRepositories:@[email protected] class SampleApplication { ... }
           

下一步是建立擴充的存儲庫接口CrudRepository。它提供了一些基本操作,例如save或findById。如果您想要其他一些find方法,則應遵循Spring Data命名約定在接口内定義新方法。

public interface EmployeeRepository extends CrudRepository {     List findByOrganizationName(String name);    List findByName(String name); }
           

4.實體對象

我們的實體的關系結構被平整到單個Employee包含相關對象(對象Organization,Department)。您可以将這種方法與在RDBMS中為一組相關表建立視圖進行比較。在Spring Data Elasticsearch命名法中,單個對象存儲為文檔。是以,您需要使用注釋您的對象@Document。您還應該設定Elasticsearch目标索引的名稱,類型和ID。可以使用@Field注釋配置其他映射。

@Document(indexName = "sample", type = "employee")public class Employee {     @Id    private Long id;    @Field(type = FieldType.Object)    private Organization organization;    @Field(type = FieldType.Object)    private Department department;    private String name;    private int age;    private String position;         // Getters and Setters ... }
           

5.初始化

正如我在序言中提到的那樣,您可能決定使用Elasticsearch的主要原因是需要處理大資料。是以,需要用許多文檔填充我們的測試Elasticsearch節點。如果您想一步插入許多文檔,則絕對應該使用Bulk API。批量API使在單個API調用中執行許多索引/删除操作成為可能。這樣可以大大提高索引速度。批量操作可以通過Spring Data ElasticsearchTemplatebean 執行。它還在Spring Boot上自動配置。模闆提供bulkIndex了将索引查詢清單作為輸入參數的方法。這是在應用程式啟動時插入樣本測試資料的bean的實作:

public class SampleDataSet {     private static final Logger LOGGER = LoggerFactory.getLogger(SampleDataSet.class);    private static final String INDEX_NAME = "sample";    private static final String INDEX_TYPE = "employee";     @Autowired    EmployeeRepository repository;    @Autowired    ElasticsearchTemplate template;     @PostConstruct    public void init() {        for (int i = 0; i < 10000; i++) {            bulk(i);        }    }     public void bulk(int ii) {        try {            if (!template.indexExists(INDEX_NAME)) {                template.createIndex(INDEX_NAME);            }            ObjectMapper mapper = new ObjectMapper();            List queries = new ArrayList<>();            List employees = employees();            for (Employee employee : employees) {                IndexQuery indexQuery = new IndexQuery();                indexQuery.setId(employee.getId().toString());                indexQuery.setSource(mapper.writeValueAsString(employee));                indexQuery.setIndexName(INDEX_NAME);                indexQuery.setType(INDEX_TYPE);                queries.add(indexQuery);            }            if (queries.size() > 0) {                template.bulkIndex(queries);            }            template.refresh(INDEX_NAME);            LOGGER.info("BulkIndex completed: {}", ii);        } catch (Exception e) {            LOGGER.error("Error bulk index", e);        }    }         // sample data set implementation ...     }
           

如果您不需要在啟動時插入資料,則可以通過将屬性設定initial-import.enabled為禁用該過程false。這是SampleDataSetbean 的聲明:

@[email protected]("initial-import.enabled")public SampleDataSet dataSet() {    return new SampleDataSet();}
           

6.檢視資料并運作查詢

假設您已經啟動了示例應用程式,負責批量索引的bean沒有被禁用,并且您有足夠的耐心等待幾個小時,直到所有資料都已插入到Elasticsearch節點中,現在它包含employee類型為100M的文檔。值得顯示有關叢集的一些資訊。您可以使用Elasticsearch查詢來執行此操作,也可以下載下傳可用的GUI工具之一,例如ElasticHQ。幸運的是,ElasticHQ也可以作為Docker容器使用。您必須執行以下指令以使用ElasticHQ啟動容器:

$ docker run -d --name elastichq -p 5000:5000 elastichq/elasticsearch-hq

啟動ElasticHQ GUI後,可以通過端口5000上的Web浏覽器通路GUI。其Web控制台提供有關叢集,索引的基本資訊,并允許執行查詢。您隻需要輸入Elasticsearch節點位址,即可使用統計資訊将您重定向到主儀表闆。這是ElasticHQ的主要儀表闆。

elasticsearch 用戶端工具_在springBoot 中使用Elasticsearch在springBoot 中使用Elasticsearch1.啟用ELASTICSEARCH支援2.運作ELASTICSEARCH3.建立SPRING資料倉庫4.實體對象5.初始化6.檢視資料并運作查詢7.測試

如您所見,我們有一個索引,稱為sample5個分片。這是Spring Data提供的預設值@Document,可以用field覆寫shards。單擊它後,我們可以導航到索引管理面闆。您可以對索引執行一些操作,例如清除緩存或重新整理索引。您還可以檢視所有分片的統計資訊。

elasticsearch 用戶端工具_在springBoot 中使用Elasticsearch在springBoot 中使用Elasticsearch1.啟用ELASTICSEARCH支援2.運作ELASTICSEARCH3.建立SPRING資料倉庫4.實體對象5.初始化6.檢視資料并運作查詢7.測試

為了目前的測試目的,我有大約2500萬個(大約3GB的空間)Employee類型的文檔。我們可以執行一些測試查詢。我已經公開了兩個搜尋端點:按員工姓名GET /employees/{name}和按組織名稱GET /employees/organization/{organizationName}。結果并不壓倒一切。我認為使用相同數量的資料可以為關系資料庫帶來相同的結果。

elasticsearch 用戶端工具_在springBoot 中使用Elasticsearch在springBoot 中使用Elasticsearch1.啟用ELASTICSEARCH支援2.運作ELASTICSEARCH3.建立SPRING資料倉庫4.實體對象5.初始化6.檢視資料并運作查詢7.測試

7.測試

好的,我們已經完成開發并在大資料集上執行了一些手動測試。現在,是時候建立一些在内置時間運作的內建測試了。我們可以使用允許在JUnit測試期間自動使用資料庫啟動Docker容器的庫– Testcontainers。有關此庫的更多資訊,請通路其站。幸運的是,Testcontainers支援Elasticsearch。要在測試範圍内啟用它,您首先需要包括以下對您的依賴pom.xml:

    org.testcontainers    elasticsearch    1.11.1    test
           

下一步是定義@ClassRule或@Rule指向Elasticsearch容器的bean。它會在測試類之前或在每個類之前自動啟動,具體取決于您使用的注釋。公開的端口号是自動生成的,是以您需要檢索設定為spring.data.elasticsearch.cluster-nodes屬性值的端口号。這是我們的JUnit內建測試的完整實作:

@RunWith(SpringRunner.class)@[email protected](MethodSorters.NAME_ASCENDING)public class EmployeeRepositoryTest {     @ClassRule    public static ElasticsearchContainer container = new ElasticsearchContainer();    @Autowired    EmployeeRepository repository;     @BeforeClass    public static void before() {        System.setProperty("spring.data.elasticsearch.cluster-nodes", container.getContainerIpAddress() + ":" + container.getMappedPort(9300));    }     @Test    public void testAdd() {        Employee employee = new Employee();        employee.setId(1L);        employee.setName("John Smith");        employee.setAge(33);        employee.setPosition("Developer");        employee.setDepartment(new Department(1L, "TestD"));        employee.setOrganization(new Organization(1L, "TestO", "Test Street No. 1"));        employee = repository.save(employee);        Assert.assertNotNull(employee);    }     @Test    public void testFindAll() {        Iterable employees = repository.findAll();        Assert.assertTrue(employees.iterator().hasNext());    }     @Test    public void testFindByOrganization() {        List employees = repository.findByOrganizationName("TestO");        Assert.assertTrue(employees.size() > 0);    }     @Test    public void testFindByName() {        List employees = repository.findByName("John Smith");        Assert.assertTrue(employees.size() > 0);    } }
           

繼續閱讀