千家信息网

lucene复杂数据类型存储

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,Lucene以Field作为key-value存储单元,Field的value可以为String、int、long、double、float和byte[]存储,开发过程中往往需要存储复杂的数据类型,例
千家信息网最后更新 2026年10月31日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安全错误 数据库的锁怎样保障安全 广东猪兼强互联网科技有限公司 互联网科技公司经营范围 互联网和科技创新 上海互联网科技有限公司 万易互联网科技有限公司 中国互联网科技发展 科技类的互联网平台 湖南洣水互联网科技有限公司扣款 互联网金融科技公司干啥的 上海宁丞科技互联网 乌苏新华互联网科技做什么的 互联网科技和法律行业 特约风豹互联网科技为什么扣费 华中科技大学互联网的牛人 风投北京互联网科技 上海同邻互联网科技有限公司规模 互联网科技收购价值 恒生科技指数 中概互联网 瑞安市蟠桃会互联网科技有限公司 广州全民伙伴互联网科技有限公司 小米移动互联网科技园 互联网科技logo设计 兼蜜互联网科技 互联网高科技企业 华脉科技工业互联网产品 广西拼得多互联网科技有限公司 互联网科技产品 科技互联网大厂 乌苏新华互联网科技做什么的 互联网科技融合创新
0