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

2018-11-14 16:50:36 浏览数 (1)

时髦的大数据来自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
  • 请参阅此处。
  • 运行以下命令:
代码语言:javascript复制
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)。

代码语言:javascript复制
{
  "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

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

0 人点赞