2012-05-30 121 views
2

无法从Solr集合中删除文件中的密钥。无法删除Solr密钥

更新Solr的收集与此:

<cfoutput query="fileQuery"> 
    <cfset theFile = defaultpath & "#fileID#.pdf" /> 

    <cfif fileExists(theFile)> 
    <cfindex 
     action="update" 
     collection="file_vault_solr" 
     type="file" 
     key="#theFile#" 
     title="#documentName#" 
     body="fileNumber,documentName" 
     custom1="/filevault/#filealias#" 
     custom2="#fileNumber#" 
     custom3="#documentName#" 
    > 
    </cfif> 
</cfoutput> 

但是,试图删除目录中的钥匙时,它根本不起作用。以下是用于(尝试)删除密钥的代码:

<cfoutput query="deletedFile"> 
    <cfset theFile = defaultpath & "#fileID#.pdf" /> 

    <!--- Remove the deleted file from the collection. ---> 
    <cfindex 
    collection="file_vault_solr" 
    type="file" 
    action="Delete" 
    key="#theFile#" 
    > 
</cfoutput> 

但是,密钥不会被删除。唯一有效的工作是清除整个目录并重新索引所有文件。

任何见解?

+0

你有没有发现过?我目前有同样的问题。 – Tomalak

+0

@Tomalak:不,从未找到解决方案。现在我不再在那里工作了,所以如果我愿意,我不能回去确认。 – ale

+2

无赖。这个问题让我很紧张。 Adobe似乎没有人再测试这些东西。 – Tomalak

回答

2

关键必须与Solr的索引完全匹配。因此,请确保两者中的“defaultpath”相同,并检查大小写是否相符,因为我相信Solr区分大小写。

1

要调试这个,我建议你添加status =“myStatusVar”给cfindex调用。然后在添加和删除上看看发生了什么。如果删除没有返回已删除的计数。然后有一个密钥不匹配。

<cfindex 
collection="file_vault_solr" 
type="file" 
action="Delete" 
key="#theFile#" 
status="myStatusVar" 
> 
7

经过大量的调试,我发现了。

这种行为的原因是一个非常......呃......不幸的呃......“设计决定”Adobe在实现ColdFusion和Solr之间的接口时所采取的。

因此,你有索引文件的Solr集合,并希望有选择地清除磁盘上不再存在的索引文件。我敢肯定这是你一直在确切的情况

假设:

  • 有一个名为/path/to/file您的系统上
  • 它Solr的集合foo的索引。

当你发出一个<cfindex collection="foo" action="delete" key="/path/to/file">,ColdFusion的发送以下HTTP请求到Solr:

POST /solr/foo/update?wt=xml&version=2.2 (application/xml; charset=UTF-8) 
<delete><id>1247603285</id></delete> 

这是Solr的将愉快地履行一个完全合理的要求。唯一奇怪的是<id>中的数字。无论如何,该操作完成后,文件将从索引中消失。

重新索引文件并将其从磁盘中删除。现在:

  • 也不再是一个名为/path/to/file您的系统上的文件,但
  • 仍然 Solr的集合foo的索引。

让我们再次做同样的<cfindex action="delete">操作。

POST /solr/foo/update?wt=xml&version=2.2 (application/xml; charset=UTF-8) 
<delete><id>/path/to/file</id></delete> 

咦?ID中不应该有数字吗?

事实证明,有人Adobe公司认为这将是使用号码的索引文件的唯一ID,来,唔,节省空间一个欢乐的聪明的想法,我想。

但是由于某些不可解释的原因,这只有当问题文件仍然存在时才会发生。如果它不再存在,ColdFusion将会注意并传递路径。

检查数字表明它适合32位有符号整数值。 (我检查过,集合中的uid字段有很多负值。)

因此,这看起来好像他们使用某种哈希算法返回32位并在int中查找。 CRC32浮出水面,但事实并非如此。另外,java.util.zip.CRC32返回long,所以首先不会有任何负值。

Java中另一种可用的32位散列是... java.lang.Object.hashCode()

宾果。

"/path/to/file".hashCode() // -> 1247603285 

因此,解决办法是永远不会删除其路径的文件,但总是这样:

<cfindex collection="foo" action="delete" key="#path.hashCode()#"> 

对于已不存在这样做正确的事的文件。

更重要的是:对于仍然存在的文件,这也是正确的--ChartFusion会发送哈希代码。

在Adobe解决这个问题之前,这是一个安全和简单的解决方法。

请注意,文件路径区分大小写,并且必须与存储在索引中的路径完全匹配。

快速

<cfsearch collection="foo" name="foo"> 

没有任何criteria将返回所有索引条目,所以检索孤立条目它不是一个大问题的确切路径。


Eric Lippert explains object hash codes and why it is a bad idea to use them for anything "practical" in an application这是一篇.NET文章,但也适用于Java。

归结为:Adobe应该将实际的路径存储在Solr集合中,并保留它们似乎尝试过的Solr的性能优化。


我已经针对Adobe的ColdFusion bug数据库提交了Bug 3589991

+2

感谢您的大力支持。这篇文章可能也是你感兴趣的:http://blogs.msdn。com/b/ericlippert/archive/2005/10/24/482447.aspx –

+0

@Eric“当你这样做会伤害”标签让我发笑。 – Tomalak