在Lucene中存储结构化数据



我看到很多参考文献指向使用Lucene或Solr作为NoSQL数据存储,而不仅仅是索引引擎:NoSQL (MongoDB) vs Lucene(或Solr)作为您的数据库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”
    }
]
}

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

我可以想到两种方法来映射这两个lucene"文档":

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

  2. 找到一种聪明的方法,以某种方式将对象适合Lucene存储数据的方式。例如,使用点符号来平化字段,使用多值字段来存储单个集合值,然后在返回的途中以某种方式重新创建对象…

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

看看我的愚蠢的Lucene技巧:层次结构的一个方法。

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

<>之前"addresses_type":("家","办公室"],"addresses_line1":("主街一号","邮政信箱1234号"],"addresses_city":("纽约",""],"addresses_zip":(","10000"]

最新更新