【问题标题】:Using CouchDB-lucene how can I index an array of objects (not values)使用 CouchDB-lucene 如何索引对象数组(不是值)
【发布时间】:2011-11-11 18:04:28
【问题描述】:

大家好,提前感谢任何想法、建议或答案。

首先,环境:我使用的是CouchDB(目前在1.0.2上开发)和couchdb-lucene 0.7。显然,我使用 couchdb-lucene(以下简称“c-l”)在 couchdb 中提供全文搜索。

其次,我给大家提供一个例子couchdb文档:

{
   "_id": "5580c781345e4c65b0e75a220232acf5",
   "_rev": "2-bf2921c3173163a18dc1797d9a0c8364",
   "$type": "resource",
   "$versionids": [
       "5580c781345e4c65b0e75a220232acf5-0",
       "5580c781345e4c65b0e75a220232acf5-1"
   ],
   "$usagerights": [
       {
           "group-administrators": 31
       },
       {
           "group-users": 3
       }
   ],
   "$currentversionid": "5580c781345e4c65b0e75a220232acf5-1",
   "$tags": [
       "Tag1",
       "Tag2"
   ],
   "$created": "/Date(1314973405895-0500)/",
   "$creator": "administrator",
   "$modified": "/Date(1314973405895-0500)/",
   "$modifier": "administrator",
   "$checkedoutat": "/Date(1314975155766-0500)/",
   "$checkedoutto": "administrator",
   "$lastcommit": "/Date(1314973405895-0500)/",
   "$lastcommitter": "administrator",
   "$title": "Test resource"
}

第三,让我解释一下我想做什么。我试图弄清楚如何索引“$usagerights”属性。我非常松散地使用索引这个词,因为我真的不关心能够搜索它,我只是想“存储”它,以便它与搜索结果一起返回。无论如何,该属性是一个 json 对象数组。现在,组成数组的这些 json 对象将始终具有一个 json 属性。

根据我对 couchdb-lucene 的理解,我需要将此数组缩减为逗号分隔的字符串。我希望像“group-administrators:31,group-users:3”这样的东西是最终输出。

因此,我的问题本质上是:如何将上面的 $usagerights json 数组减少为 couchdb-lucene 使用的 couchdb 设计文档中的逗号分隔的键:值对字符串?

我之前发的一个类似情况下关于标签索引的问题,供参考:How-to index arrays (tags) in CouchDB using couchdb-lucene

最后,如果您需要任何其他详细信息,请发表评论,我会提供。

【问题讨论】:

    标签: arrays json indexing couchdb couchdb-lucene


    【解决方案1】:

    也许我遗漏了一些东西,但我从您之前的问题中看到的唯一区别是您应该迭代对象。那么代码应该是:

    function(doc) {
      var result = new Document(), usage, right;
      for(var i in doc.$usagerights) {
        usage = doc.$usagerights[i];
        for(right in usage) {
          result.add(right + ":" + usage[right]);
        }
      }
      return result;
    }
    

    【讨论】:

    • Marcello,非常感谢您的回复。你的方法我试过了,效果很好。
    【解决方案2】:

    不需要转换为以逗号分隔的值列表(我很想知道您是从哪里获得这个想法的)。

    如果您只是想在结果中返回 $usagerights 项,请执行此操作;

    ret.add(JSON.stringify(doc.$usagerights),
      {"index":"no", "store":"yes", "field":"usagerights"});
    

    Lucene 存储字符串,而不是 JSON,因此您需要 JSON.parse 查询字符串。

    【讨论】:

    • 罗伯特,感谢您抽出宝贵时间。我应该更清楚。正如你所说,它需要是一个字符串,而不是 JSON。我刚刚添加了逗号要求,这样我就有一种简单的方法来解析程序中返回的“存储”值。我真的很感激帮助。感谢您为该项目所做的工作!
    • 由于 Robert 的简化代码和包含 c-l 字段(例如,索引、存储、字段),此处给出了正确答案。我忘了使用索引字段,所以谢谢你的提醒。
    • 不客气!我很高兴你喜欢 couchdb-lucene :)
    • 我会在这里为那些关注我的答案的人添加一个警告。 CouchDB-Lucene 没有定义 JSON 类,因此您目前需要自己包含它以遵循我上面的建议。不过,也许我可以在 0.9 以后添加它。
    • 我升级到包含 JSON 类的 Rhino 1.7R3(添加了一个单元测试来证明这一点),所以这将从 0.9.0 开始工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2011-03-03
    • 2023-02-11
    • 1970-01-01
    相关资源
    最近更新 更多