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。

原创文章,作者:carmelaweatherly,如若转载,请注明出处:https://blog.ytso.com/194731.html

(0)
上一篇 2021年11月16日
下一篇 2021年11月16日

相关推荐

发表回复

登录后才能评论