Marklogic 中的文件类型方面
FileType facet in Marklogic
背景:我在 Marklogic 生产数据库中加载了大约 50 万个文档。我们有一个使用 CPF 的处理管道,用于文档摄取。我存储文档的 MIME 类型。
我需要基于文件类型的分面。我不能将 MIME 类型用于分面,因为普通用户不了解 MIME 类型,他们更熟悉扩展名(Excel、Word、Jpeg 等...)。我的问题是多个 MIME - 类型可以映射到单一文件类型,例如:- Excel 有 10 个或更多 MIME 类型,我想将它们全部映射到 Excel.
以下是我想到的关于如何实施的 2 种可能性。我想知道是否还有其他好的方法可以实现这一目标..
- 我有一个 "transform" 方法,它基本上采用基于 MIME 类型生成的分面,并将与文件类型对应的所有各种 MIME 类型分组。我有一个配置文件 (XML),其中包含 MIME 类型到文件类型的所有映射。这样,当新的 MIME 类型添加到文件类型时,我所能做的就是编辑此配置文件..
这种方法的缺点是,在进行搜索查询时,我需要扩展搜索字符串通过具有自定义约束,因此文件类型被转换为每个单独的 MIME 类型。
- 第二个选项,在摄取过程中,我添加了文件类型,这将解决我的分面和搜索问题。
此选项的缺点是我需要将 FileType 添加到所有现有的 500k 文档,在我这样做之前我需要禁用 CPF 或添加某种逻辑,当 CPF 在这些 500k 文档上被触发时,我告诉不要采取任何行动。由于它是生产数据库,我无法为新文档摄取禁用 CPF。
我喜欢第二个选项,但是有没有比更改我的 CPF 代码或禁用触发器数据库一段时间更好的方法?
还有哪一个(1 或 2)是更好的方法?我想知道是否有比这些更好的选择..
你准确地列出了两个选项。在查询时执行,或在索引时执行。你准确地列出了利弊。我的建议:如果您在查询时这样做足够快,并且可以接受更高级代码的维护,那么就这样做。否则将知识写入文档。
只有 50 万个文档,我认为查询时间已经足够快了。为此,您可能会利用此分组约束:https://github.com/grtjn/ml-constraints#grouping-constraint
您可以使用 MLPM 安装和部署它。之后,您可以在搜索选项中使用类似这样的内容:
<constraint name="Attachment-Type">
<custom>
<parse apply="parse-structured" ns="http://marklogic.com/grouping-constraint" at="/ext/mlpm_modules/ml-constraints/grouping-constraint.xqy"/>
<start-facet apply="start" ns="http://marklogic.com/grouping-constraint" at="/ext/mlpm_modules/ml-constraints/grouping-constraint.xqy"/>
<finish-facet apply="finish" ns="http://marklogic.com/grouping-constraint" at="/ext/mlpm_modules/ml-constraints/grouping-constraint.xqy"/>
<facet-option>limit=5</facet-option>
<facet-option>frequency-order</facet-option>
<facet-option>descending</facet-option>
<facet-option>any</facet-option>
</custom>
<annotation>
<range type="xs:string" facet="true" collation="http://marklogic.com/collation//S1">
<element ns="http://my-namespace.com" name="mime-type"/>
</range>
<config>
<group label="Audio">
<match pattern="audio/*"/>
</group>
<group label="Video">
<match pattern="video/*"/>
<match pattern="application/vnd.rn-realmedia"/>
</group>
<group label="Documents">
<match pattern="application/msword"/>
<match pattern="application/vnd.wordperfect"/>
<match pattern="application/x-wordstar"/>
<match pattern="application/pdf"/>
<match pattern="application/postscript"/>
<match pattern="application/rtf"/>
<match pattern="application/x-xywrite"/>
<match pattern="application/x-mass11"/>
</group>
<group label="Spreadsheets">
<match pattern="application/vnd.ms-excel"/>
</group>
<group label="Presentations">
<match pattern="application/vnd.ms-powerpoint"/>
</group>
<show-remainder label="Other"/>
</config>
</annotation>
</constraint>
但是,性能会随着您提供的组和模式的数量以及文档总数的增加而降低。一旦文档总数超过数百万,这可能需要相对较长的搜索解决时间。在那种情况下,你最好提前计算组..
HTH!
如果您担心性能并且更喜欢预先计算,请考虑利用 CPF,而不是对抗它。确保您的 CPF 管道可以检测到无需完成任何工作的情况(以防止添加两次等),并让它填补缺失的部分。一旦您确定 CPF 是以这种方式配置的,并且您已经添加了添加文件类型的逻辑,只需通过使用 xdmp:document-insert($uri, doc($uri), xdmp:document-get-permissions($uri), ....)
..
行的内容重新插入文件来触摸文件
HTH!
背景:我在 Marklogic 生产数据库中加载了大约 50 万个文档。我们有一个使用 CPF 的处理管道,用于文档摄取。我存储文档的 MIME 类型。
我需要基于文件类型的分面。我不能将 MIME 类型用于分面,因为普通用户不了解 MIME 类型,他们更熟悉扩展名(Excel、Word、Jpeg 等...)。我的问题是多个 MIME - 类型可以映射到单一文件类型,例如:- Excel 有 10 个或更多 MIME 类型,我想将它们全部映射到 Excel.
以下是我想到的关于如何实施的 2 种可能性。我想知道是否还有其他好的方法可以实现这一目标..
- 我有一个 "transform" 方法,它基本上采用基于 MIME 类型生成的分面,并将与文件类型对应的所有各种 MIME 类型分组。我有一个配置文件 (XML),其中包含 MIME 类型到文件类型的所有映射。这样,当新的 MIME 类型添加到文件类型时,我所能做的就是编辑此配置文件..
这种方法的缺点是,在进行搜索查询时,我需要扩展搜索字符串通过具有自定义约束,因此文件类型被转换为每个单独的 MIME 类型。 - 第二个选项,在摄取过程中,我添加了文件类型,这将解决我的分面和搜索问题。
此选项的缺点是我需要将 FileType 添加到所有现有的 500k 文档,在我这样做之前我需要禁用 CPF 或添加某种逻辑,当 CPF 在这些 500k 文档上被触发时,我告诉不要采取任何行动。由于它是生产数据库,我无法为新文档摄取禁用 CPF。
我喜欢第二个选项,但是有没有比更改我的 CPF 代码或禁用触发器数据库一段时间更好的方法?
还有哪一个(1 或 2)是更好的方法?我想知道是否有比这些更好的选择..
你准确地列出了两个选项。在查询时执行,或在索引时执行。你准确地列出了利弊。我的建议:如果您在查询时这样做足够快,并且可以接受更高级代码的维护,那么就这样做。否则将知识写入文档。
只有 50 万个文档,我认为查询时间已经足够快了。为此,您可能会利用此分组约束:https://github.com/grtjn/ml-constraints#grouping-constraint
您可以使用 MLPM 安装和部署它。之后,您可以在搜索选项中使用类似这样的内容:
<constraint name="Attachment-Type">
<custom>
<parse apply="parse-structured" ns="http://marklogic.com/grouping-constraint" at="/ext/mlpm_modules/ml-constraints/grouping-constraint.xqy"/>
<start-facet apply="start" ns="http://marklogic.com/grouping-constraint" at="/ext/mlpm_modules/ml-constraints/grouping-constraint.xqy"/>
<finish-facet apply="finish" ns="http://marklogic.com/grouping-constraint" at="/ext/mlpm_modules/ml-constraints/grouping-constraint.xqy"/>
<facet-option>limit=5</facet-option>
<facet-option>frequency-order</facet-option>
<facet-option>descending</facet-option>
<facet-option>any</facet-option>
</custom>
<annotation>
<range type="xs:string" facet="true" collation="http://marklogic.com/collation//S1">
<element ns="http://my-namespace.com" name="mime-type"/>
</range>
<config>
<group label="Audio">
<match pattern="audio/*"/>
</group>
<group label="Video">
<match pattern="video/*"/>
<match pattern="application/vnd.rn-realmedia"/>
</group>
<group label="Documents">
<match pattern="application/msword"/>
<match pattern="application/vnd.wordperfect"/>
<match pattern="application/x-wordstar"/>
<match pattern="application/pdf"/>
<match pattern="application/postscript"/>
<match pattern="application/rtf"/>
<match pattern="application/x-xywrite"/>
<match pattern="application/x-mass11"/>
</group>
<group label="Spreadsheets">
<match pattern="application/vnd.ms-excel"/>
</group>
<group label="Presentations">
<match pattern="application/vnd.ms-powerpoint"/>
</group>
<show-remainder label="Other"/>
</config>
</annotation>
</constraint>
但是,性能会随着您提供的组和模式的数量以及文档总数的增加而降低。一旦文档总数超过数百万,这可能需要相对较长的搜索解决时间。在那种情况下,你最好提前计算组..
HTH!
如果您担心性能并且更喜欢预先计算,请考虑利用 CPF,而不是对抗它。确保您的 CPF 管道可以检测到无需完成任何工作的情况(以防止添加两次等),并让它填补缺失的部分。一旦您确定 CPF 是以这种方式配置的,并且您已经添加了添加文件类型的逻辑,只需通过使用 xdmp:document-insert($uri, doc($uri), xdmp:document-get-permissions($uri), ....)
..
HTH!