将Elasticsearch直接连接到Java EE应用程序

时髦的大数据来自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 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扩展。

<dependency>
    <groupId>org.jnosql.artemis</groupId>
    <artifactId>elasticsearch-extension</artifactId>
    <version>0.0.5</version>
</dependency>

对于此演示,我们将为开发人员创建一个联系人议程,其中包含姓名,地址,当然还有他们所知道的语言。地址具有字段并成为文档内的文档的子文档。

@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中,搜索引擎的行为很重要并且很有用。这就是为什么它有一个扩展。

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这一实用程序类在数据库中创建搜索查询。

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

不代表云加社区观点,更多详情请查看原文链接

原文链接:https://dzone.com/articles/elasticsearch-a-powerful-and-easy-search-engine-di-2

原文作者:Otavio Santana

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏移动开发的那些事儿

BlockCanary源码解析

如上代码中的loop()方法是Looper中的,我们的目的是监测主线程的卡顿问题,因为UI更新界面都是在主线程中进行的,所以在主线程中做耗时操作可能会造成界面卡...

17120
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第三十天 Activiti工作流【悟空教程】

工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的...

1.5K30
来自专栏恰童鞋骚年

.NET单元测试的艺术-1.入门

开篇:最近在看Roy Osherove的《单元测试的艺术》一书,颇有收获。因此,将其记录下来,并分为四个部分分享成文,与各位Share。本篇作为入门,介绍了单元...

12220
来自专栏分布式系统进阶

Influxdb 数据写入流程

因此对写入请求的处理就在函数 func (h *Handler) serveWrite(w http.ResponseWriter, r *http.Reque...

21330
来自专栏信安之路

HCTF2017的三个WriteUp

解决方法就是先 undefine 掉函数,再右键选择 Code,最后 Create function 就可以正常反编译了。

12400
来自专栏玄魂工作室

看代码学安全(7 )- parse_str函数缺陷

--------------------------------------------------------------------------------...

15710
来自专栏熊二哥

快速入门系列--WebAPI--04在老版本MVC4下的调整

WebAPI是建立在MVC和WCF的基础上的,原来微软老是喜欢封装的很多,这次终于愿意将http编程模型的相关细节暴露给我们了。在之前的介绍中,基本上都基于.N...

24860
来自专栏有趣的django

37.Django1.11.6文档

第一步 入门 检查版本 python -m django --version 创建第一个项目 django-admin startproject mysite ...

51980
来自专栏FD的专栏

Brainfuck JIT Compiler in Rust

我们都知道,对于解释型的语言实现来说,性能是大家关注的焦点。比如,这位 Tondbal ik Ni 曾经还说过:

17530
来自专栏Java帮帮-微信公众号-技术文章全总结

Activiti学习详解【面试+工作】

一:Activiti第一天 1:工作流的概念 ? 说明: 1) 假设:这两张图就是XX兄弟的请假流程图 2) 图的组成部分: A. 人物:范XX 冯X刚 王X军...

77150

扫码关注云+社区

领取腾讯云代金券