Lucene以领域作为键值存储单元,字段的值可以为字符串,int,长,双浮子和byte[]存储,开发过程中往往需要存储复杂的数据类型,例如列表,地图等。下面将会讲解如何将复杂的对象转换为单一的键值存储到Lucene中。
Lucene支持多域值存储,同一个文档可以存储多个键相同的领域,简单理解就是Lucene支持键=值和键=[value1, value2]两种方式存储。我们需要做的就是将对象转换为键=值或者关键=(value1, value2,…)的格式存储。
例如,用户用户表的一行数据为
{
,,,,“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
}
这些数据,除了家庭之外,其他字段可以直接存储.台湾本身可以直接转换为json字符串存储,但是这样就无法使用家庭中的数据过滤条件,例如,查询儿童年龄年龄大于等于5的用户。可以将家庭做拆分,转换为families.children和families.partner存储。拆分后的键值为:
user_id=?0000001“
user_name=皌est1"
=30岁性=1
邮件=[“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=皐ife"
families.partner.age=28
families.partner.sex=2
families.partner.birth=?990 - 01 - 01 -“
状态=癆"
create_time=15648784644
update_time=15648784644
这样,将一个复杂的对象转换为了多个键值存储。查询儿童年龄年龄大于等于5的用户只需要设置条件NumericRangeQuery.newIntRange (“families.children.age" 5整数。MAX_VALUE,真的,真的)即可。
上面讲解的是如何将一个复杂类型拆分为多个字段存储,如果需要使用lucene存储数据,可以另外使用列存储,例如,以“_l"开始表示存储的json数组,“_m"开始表示存储的json对象,上面的用户对象可以拆分为
user_id=?0000001“
user_name=皌est1"
=30岁性=1
邮件=[“test1_1@126.com",“test1_2@126.com")
families.children.name=[“son1",“son2"]
families.children。年龄=[5,1]
families.children。性别=[1]
families.children.birth=(“2013 - 08年- 08 -“,“2017 - 01 - 01 -“]
families.partner.name=皐ife"
families.partner。年龄=28
families.partner。性=2
families.partner.birth=?990 - 01 - 01 -“
状态=癆"
create_time=15648784644
update_time=15648784644
_mfamilies=皗\ \“儿童”;null