使用Solr3.3分别索引文件内容和自定义元数据

时间:2011-08-25 05:07:00

标签: solr

我正在使用Solr3.3进行内容/文本搜索的POC。 我要求最初将文档以及内容及其自定义元数据编入索引。在索引文档并使其可供搜索之后,用户可以更改文档的自定义元数据。但是,一旦将文档添加到索引中,文档的内容就无法更新。当用户更新自定义元数据时,必须更新文档索引以反映搜索中的元数据更改。 但在索引更新期间,即使文件内容未更改,也会对其进行索引,从而导致元数据更新延迟。

所以我想检查是否有办法避免内容索引并只更新元数据? 或者我是否必须将内容和元数据存储在单独的索引文件中。即documentId,index1和documentId中的内容,另一个索引中的自定义元数据。在这种情况下,我如何查询这两个不同的索引并返回结果?

2 个答案:

答案 0 :(得分:1)

“如果有办法避免内容索引并仅更新元数据”solr indexing and reindexing已涵盖这一点,答案是否定的。

请记住,Solr使用非常宽松的架构。它就像一个数据库,所有东西都放在一个表中。想想稀疏矩阵,想想Amazon SimpleDB。 如果您考虑到类似DB的连接,则两个solr索引被视为两个数据库,而不是两个表。我刚刚在How to start and Stop SOLR from A user created windows service上回答了问题。

我会将每个文件输入为两个文档(solr文档=数据库行)。因此对于“watson”的文件:

id: docs_contents_watson
type:contents
text: text of the file

和元数据

id:docs_metadata_watson
type:metadata
author:A J Crown
year:1984

要搜索文档的内容: http://localhost:8080/app/select?q=type:contents&text:“在一个黑暗的孤独的夜晚”

进行元数据搜索: http://localhost:8080/app/select?q=type:metadata&year:1984

请注意类型:xx

这个可能是一个kludge (从长远来看会导致头痛的实施)。各位SO'ers,请批评一下。

答案 1 :(得分:1)

我们确实尝试了这个,它应该工作。在将其发送到lucene之前,先拍摄基本上有SOLrInputDocument对象的快照。压缩它并序列化对象,然后将其分配给模式中的另一个字段。将该字段设为二进制字段。

因此,当您想要将此信息更新到其中一个字段时,只需获取二进制字段,然后对其进行反序列化,并将值附加/更新到您感兴趣的字段,然后将其重新提供给lucene。

永远不要忘记将XML存储为SolrInputDocument中的一个字段,其中包含TIKA提取的用于搜索/索引的文本。

唯一的负面影响:你的索引大小会有所增长,但你可以得到你想要的东西,而无需重新提供数据。