【问题标题】:How to add nested json object to Lucene Index如何将嵌套的 json 对象添加到 Lucene 索引
【发布时间】:2015-02-27 08:15:04
【问题描述】:

我需要一些关于 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??

【问题讨论】:

  • 不确定 Lucene。但是在 Solr 中,我只是将这些 json 对象展平并对其进行索引。
  • 嗯,我必须说我从未使用过 Solr,但我记得 Solr 的底层是 Lucene。无论如何,我认为我需要更详细地探索 Solr,因为我在 StackOvreflow 上看到每个人都提到 Solr。 :-) 你有在 Solr 中这样做的任何例子吗?谢谢
  • 在 solr 中,我会添加 PhoneData_PhoneType 并同样将其他人弄平。
  • 鉴于这是唯一的,请您接受我的最佳答案吗? (15 分)谢谢

标签: json lucene lucene.net


【解决方案1】:

为了索引 JSON 对象,我会这样做:

  1. 将整个值存储在有效负载字段下,例如命名为$json。该字段将被存储但不会被索引。
  2. 为每个(可索引的)属性(可能是嵌套的)创建一个可索引字段,其名称为 XMLPath 类似的表达式来标识该属性,例如 PhoneData.PhoneType

如果所有嵌套属性都被索引是可以的,那么它很简单,只需遍历所有这些属性以生成这个可索引字段。

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

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

我创建了一个库来做这个(以及更多),也许可以帮助你。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多