我们通常希望在使用数据库时生成某种随机数据, 或者只是在我们的应用程序中抛出一些数据。造假者可以是非常有用的这些目的。它为您希望在应用程序中建模的各种域对象生成数据。例如, 一个人的名字或姓氏、书名及其作者和出版商等。”f家做者” (域对象) 的整个列表在 fakers gihub 文件中提供。另一个有趣的非常有用的功能是, 我们还可以从中生成 “区域设置” 特定数据。

造假者的 gihub 存储库可以在这里找到: faker github

在本教程中, 我们将创建一个示例 spring boot 应用程序, 并使用上面的 faker 依赖关系生成一些数据, 然后使用这些数据填充我们的弹性数据库。您可以根据需要将任何其他数据库与任何其他基于 java 的应用程序一起使用。这也将作为弹性搜索 rest 高级客户端使用的示例。

1. 让我们创建一个简单的弹簧启动应用程序并测试发商服务。

FakerAndESApp.java

package techgabs;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class FakerAndESApp {
    public static void main(String[] args){
        SpringApplication.run(FakerAndESApp.class, args);
    }
}

2. 测试负责显示 faker 服务输出的类。

TestFaker.java

package techgabs;
import com.github.javafaker.Faker;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

import java.util.Locale;

@Component
public class TestFaker {

    @EventListener
    public void test(ApplicationReadyEvent event){

        Faker faker = new Faker(new Locale("en-IND"));
        System.out.println(faker.name().firstName());
        System.out.println(faker.name().lastName());

        System.out.println(faker.name().firstName());
        System.out.println(faker.name().lastName());
    }
}

示例输出:


Chandira
Iyer
Varalakshmi
Naik

请注意, 区域设置设置为 “en-ind”。整个区域设置列表可以在这里找到, faker github
另一件要注意的是, 每次 faker.name().firstName() 调用时, 即使使用相同的指格对象, 也会返回一个新字符串。对该方法的每次调用都返回一个新值。

3. 现在我们已经知道了 faker 的工作原理, 让我们尝试生成一些图书数据并将其插入 es。

让我们首先得到项目所需的 gradle 依赖项的列表-> 构建。

plugins {
    id 'java'
}

group 'techgabs.faker.es'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}
dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'

    // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web
    compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.1.0.RELEASE'

    compile 'com.github.javafaker:javafaker:0.16'

    // https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client
    compile 'org.elasticsearch.client:elasticsearch-rest-high-level-client:6.4.2'
}

4. 创建一个 Book 模型来保存 faker 生成的数据。

Book

模型;
公共类书 {公共字符串 get 作者 () {返回作者;
} 公共空白集作者 (字符串作者) {这. 作者 = 作者;
} 公共字符串 getname () {返回类型;
} 公共空白集体裁 (弦类型) {这. 体裁 = 体裁;
} 公共字符串 getpublisher () {返回发布者;
} 公共 void 设置发布者 (字符串发布者) {此. 发布者 = 发布者;
} 公共字符串 getTitle () {返回标题;
} 公共空白集标题 (字符串标题) {此. 标题 = 标题;
} 公共字符串 getid () {返回 id;
} 公共 void 集 (字符串 id) {此. id = id;
} 私有字符串 id;
私有字符串作者;
私有字符串类型;
私有字符串发布者;
私有字符串标题;
}

弹性搜索的先决条件:

请确保弹性搜索数据库已启动并正在运行。

在 mac 上我发现通过酿造安装 es 更容易。

brew update
brew install elasticsearch

在 windows 上, 您可以从这里下载 msi->弹性搜索 msi 的窗口

在这两种情况下, 更好的方法是使用 ddocker 下载 es 映像并运行它。

5. 创建生成假数据的服务。

package techgabs.service;


import com.github.javafaker.Faker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import techgabs.dao.BookDao;
import techgabs.model.Book;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.UUID;

@Service
public class BulkService {

    private Faker faker =new Faker(new Locale("en-IND"));

    @Autowired
    private BookDao bookDao;

    public void fakeBulkInsert(int count){

        bookDao.bulkInsert(getFakeBookList(count));
    }

    private List getFakeBookList(int count) {
        List bookList = new ArrayList<>();

        for(int i=0;i < count;i++) {
            Book book = new Book();
            book.setId(UUID.randomUUID().toString());
            book.setAuthor(faker.book().author());
            book.setGenre(faker.book().genre());
            book.setPublisher(faker.book().publisher());
            book.setTitle(faker.book().title());
            bookList.add(book);
        }
        return bookList;
    }
}

现在, 我们将使用 resthighplecliece es 模块来执行上一步中生成的数据的批量插入。下面是用于创建重新生成高级级客户端的配置类。请注意, 使用后显式销毁客户端非常重要。它还使用低级 restclient。有关详细信息, 请查看弹性搜索休息高级客户端文档。

6. 为 es 的休息高级客户端配置类。

ESConfig.java 
package techgabs.config;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;

import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.config.AbstractFactoryBean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;

@Configuration
public class ESConfig extends AbstractFactoryBean {

    private RestHighLevelClient restHighLevelClient;

    @Override
    public Class getObjectType() {
        return RestHighLevelClient.class;
    }

    @Override
    protected RestHighLevelClient createInstance() throws Exception {

        try {
            restHighLevelClient = new RestHighLevelClient(
                    RestClient

输出. println (exp. getmessage ());
} 返回高级客户端;
} @Override 公共空白破坏 () {尝试 {resthighclient. close ();
} catch (iofexception e) {e. printstacktrace ();
}
}
}

7. 创建 dao 图层以执行批量插入。

package techgabs.dao;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import techgabs.model.Book;

import java.io.IOException;
import java.util.List;
import java.util.Map;

@Component
public class BookDao {

    private static final String INDEX="book_index";

    private static final String TYPE="book_type";

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    @Autowired
    private ObjectMapper objectMapper;

    public void bulkInsert(List bookList){

        BulkRequest bulkRequest = new BulkRequest();

        bookList.forEach(book -> {
            IndexRequest indexRequest = new IndexRequest(INDEX,TYPE,book.getId()).
                    source(objectMapper.convertValue(book, Map.class));

            bulkRequest.add(indexRequest);
        });

        try {
            restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

8. 我们现在将创建一个控制器, 从中调用批量插入服务方法。

package techgabs.controller;

import com.github.javafaker.Faker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import techgabs.service.BulkService;

@RestController
public class Controller {

    @Autowired
    private BulkService bulkService;

    @PostMapping("/faker/bulk/{count}")
    public void bulkInsertWithFakeData(@PathVariable("count") int count){
        bulkService.fakeBulkInsert(count);
    }
}

9. 通过 rest 客户端插入数据, 如邮员或卷曲。

POST http://localhost:8080/faker/bulk/2

验证数据是否正确插入到 es 中。

POST http://localhost:9200/book_index/_search

输出:

{
    "took": 3,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 2,
        "max_score": 1,
        "hits": [
            {
                "_index": "book_index",
                "_type": "book_type",
                "_id": "3f2bcae1-4314-4a05-b9f5-86782320e9da",
                "_score": 1,
                "_source": {
                    "id": "3f2bcae1-4314-4a05-b9f5-86782320e9da",
                    "author": "Deenabandhu Banerjee",
                    "genre": "Suspense/Thriller",
                    "publisher": "André Deutsch",
                    "title": "As I Lay Dying"
                }
            },
            {
                "_index": "book_index",
                "_type": "book_type",
                "_id": "1ea8da99-7df7-407f-a059-a2c31ae95138",
                "_score": 1,
                "_source": {
                    "id": "1ea8da99-7df7-407f-a059-a2c31ae95138",
                    "author": "Baalaaditya Banerjee",
                    "genre": "Speech",
                    "publisher": "Signet Books",
                    "title": "The Moving Toyshop"
                }
            }
        ]
    }
}

总结

我们创建了一个示例应用程序来演示 faker 服务如何生成示例数据, 然后将该示例数据插入弹性搜索中我们还使用弹性搜索的搜索 rest 端点验证了结果。

Comments are closed.