1

搜索总高度为 4" 的项目:

我有一个关于使用 cts:search 的问题。考虑以下 xml:

<Item Id="07123114-5c14-4ba9-a6ad-7b688feb8706" ...>
...
  <AttributeValue AttributeName="Mounting Application" AttributeGroup="Search_Application">Tank</AttributeValue>
  <AttributeValue AttributeName="Type" AttributeGroup="Search_Type">Pump Mounting Bracket</AttributeValue>
  <AttributeValue AttributeName="Overall Width" AttributeGroup="Search_Width">15/16 "</AttributeValue>
  <AttributeValue AttributeName="Overall Height" AttributeGroup="Search_Height">1-3/8 "</AttributeValue>
...
</Item>

假设我要查找总高度 = 4" 的项目

我在 cts:search 中使用以下查询:

cts:search(/tx:Item,
  cts:element-query(xs:QName("tx:AttributeValue"), cts:and-query((
    cts:element-attribute-value-query(xs:QName("tx:AttributeValue"), xs:QName("AttributeName"), "Overall Height"),
    cts:word-query("4 """, "exact"))))
)

这给了我所有总高度为 4 英寸、1/4 英寸或 3/4 英寸等的项目。这是因为单词查询进行了“包含”搜索。但我想要一个准确的值匹配。我不能做元素值查询,因为它被包裹在元素查询中(元素值不是子元素)。

我们目前有两种选择涉及更改 xml 结构: 选项 1. 使值成为 AttributeValue 元素的属性;选项 2. 使其成为子元素。

我觉得必须有一种方法可以在不更改 xml 结构的情况下获得我正在寻找的东西。请指教。

4

2 回答 2

2

我会更改 XML:用于AttributeName生成有意义的元素名称。

MarkLogic 假定您的 XML 具有有意义的元素和属性名称。这种 XML 结构看起来是一种非常好的序列化格式。但这是一种糟糕的查询格式,因为元素名称没有意义。它就像一个具有三列的关系数据库表:类型、组、值。所以每个查询都必须加入WHERE TYPE=? AND VALUE=?。查找值的效率要高得多WHERE HEIGHT=?,因此 MarkLogic 会大力推动您朝这个方向发展。

从技术上讲,可以找到解决方法,但是您正在与该工具作斗争。而是尝试将 XML 视为 MarkLogic 将如何构建其索引的模型。当 XML 不易查询时,更改它。

于 2014-06-05T20:47:26.510 回答
1

您的基本问题是标记化将在 / 和空间上中断,因此“2/4”包含您所要求的“4”一词。

您可以通过创建一个带有标记器覆盖(ML7)的字段来到达那里,以便 / 是一个单词标记,并删除空格和 "。然后用给定字段的字段单词查询替换单词查询。

不过,我确实同意 Michael 的观点,您可以通过更仔细地研究数据建模来帮自己一个忙。

于 2014-06-05T21:30:29.320 回答