元素查询中的值查询

时间:2014-06-05 20:32:19

标签: xml marklogic cts-search

搜索总体高度为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&#34;

的物品

我在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&#34;,或1/4&#34;或3/4&#34;等等。这是因为单词查询会包含&#39;包含&#39;搜索。但我想要一个精确的价值匹配。 我不能做元素值查询,因为它包含在元素查询中(元素值不是子元素)。

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

我觉得必须有办法在不改变xml结构的情况下获得我想要的东西。请指教。

2 个答案:

答案 0 :(得分:2)

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

MarkLogic假定您的XML具有有意义的元素和属性名称。这种XML结构看起来像一个非常好的序列化格式。但它的查询格式很差,因为元素名称没有意义。它就像一个有三列的关系数据库表:type,group,value。因此,每个查询都必须加入WHERE TYPE=? AND VALUE=?。查找值WHERE HEIGHT=?会更有效率,因此MarkLogic会向您推动这个方向。

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

答案 1 :(得分:1)

你的根本问题是,标记化会破坏/和空间等等 &#34; 2/4&#34;包含单词&#34; 4&#34;这就是你要求的。

你可以通过创建一个带有tokenizer覆盖的字段(ML7)来实现这一目标,这样/是一个单词标记,空格和&#34;被删除。然后用单词查询替换给定字段的字词查询。

但我同意迈克尔的观点,即你会更加努力地看待数据建模。