我们通常希望在使用数据库时生成某种随机数据, 或者只是在我们的应用程序中抛出一些数据。造假者可以是非常有用的这些目的。它为您希望在应用程序中建模的各种域对象生成数据。例如, 一个人的名字或姓氏、书名及其作者和出版商等。”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 端点验证了结果。