3

我看到很多引用指向使用 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 存储数据的方式中。即使用点符号来平展字段,使用多值字段来存储单个集合值,然后以某种方式在返回的路上重新创建对象......

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

4

2 回答 2

0

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

    “地址类型”: [
    “家”,
    “办公室”
    ],
    "addresses_line1": [
    “1大街”,
    “邮政信箱 1234”
    ],
    "addresses_city": [
    “纽约”,
    “”
    ],
    "addresses_zip": [
    "",
    “10000”
    ]

于 2014-10-13T11:39:20.897 回答
0

看看我的Stupid Lucene Tricks: Hierarchies for one approach。

于 2014-01-08T03:08:29.837 回答