【发布时间】:2012-11-08 14:15:19
【问题描述】:
我们的数据库包含具有大量元数据的文档,包括这些文档之间的关系。虚构示例:
<document>
<metadata>
<document-number>ID 12345 : 2012</document-number>
<publication-year>2012</publication-year>
<cross-reference>ID 67890 : 1995</cross-reference>
<cross-reference>ID 67890 : 1998</cross-reference>
<cross-reference>ID 67891 : 2000</cross-reference>
<cross-reference>ID 12345 : 2004</cross-reference>
<supersedes>ID 12345 : 2004</supersedes>
...
</metadata>
</document>
<document>
<metadata>
<document-number>ID 12345 : 2004</document-number>
<publication-year>2004</publication-year>
<cross-reference>ID 67890 : 1995</cross-reference>
<cross-reference>ID 67890 : 1998</cross-reference>
<cross-reference>ID 67891 : 2000</cross-reference>
<cross-reference>ID 12345 : 2012</cross-reference>
<cross-reference>ID 12345 : 2001</cross-reference>
<superseded-by>ID 12345 : 2012</superseded-by>
<supersedes>ID 12345 : 2001</supersedes>
...
</metadata>
</document>
我们正在使用基于 Marklogic 搜索 API 的单框搜索来允许用户搜索这些文档。搜索语法描述了各种约束和搜索选项,但大多数情况下(默认情况下)它们通过定义为包含大多数元数据元素的字段进行搜索,并(在某种程度上)仔细选择权重(这里真正重要的是document-number权重最高。)
问题是业务需要非常具体的结果排序,我想不出使用搜索 api 实现它的方法。
导致问题的要求是,如果用户搜索匹配文档编号(例如他们搜索“12345”),则具有该文档编号的所有文档都应位于结果集的顶部,按日期降序排列.将它们放在结果集的顶部很容易; document-number 的权重最高,因此按分数排序可以正常工作。问题是按日期进行二次排序不起作用,因为即使所有 document-number 匹配的分数都高于其他文档,但它们没有 same 分数,因此它们最终被排序搜索词在其余元数据中出现的频率;这根本没有真正的意义。
我认为我们真正需要的是一种仅通过与搜索词匹配的最高权重元素来获得搜索 api 得分结果的方法,而无需参考文档中的任何其他匹配项。我已经查看了评分算法,但看不到这样做的算法;我错过了什么或者这不可能吗?显然,我们订购的不一定是score;如果有其他方法可以获取文档中单个最佳匹配的分数并将其用于排序,那很好。
还有其他我没想到的解决方案吗?
我想过进行两次搜索(一次在 document-number 上,一次在整个元数据树上)然后合并结果,但这似乎会给分页和性能带来很多麻烦。哪一种首先违背了使用搜索 api 的目的。
我应该补充一点,在结果集中包含其他匹配项是正确的,因此我们不能只搜索document-number。
【问题讨论】: