无法删除 Solr 键

2024-02-06

从 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>

但是,该密钥并未被删除。唯一有效的方法是清除整个目录并重新索引所有文档。

有什么见解吗?


经过大量调试后我发现了。

这种行为的原因是 Adob​​e 在实现 ColdFusion 和 Solr 之间的接口时采取的一个非常……呃……不幸的呃……“设计决策”。

因此,您有一个 Solr 索引文件集合,并且希望有选择地清除磁盘上不再存在的文件。我很确定这就是你所经历的情况。

我们假设:

  • 有一个文件叫/path/to/file在您的系统上和
  • 它在 Solr 集合中建立索引foo.

当您发出<cfindex collection="foo" action="delete" key="/path/to/file">,ColdFusion 向 Solr 发送以下 HTTP 请求:

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

这是一个完全合理的请求,Solr 会很乐意满足。唯一奇怪的是里面的数字<id>。无论如何,此操作后该文件将从索引中消失。

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

  • 不再有一个名为/path/to/file在你的系统上,但是
  • it is still在 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>

啊?身份证上不是应该有号码吗?

事实证明,Adobe 的某个人认为使用数字作为索引文件的唯一 ID 是一个非常聪明的主意,呃,节省空间, 我假设。

However由于某些无法解释的原因,只有当有问题的文件仍然存在时才会发生这种情况。如果它不再存在,ColdFusion 将注意到并传递该路径。

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

所以这看起来好像他们使用某种返回 32 位的哈希算法并将其放入 int 中。我首先想到的是 CRC32,但事实并非如此。还,java.util.zip.CRC32返回一个long,所以首先就不会有任何负值。

Java 中另一个现成的 32 位哈希是......java.lang.Object.hashCode() http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode%28%29.

Bingo.

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

所以解决方案是永远不要通过文件的路径删除文件,而总是像这样:

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

对于不再存在的文件,这样做是正确的。

更重要的是:对于仍然存在的文件,这也是正确的——ColdFusion 无论如何都会发送哈希码。

在 Adob​​e 解决此问题之前,这是一个安全且简单的解决方法。

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

A quick

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

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


Eric Lippert 解释了对象哈希码以及为什么在应用程序中将它们用于任何“实用”的东西是一个坏主意 http://blogs.msdn.com/b/ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx这是一篇 .NET 文章,但也适用于 Java。

归结为:Adobe 应该存储实际的path在Solr集合中,留下了他们似乎已经尝试过的Solr的性能优化。


我已备案针对 Adob​​e 的 ColdFusion 错误数据库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法删除 Solr 键 的相关文章

  • 空白/冷融合

    停止 ColdFusion 输出空白的正确方法是什么 我知道有cfcontent and cfsetting enableCFoutputOnly 这样做的正确方法是什么 此外
  • 严重: getRealPathFromConn 错误

    目前我正在调试我们的应用程序中一个看似随机的错误 我将尽力提供尽可能多的细节 基本上一段时间后 我们服务器上某个应用程序的应用程序池就会停止 我必须启动它 或者有时重新启动 Coldfusion 或更糟糕的是机器才能再次运行 服务器日志表明
  • cursorMark是无状态的以及它如何解决深度分页

    作为指定here https cwiki apache org confluence display solr Pagination of Results光标标记是无状态的 但我不明白它是如何解决无状态的深度分页问题的 solr 是否按唯一
  • 如何使用 solrnet 在 solr 中使字段搜索不区分大小写

    在 solr 模式中我有如下字段
  • 将 SoapUI 请求转换为 CFHTTP

    我正在 SoapUI 中查看一个将标头信息发送到特定端点的请求 但我很难在 ColdFusion 中重新创建它 下面是 RAW 请求在 SoapUI 中的样子 gt gt GET https test 01 mywebsite com da
  • 如何将 Solarium 配置为使用 POST 而不是 GET 请求

    我面临的问题是我们发送到 solr jetty 的 uri 变得很长 超过 9k 字节 超出了 jetty 的默认限制 解决方案是从 GET 请求切换到 POST 请求 因为我们不想增加 jetty 可以接受的 requestHeaderS
  • 作为 ColdFusion 开发人员之后,您应该如何继续学习 ASP.NET?

    作为一个花了大约 10 年时间使用 Adob e ColdFusion 进行 Web 应用程序编程的人 我决定将 ASP NET 添加到我的弓中 对于长期使用 CF 和底层 Java 的人来说 ASP NET 对我来说似乎有点陌生 我应该如
  • 将 Topaz 签名字符串(十六进制)转换为图像

    我正在尝试将黄玉签名板集成到我的 ColdFusion 应用程序中 我想从 pad 捕获签名 将其转换为 ColdFusion 可以在浏览器中显示的格式并保存到磁盘 使用他们的文档 我能够以十六进制格式检索捕获的签名 我认为 我正在关注他们
  • 调用名称中带有变量的变量 - Coldfusion?

    尝试使用方括号表示法来引用动态变量 如果您想了解应用程序 我正在循环访问由查询创建的一组产品 为每个产品创建与其唯一 SKU 相关的字段 我已将其范围缩小到这段代码 当我尝试运行它时 它会抛出 无效表达式 错误
  • 使用 Maven 进行 Coldfusion 项目

    我必须处理相当丑陋且大量的 ColdFusion 代码 到目前为止 这些代码都是通过在生产服务器上直接修改来维护的 不要问 我设法清除它的重复和备份并将其放入 Subversion 现在我需要选择一个 make 系统以便能够将其放入持续构建
  • 使用 Coldfusion 11 的 CFdirectory,文件名中存在非 ASCII 字符问题

    我有一个类似的问题 ColdFusion CFDirectory 和法语 https stackoverflow com questions 1715632 coldfusion cfdirectory and the french从而没有
  • 将第一个数据证书导入 ColdFusion

    我尝试使用 keytool 将证书从 First Data 导入到我的 ColdFusion 9 设置中 如下所示 keytool importcert keystore MYCF9Dir runtime jre lib security
  • Solr 错误 - 流主体被禁用

    我正在从浏览器 URL 中删除文档 我正在使用 Solr 7 4 0 我正在使用此查询来删除文档 http localhost 8983 solr test update stream body
  • 加速 SOLR 搜索

    使用 SOLR Apache Lucene 3 6 时 SOLR 搜索响应非常慢 我正在尝试的一些性能增强技术是 SOLR 分页 mergeFactor 当前在 solrConfig xml 中设置为 10 SOLR 方面查询 solrco
  • 使用jquery和coldfusion cffile上传多个文件

    不是一个真正的问题 只是想将其发布在某个地方 因为我在其他地方找不到它 现在我已经拼凑了一个工作演示 我想我会分享 这在 Coldfusion 和 Railo CFML 服务器上同样有 效 问题是 对于 CFML 开发人员来说 CFFILE
  • 在 Ecom 应用程序中实施 SOLR 的最佳实践是什么?

    我是 SOLR 的新用户 我正在开发一个具有 SQL 数据库的电子商务 Web 应用程序 我想在应用程序中为我的 类别页面 实现 SOLR 我们将在其中显示该类别的产品以及特定信息 例如可用库存 价格和更多详细信息 此外 我们希望根据库存情
  • ColdFusion/PHP 兼容性

    嘿 我有一个关于 ColdFusion 和 PHP 兼容性的问题 我们建立了一个基于 ColdFusion 的社区网站 是否完全可以使用 PHP 将博客和其他社区功能添加到我们的网站 我的意思是把 PHP 和 ColdFusion 结合在一
  • ColdFusion Access Manager 尝试清除可信缓存时出错

  • 如何下载到 Excel?

    我想为我的 Coldfusion 网站不同部分上的几组不同数据提供 下载到 Excel 功能 我正在使用 Coldfusion 并且希望使用免费的自定义标签 库来帮助我完成此任务 而不是自己从头开始编码 我被指出cflib org http
  • 由于 3rd 方库的位置,启动 Solr cloud 时出错

    我尝试迁移到 Solr 3 1 我的项目使用 Dataimport handler 当我启动 solr 时 它问我找不到 SolrCoreAwar 我将以下文件复制到 lib 目录 apache solr dataimporthandler

随机推荐