千家信息网

lucene复杂数据类型存储

发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,Lucene以Field作为key-value存储单元,Field的value可以为String、int、long、double、float和byte[]存储,开发过程中往往需要存储复杂的数据类型,例
千家信息网最后更新 2024年11月11日lucene复杂数据类型存储

Lucene以Field作为key-value存储单元,Field的value可以为String、int、long、double、float和byte[]存储,开发过程中往往需要存储复杂的数据类型,例如List、Map等。下面将会讲解如何将复杂的对象转换为单一的key-value存储到lucene中。


lucene支持多域值存储,同一个Document可以存储多个key相同的Field,简单理解就是lucene支持key=value和key=[value1,value2]两种方式存储。我们需要做的就是将对象转换为key=value或者key=[value1,value2,...]的格式存储。


例如,用户表user的一行数据为

{

"user_id" : "00000001",

"user_name": "test1",

"age":30,

"sex":1,

"emails":["test1_1@126.com","test1_2@126.com"],

"families" : {

"children" : [

{

"name":"son1",

"age":5,

"sex":1,

"birth":"2013-08-08"

},

{

"name":"son2",

"age":1,

"sex":1,

"birth":"2017-01-01"

}

],

"partner":{

"name":"wife",

"age":28,

"sex":2,

"birth":"1990-01-01"

}

}

"state":"A",

"create_time":15648784644,

"update_time":15648784644

}

这些数据,除了families之外,其他字段可以直接存储。families本身可以直接转换为json字符串存储,但是这样就无法使用families中的数据过滤条件。例如,查询children年龄age大于等于5的用户。可以将families做拆分,转换为families.children和families.partner存储。拆分后的key-value为:

user_id="00000001"

user_name="test1"

age=30

sex=1

emails=["test1_1@126.com","test1_2@126.com"]

families.children.name=["son1","son2"]

families.children.age=[5,1]

families.children.sex=[1]

families.children.birth=["2013-08-08","2017-01-01"]

families.partner.name="wife"

families.partner.age=28

families.partner.sex=2

families.partner.birth="1990-01-01"

state="A"

create_time=15648784644

update_time=15648784644


这样,将一个复杂的对象转换为了多个key-value存储。查询children年龄age大于等于5的用户只需要设置条件NumericRangeQuery.newIntRange("families.children.age", 5, Integer.MAX_VALUE, true, true)即可。


上面讲解的是如何将一个复杂类型拆分为多个Field存储,如果需要使用lucene存储数据,可以另外使用列存储。例如,以"_l"开始表示存储的json数组,"_m"开始表示存储的json对象,上面的user对象可以拆分为

user_id="00000001"

user_name="test1"

age=30

sex=1

emails=["test1_1@126.com","test1_2@126.com"]

families.children.name=["son1","son2"]

families.children.age=[5,1]

families.children.sex=[1]

families.children.birth=["2013-08-08","2017-01-01"]

families.partner.name="wife"

families.partner.age=28

families.partner.sex=2

families.partner.birth="1990-01-01"

state="A"

create_time=15648784644

update_time=15648784644

_mfamilies="{\"children\" : [{\"name\":\"son1\",\"age\":5,\"sex\":1,\"birth\":\"2013-08-08\"},{\"name\":\"son2\",\"age\":1,\"sex\":1,\"birth\":\"2017-01-01\"}],\"partner\":{\"name\":\"wife\",\"age\":28,\"sex\":2,\"birth\":\"1990-01-01\"}}"


读取值时,field.name()包含"."可以直接跳过,_m开头的field值转换为map,_l开头的field值转换为List。


存储 数据 对象 复杂 多个 用户 类型 就是 年龄 开头 条件 支持 查询 相同 一行 单元 字段 字符 字符串 数组 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 指定位置创建数据库的sql语句 上海笔咖网络技术有限公司 246石器时代数据库 搭建一个文件下载服务器需要带宽 大学生网络安全感问卷 北京天盈九州网络技术怎样 腾讯轻量云服务器流量用完 商业网络技术 软件开发计划书所需软硬件 网络安全受到空前重视 人社局 网络安全宣传周总结 迈普通信软件开发工程师面试 数据库查询时去除乱码 服务器是否启动linux 网络安全的成效 河北品质软件开发过程服务标准 广州旗飞网络技术有限公司 学软件为什么要学习数据库 天津服务器机房厂家直销虚拟主机 哪一个服务器机箱比较好 246石器时代数据库 棋牌软件开发游戏代理 自定义数据库的大宗交易 java和网络安全哪个有前景 网络安全常识常用的病毒查杀技术 番禺网络数据库维护找哪家 2020怀旧服哪个服务器均衡 网络安全服务小规模纳税人税率 网络安全领导机构及职责 苹果app对接服务器
0