Jkes是一个基于Java、Kafka、ElasticSearch的搜索框架。Jkes提供了注解驱动的JPA风格的对象/文档映射,使用REST API用于文档搜索。
项目主页:https://github.com/chaokunyang/jkes
可以参考jkes-integration-test
项目快速掌握jkes框架的使用方法。jkes-integration-test
是我们用来测试功能完整性的一个Spring Boot Application。
jkes-index-connector
和jkes-delete-connector
到Kafka Connect类路径提供JkesProperties Bean
这里可以很灵活,如果使用Spring Boot,可以使用@ConfigurationProperties
提供配置
增加索引管理端点 因为我们不知道客户端使用的哪种web技术,所以索引端点需要在客户端添加。比如在Spring MVC
中,可以按照如下方式添加索引端点
使用com.timeyang.jkes.core.annotation
包下相关注解标记实体
当更新实体时,文档会被自动索引到ElasticSearch;删除实体时,文档会自动从ElasticSearch删除。
启动搜索服务jkes-search-service,搜索服务是一个Spring Boot Application,提供rest搜索api,默认运行在9000端口。
URI query
Nested query
match query
bool query
Source filtering
prefix
wildcard
regexp
索引工作原理:
@Document
注解的实体,为它们构建元数据。index
和mapping
Json格式的配置,然后通过ElasticSearch Java Rest Client
将创建/更新index
配置。Kafka ElasticSearch Connector
,用于创建/更新文档Jkes Deleter Connector
,用于删除文档* save(*)
方法返回的数据包装为SaveEvent
保存到EventContainer
;使用(* delete*(..)
方法的参数,生成一个DeleteEvent/DeleteAllEvent
保存到EventContainer
。JkesKafkaProducer
发送SaveEvent
中的实体到Kafka,Kafka会使用我们提供的JkesJsonSerializer
序列化指定的数据,然后发送到Kafka。SaveEvent
不同,DeleteEvent
会直接被序列化,然后发送到Kafka,而不是只发送一份数据SaveEvent
和DeleteEvent
不同,DeleteAllEvent
不会发送数据到Kafka,而是直接通过ElasticSearch Java Rest Client
删除相应的index
,然后重建该索引,重启Kafka ElasticSearch Connector
查询工作原理:
json
请求,进行一些预处理后,使用ElasticSearch Java Rest Client
转发到ElasticSearch,将得到的响应进行解析,进一步处理后返回到客户端。jkes-core
是整个jkes
的核心部分。主要包括以下功能:
annotation
包提供了jkes的核心注解elasticsearch
包封装了elasticsearch
相关的操作,如为所有的文档创建/更新索引,更新mappingkafka
包提供了Kafka 生产者,Kafka Json Serializer,Kafka Connect Clientmetadata
包提供了核心的注解元数据的构建与结构化模型event
包提供了事件模型与容器exception
包提供了常见的Jkes异常http
包基于Apache Http Client
封装了常见的http json请求support
包暴露了Jkes核心配置支持util
包提供了一些工具类,便于开发。如:Asserts, ClassUtils, DocumentUtils, IOUtils, JsonUtils, ReflectionUtils, StringUtilsjkes-boot
用于与一些第三方开源框架进行集成。
当前,我们通过jkes-spring-data-jpa
,提供了与spring data jpa
的集成。通过使用Spring的AOP机制,对Repository
方法进行拦截,生成SaveEvent/DeleteEvent/DeleteAllEvent
保存到EventContainer
。通过使用我们提供的SearchPlatformTransactionManager
,对常用的事务管理器(如JpaTransactionManager
)进行包装,提供事务拦截功能。
在后续版本,我们会提供与更多框架的集成。
jkes-spring-data-jpa
说明:
ContextSupport
类用于从bean工厂获取Repository Bean
@EnableJkes
让客户端能够轻松开启Jkes的功能,提供了与Spring一致的配置模型EventSupport
处理事件的细节,在保存和删除数据时生成相应事件存放到EventContainer
,在事务提交和回滚时处理相应的事件SearchPlatformTransactionManager
包装了客户端的事务管理器,在事务提交和回滚时加入了回调hook
audit
包提供了一个简单的AuditedEntity
父类,方便添加审计功能,版本信息可用于结合ElasticSearch
的版本机制保证不会索引过期文档数据exception
包封装了常见异常intercept
包提供了AOP切点和切面index
包提供了全量索引
功能。当前,我们提供了基于线程池
的索引机制和基于ForkJoin
的索引机制。在后续版本,我们会重构代码,增加基于阻塞队列
的生产者-消费者
模式,提供并发性能jkes-services
主要用来提供一些服务。 目前,jkes-services
提供了以下服务:
jkes-delete-connector
jkes-delete-connector
是一个Kafka Connector
,用于从kafka集群获取索引删除事件(DeleteEvent
),然后使用Jest Client
删除ElasticSearch中相应的文档。jkes-delete-connector
,就可以自动处理该项目的文档删除工作。避免了每启动一个新的项目,我们都得手动启动一个Kafka Consumer来处理该项目的文档删除工作。尽管可以通过正则订阅来减少这样的工作,但是还是非常不灵活jkes-search-service
jkes-search-service
是一个restful的搜索服务,提供了多版本的rest query api。查询服务提供多版本API,用于API进化和兼容jkes-search-service
目前支持URI风格的搜索和JSON请求体风格的搜索。json
请求,进行一些预处理后,使用ElasticSearch Java Rest Client
转发到ElasticSearch,将得到的响应进行解析,进一步处理后返回到客户端。后续,我们将会基于zookeeper
构建索引集群,提供集群索引管理功能
jkes-integration-test
是一个基于Spring Boot集成测试项目,用于进行功能测试
。同时测量一些常见操作的吞吐率
To build a development version you’ll need a recent version of Kafka. You can build jkes with Maven using the standard lifecycle phases.
This project is licensed under Apache License 2.0.