在Lucene中存储结构化数据

时间:2013-04-10 02:57:37

标签: mongodb search solr lucene nosql

我看过许多引用指向使用Lucene或Solr作为NoSQL数据存储,而不仅仅是索引引擎: NoSQL (MongoDB) vs Lucene (or Solr) as your database http://searchhub.org/2010/04/29/for-the-guardian-solr-is-the-new-database/

然而,由于Lucene只提供“平面”文档结构,其中每个字段可以是多值(标量),我似乎无法完全理解人们如何将复杂的结构化数据映射到Lucene中以用于索引和存储。例如:

{
"firstName": "Joe",
"lastName": "Smith",
"addresses" : [
    {
        "type" : "home", 
        "line1" : "1 Main Street",
        "city" : "New York",
    },
    {
        "type" : "office",
        "line1" : "P.O. Box 1234",
        "zip:“10000”
    }
]
}

事情显然会变得更加复杂。即如果对象有两个集合:地址和电话号码怎么办?如果地址本身有一个集合呢?

我可以想出两种方法来映射这两个lucene“文档”:

  1. 创建一个存储但未编入索引的字段来存储对象的JSON / BSON版本,然后创建其他索引但不存储用于索引/搜索的字段。

  2. 找到一种智能方法,以某种方式使对象适合Lucene存储数据的方式。即使用点表示法来平整字段,使用多值字段存储单个集合值,然后以某种方式在返回途中重新创建对象...

  3. 我想知道人们之前是否已经处理过类似的问题以及你使用了什么解决方案?

2 个答案:

答案 0 :(得分:0)

查看我的Stupid Lucene Tricks: Hierarchies一种方法。

答案 1 :(得分:0)

这取决于用途。 如果只需要它们进行显示,可以将复数值(地址)作为JSON字符串并将其存储为多个值字段,如果需要将它们用作索引,可以选择以下结构:


    "addresses_type": [
    "home",
    "office"
    ],
    "addresses_line1": [
    "1 Main Street",
    "P.O. Box 1234"
    ],
    "addresses_city": [
    "New York",
    ""
    ],
    "addresses_zip": [
    "",
    "10000"
    ]