时髦的大数据来自3 V:音量,种类和速度。卷是指数据的大小,品种是指不同类型的数据,而速度是指数据处理的速度。为了处理持久性大数据,NoSQL数据库可以更快地写入和读取数据。但由于数量众多,搜索引擎需要查找没有大量计算机能力且耗费太多时间的信息。搜索引擎是一种旨在搜索信息的软件系统; 这种机制使用户获得他们想要的信息变得更加直接和清晰。
本文将介绍NoSQL,它既是文档类型,也是搜索引擎Elasticsearch。
Elasticsearch是NoSQL文档类型和基于Lucene的搜索引擎。它提供了一个分布式,支持多租户的全文搜索引擎,具有HTTP Web界面和无架构JSON文档。Elasticsearch是用Java开发的,并根据Apache License的条款作为开源发布。Elasticsearch是Apache Solr最受欢迎的企业搜索引擎,后者也基于Lucene。它是一个近乎实时的搜索平台。这意味着从索引文档到可搜索文档的时间有一点延迟(通常是一秒)。
搜索引擎中的步骤
在Elasticsearch中,搜索引擎的进度基于分析器,该分析器包含三个较低级别的构建块:字符过滤器,标记器和令牌过滤器。通过Elasticstatic文档,定义是:
- 甲字符过滤器接收原始文本字符的流,并且可以通过添加,移除,或改变字符变换流。例如,字符过滤器可用于将印度语 - 阿拉伯数字转换为其阿拉伯语 - 拉丁语等价物或从流中去除HTML元素。
- 甲标记生成器接收字符流,其分成单独的标记(通常是单个单词),并输出记号流。例如,只要看到任何空格,空格标记器就会将文本分成标记。它将转换文本“快速棕色狐狸!” 进入[快速,棕色,狐狸!]的术语。
- 甲令牌滤波器接收到令牌流,并且可以添加,删除或改变令牌。例如,小写标记过滤器将所有标记转换为小写,停止标记过滤器从标记流中删除常用单词(停用词),同义词标记过滤器将同义词引入标记流。
如何在Docker中安装ElasticSearch
使用ES的第一步是将其安装在Docker中。您可以手动安装和通过Docker安装。最简单的方法是使用Docker执行以下步骤:
- 安装Docker
- 请参阅此处。
- 运行以下命令:
docker run -p 9200:9200 -p 9300:9300 -e “discovery.type = single-node” docker.elastic.co/elasticsearch/elasticsearch:6.2.3
Elasticsearch和Java EE协同工作
Eclipse JNoSQL是在这些平台(Java EE和搜索引擎)之间工作的桥梁。需要记住的一点是,Elasticsearch也是NoSQL文档类型,因此开发人员可以对应用程序进行建模。要同时使用标准文档行为和Elasticsearch API,程序员需要使用Elasticsearch扩展。
代码语言:javascript复制<dependency>
<groupId>org.jnosql.artemis</groupId>
<artifactId>elasticsearch-extension</artifactId>
<version>0.0.5</version>
</dependency>
对于此演示,我们将为开发人员创建一个联系人议程,其中包含姓名,地址,当然还有他们所知道的语言。地址具有字段并成为文档内的文档的子文档。
代码语言:javascript复制@Entity("developer")
public class Developer {
@Id
private Long id;
@Column
private String name;
@Column
private List < String > phones;
@Column
private List < String > languages;
@Column
private Address address;
}
@Embeddable
public class Address {
@Column
private String street;
@Column
private String city;
@Column
private Integer number;
}
定义模型后,让我们设置映射。映射是确定文档及其包含的字段如何存储和索引的过程。对于此示例,字段通常是类型关键字, 并且这些字段只能按其确切值进行搜索。此外,还有我们使用自定义分析器定义为文本的语言字段。这个自定义分析器 whitespace_analyzer
有一个tokenizer,空格和三个过滤器(标准,小写和 asciifolding)。
{
"settings": {
"analysis": {
"filter": {
},
"analyzer": {
"whitespace_analyzer": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"standard",
"lowercase",
"asciifolding"
]
}
}
}
},
"mappings": {
"developer": {
"properties": {
"name": {
"type": "keyword"
},
"languages": {
"type": "text",
"analyzer": "whitespace_analyzer"
},
"phones": {
"type": "keyword"
},
"address": {
"properties": {
"street": {
"type": "text"
},
"city": {
"type": "text"
},
"number": {
"type": "integer"
}
}
}
}
}
}
}
开发人员可以使用API执行文档NoSQL数据库(至少是CRUD)的基本操作,然而,在ES中,搜索引擎的行为很重要并且很有用。这就是为什么它有一个扩展。
代码语言:javascript复制public class App {
public static void main(String[] args) {
Random random = new Random();
Long id = random.nextLong();
try (SeContainer container = SeContainerInitializer.newInstance().initialize()) {
Address address = Address.builder()
.withCity("Salvador")
.withStreet("Rua Engenheiro Jose")
.withNumber(10).build();
Developer developer = Developer.builder().
withPhones(Arrays.asList("85 85 343435684", "55 11 123448684"))
.withName("Poliana Lovelace")
.withId(id)
.withAddress(address)
.build();
DocumentTemplate documentTemplate = container.select(DocumentTemplate.class).get();
Developer saved = documentTemplate.insert(developer);
System.out.println("Developer saved" saved);
DocumentQuery query = select().from("developer")
.where("_id").eq(id).build();
Optional < Developer > personOptional = documentTemplate.singleResult(query);
System.out.println("Entity found: " personOptional);
}
}
private App() {}
}
在Elasticsearch扩展中,用户可以使用 QueryBuilders这一实用程序类在数据库中创建搜索查询。
代码语言:javascript复制public class App3 {
public static void main(String[] args) throws InterruptedException {
try (SeContainer container = SeContainerInitializer.newInstance().initialize()) {
Random random = new Random();
long id = random.nextLong();
Address address = Address.builder()
.withCity("São Paulo")
.withStreet("Av. nove de Julho 1854")
.withNumber(10).build();
Developer developer = Developer.builder().
withPhones(Arrays.asList("85 85 343435684", "55 11 123448684"))
.withName("Maria Lovelace")
.withId(id)
.withAddress(address)
.withLanguage("Java SE")
.withLanguage("Java EE")
.build();
ElasticsearchTemplate template = container.select(ElasticsearchTemplate.class).get();
Developer saved = template.insert(developer);
System.out.println("Developer saved" saved);
TimeUnit.SECONDS.sleep(2 L);
TermQueryBuilder query = QueryBuilders.termQuery("phones", "85 85 343435684");
List < Developer > people = template.search(query);
System.out.println("Entity found from phone: " people);
people = template.search(QueryBuilders.termQuery("languages", "java"));
System.out.println("Entity found from languages: " people);
}
}
private App3() {}
}
结论
具有直观方式在企业应用程序中查找数据的应用程序是主要的,主要是当软件处理大量数据类型时。Elasticsearch可以通过NoSQL文档和搜索引擎帮助Java EE世界。
原文标题《Connecting Elasticsearch Directly to your Java EE Application》
作者:Otavio Santana
译者:February
不代表云加社区观点,更多详情请查看原文链接