lucene复杂数据类型存储-创新互联
Lucene以Field作为key-value存储单元,Field的value可以为String、int、long、double、float和byte[]存储,开发过程中往往需要存储复杂的数据类型,例如List、Map等。下面将会讲解如何将复杂的对象转换为单一的key-value存储到lucene中。
创新互联2013年至今,先为洮南等服务建站,洮南等地企业,进行企业商务咨询服务。为洮南企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。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。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
分享题目:lucene复杂数据类型存储-创新互联
本文地址:http://abwzjs.com/article/cdgheh.html