如何将嵌套的json对象添加到Lucene Index

时间:2013-09-21 14:23:32

标签: json lucene lucene.net

我需要一些关于lucene索引文件的帮助,想一想,也许你们中的一些人可以帮助我。

我有这样的json:

[
{
    "Id": 4476,
    "UrlName": null,
    "PhoneData": [
        {
            "PhoneType": "O",
            "PhoneNumber": "0065898",
        },
        {
           "PhoneType": "F",
            "PhoneNumber": "0065898",
        }
    ],
    "Contact": [],
    "Services": [
        {
            "ServiceId": 10,
            "ServiceGroup": 2
        },
        {
            "ServiceId": 20,
            "ServiceGroup": 1
        }
    ],
}

添加前两个字段相对简单:

// add lucene fields mapped to db fields
        doc.Add(new Field("Id", sampleData.Id.Value.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
        doc.Add(new Field("UrlName", sampleData.UrlName.Value ?? "null" , Field.Store.YES, Field.Index.ANALYZED));

但是如何将PhoneData和Services添加到索引中以便它可以连接到唯一的Id ??

1 个答案:

答案 0 :(得分:2)

对于索引JSON对象,我会这样:

  1. 将整个值存储在有效负载字段下,例如$json。该字段将被存储但不会被编入索引。
  2. 对于每个(可索引)属性(可能是嵌套的),创建一个可索引字段,其名称为标识属性的 XMLPath 类似表达式,例如PhoneData.PhoneType
  3. 如果可以将所有嵌套属性编入索引,那么它很简单,只需遍历所有这些属性就可以生成这个可索引字段。

    但是如果你不想索引所有这些(更现实的情况),那么如何知道哪个属性是可索引的是另一个问题;在这种情况下你可以:

    • 从客户端接受存储文档时要创建的索引字段的路径表达式,或
    • 使用JSON Schema来描述您的数据(假设您的JSON记录具有公共架构),并使用自定义属性对其进行扩展,以允许您标记哪些属性是可索引的。

    我创建了一个这样做的库(以及更多),可能对你有帮助。

    您可以在https://github.com/brutusin/flea-db

    查看