前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >将Elasticsearch直接连接到Java EE应用程序

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

作者头像
February
修改2018-11-14 16:50:36
9990
修改2018-11-14 16:50:36
举报
文章被收录于专栏:技术翻译技术翻译技术翻译

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

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

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 搜索引擎中的步骤
  • 如何在Docker中安装ElasticSearch
  • Elasticsearch和Java EE协同工作
  • 结论
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档