Elastic Search同步postgre数据时候,遇见的时间类型的问题。

由于现在的需求,postgre进行全文检索的复杂性,时效性,和匹配不准确性,采用elastic search来进行全文检索。

首先是同步数据,在同步数据过程中,之前created_at字段是timestamp类型,导致死活同步不过去,

第一版是同步为text类型,但是我们要进行时间的检索,text格式的时间就不能满足要求,放弃。

第二版是查阅资料,得知es的date格式默认是'yyyy-MM-dd'T'HH:mm:ssZ',我是采取的postgre外部表的方式同步数据的(不了解的同学可以搜搜资料。,我这里不再多说),建立外部表的时候,原先的created_at要设置成text类型。

然后创建索引的时候字段按照图中设计,type是“date”,format是'yyyy-MM-dd'T'HH:mm:ssZ',

{
    "mappings": {
        "internalnews": {
            "properties": {
                "title": {
                    "type": "text",
					"analyzer": "ik_max_word"
                },
                "url": {
                    "type": "text"
                },
                "news_id": {
                    "type": "keyword"
                },
                "content": {
                    "type": "text",
					"analyzer": "ik_max_word"
                },
                "author": {
                    "type": "text"
                },
                "u_datetime": {
                    "type": "date",
                    "format": "yyyy-MM-dd'T'HH:mm:ssZ"
                },
                "publish_time": {
                    "type": "text"
                },
                "read_num": {
                    "type": "long"
                },
                "comment_num": {
                    "type": "long"
                },
                "created_at": {
                    "type": "date",
                    "format": "yyyy-MM-dd'T'HH:mm:ssZ"
                }
            }
        }
    }
}

然后写了一个触发器,原表新增的时候给外部表进行新增,函数中的内容是:要按照之前创建索引的格式进行格式化数据,to_char(NEW.u_datetime,'YYYY-MM-DD"T"HH24:MI:SSZ')

CREATE OR REPLACE FUNCTION "public"."index_intetnal_news"()
  RETURNS "pg_catalog"."trigger" AS $BODY$
    BEGIN
	
        INSERT INTO internal_news_es (id, title, url, news_id, content,author,u_datetime,read_num,comment_num,created_at) VALUES
            (NEW.id, NEW.title, NEW.url, NEW.news_id, NEW.content,NEW.author,to_char(NEW.u_datetime,'YYYY-MM-DD"T"HH24:MI:SSZ'),
						NEW.read_num,NEW.comment_num,to_char(NEW.created_at,'YYYY-MM-DD"T"HH24:MI:SSZ'));
        RETURN NEW;
    
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

这样数据是能同步过去,也是时间格式,但是在es数据中存储的就是这种时间格式,所以在检索时候,java代码中也要对界面传过来的时间参数进行这种格式化。

第三版偶然看到:在创建index的时候,可以指定多个date的format格式,

 "u_datetime": {
                    "type": "date",
                    "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd'T'HH:mm:ssZ"
                },

这样,在向外部表插入数据的时候,无论是之前的to_char(NEW.created_at,'YYYY-MM-DD"T"HH24:MI:SSZ'),还是我新写的to_char(NEW.created_at,'YYYY-MM-DD HH24:MI:SS')都可以。

boolQueryBuilder.must(QueryBuilders.rangeQuery("created_at").gte(startTime).lte(endTime));

而且在写接口进行检索时间的时候也不用在对时间格式进行转化了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值