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