lucene-candy的介绍

在之前的项目中,我们实现了一个名为lucene-plus的组件,用以封装lucene,并使其与Spring Boot框架集成。然而,在实际使用过程中,我们发现lucene-plus的架构设计存在诸多不足,不符合日常开发习惯,更重要的是它缺乏数据在多节点间的同步机制。虽然网络磁盘等技术提供了一种可能的解决方案,但我们认为这不是最优的方案。因此,我们决定重新设计并实现一个名为lucene-candy的新组件,提高团队的使用体验,同时也尝试寻求lucene实例数据同步的新方案。

lucene-candy的核心功能

  1. 实体与索引的ORM映射
    lucene-candy为开发者提供了实体与索引之间的ORM映射功能,这意味着开发者无需关心如何将实体对象转换为Lucene的Document对象,以及如何将搜索结果映射回实体对象。Lucene-Candy会自动处理这些转换过程,大大降低了开发者的学习成本和使用门槛。

  2. 简化lucene API
    lucene-candy对Lucene的增删改查API进行了简化封装,使得开发者能够更加方便地使用Lucene的各种功能。同时,Lucene-Candy还实现了自动化管理Lucene的Reader/Writer,确保索引的稳定性和一致性。

  3. 多节点数据同步方案
    lucene-candy提供了两套完整的多节点数据同步方案,确保在多个节点上运行的lucene实例能够保持数据的一致性。配置如下:

lucene-candy:
  data-sync: default     #数据同步方式:default、tcc、msg(选填)

如何使用lucene-candy

使用lucene-candy非常简单,只需要在Spring Boot项目中引入相关的依赖,并进行简单的配置即可。下面是一个简单的示例:

  • 引入依赖:
<dependency>
    <groupId>cn.juque</groupId>
    <artifactId>lucene-candy</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
  • 在application-*.yml添加配置(单节点可以忽略所有的选填项):
lucene-candy:
  data-path: D:\\candy\\ # 存放数据的目录(必填)
  secret: 123456fdew     # 多实例的情况下,实例的可信赖凭据(选填)
  ip-protocol: http      # 数据同步的http 或https协议(选填)
  ip: 127.0.0.1:8080     # 指定当前实例的ip端口(必填)
  ip-cluster: ''         # 多实例情况下,其他实例的ip端口(选填)
  data-sync: default     #数据同步方式:default、tcc、msg(选填)
  • 定义实体,注解@Index绑定指定的索引,注解@Field绑定指定的文档字段:
package cn.juque.lucenecandy.entity;

import cn.juque.lucenecandy.core.annotation.Field;
import cn.juque.lucenecandy.core.annotation.Index;
import cn.juque.lucenecandy.core.base.BaseEntity;
import cn.juque.lucenecandy.core.enums.DataTypeEnum;
import lombok.Data;

@Data
@Index(value = "jdf_config_info")
public class ConfigInfo extends BaseEntity {

    /**
     * 配置名称
     */
    @Field(value = "config_name")
    private String configName;

    /**
     * 域
     */
    @Field(value = "scope")
    private Integer scope;

    /**
     * 配置编码
     */
    @Field(value = "config_code")
    private String configCode;

    /**
     * 配置值
     */
    @Field(value = "config_value")
    private String configValue;

    /**
     * 有效标识
     */
    @Field(value = "valid_flag", type = DataTypeEnum.INT)
    private Integer validFlag;

    /**
     * 是否允许同步
     */
    @Field(value = "sync_flag", type = DataTypeEnum.INT)
    private Integer syncFlag;

    /**
     * 备注
     */
    @Field(value = "remark")
    private String remark;

}

  • 新增操作
ConfigInfo configInfo = new ConfigInfo();
        configInfo.setId(IdUtil.fastSimpleUUID());
        configInfo.setConfigName("bb");
        configInfo.setConfigCode("bb45");
        configInfo = this.indexHelper.addDocument(configInfo);
        Assert.assertTrue(configInfo.getVersion() > 0);

*更新操作

ConfigInfo configInfo = new ConfigInfo();
        configInfo.setId(ID);
        configInfo.setConfigName("哈哈哈");
        configInfo.setConfigCode("bb45");
        this.indexHelper.updateDocumentById(configInfo);
  • 删除操作
DeleteByIdsWrapperBuilder<ConfigInfo> deleteByIdsWrapperBuilder = new DeleteByIdsWrapperBuilder<>(ConfigInfo.class, CollUtil.newArrayList("1"));
        this.indexHelper.deleteByIds(deleteByIdsWrapperBuilder.build());
  • 查询操作
QueryWrapperBuilder<ConfigInfo> builder = new QueryWrapperBuilder<>(ConfigInfo.class);
        List<ConfigInfo> list = this.indexHelper.search(builder.build());
        Assert.assertTrue(CollUtil.isNotEmpty(list));
  • 分页查询操作
PageInfo pageInfo = new PageInfo();
        pageInfo.setPage(1);
        pageInfo.setLimit(10);
        QueryWrapperBuilder<ConfigInfo> builder = new QueryWrapperBuilder<>(ConfigInfo.class);
        builder
                .pageInfo(pageInfo)
                .matchStr(ConfigInfo::getConfigName, "bb", MatchTypeEnum.TERM, BooleanClause.Occur.MUST)
                .addField(ConfigInfo::getConfigName, ConfigInfo::getConfigCode);
        List<ConfigInfo> list = this.indexHelper.searchByPage(builder.build());
        Assert.assertTrue(CollUtil.isNotEmpty(list));

在上述示例中,IndexHelper是lucene-candy提供的一个核心类,它封装了与lucene的交互逻辑,包括索引的创建、文档的添加、搜索以及删除等。开发者只需要通过IndexHelper来操作实体对象,无需关心底层的Lucene细节。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容