【问题标题】:Value-Query within an Element-Query元素查询中的值查询
【发布时间】:2014-07-27 00:14:42
【问题描述】:

搜索总高度为 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 结构的情况下获得我正在寻找的内容。请指教。

【问题讨论】:

    标签: xml marklogic cts-search


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您的基本问题是标记化会在 / 和空间上中断,等等 “2/4”包含您要的单词“4”。

      您可以通过创建一个带有标记器覆盖 (ML7) 的字段来实现该目标,以便 / 是一个单词标记,并删除空格和 "。然后将单词查询替换为给定字段的字段单词查询.

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

      【讨论】:

        猜你喜欢
        • 2021-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多