equist db索引未在xquery中使用

时间:2014-06-22 18:13:10

标签: xpath xquery exist-db

我已存储在以下类型的eXist数据库节点中:

<Order ID="170473" LnkID="8288374995" OrignDt="2003-07-08" TrdDt="2003-07-09" Acct="104158163" AcctIDSrc="99" DayBkngInst="ingrated" BkngUnit="hobbyhorse" SettlDt="2003-07-28" ClrFeeInd="B" HandlInst="3" MinQty="2088.58" ProcCode="1" Side="2"
LocReqd="N" TxnTm="2003-07-06T08:44:24" QtyTyp="0" Typ="A" PxTyp="4" Px="4258.33" Ccy="USD" SolFlag="N" IOIID="8596226323" ExpireDt="2003-06-19" GTBkngInst="2" Cpcty="A" Rstctions="A" CustCpcty="1660" ForexReq="Y" SettlCcy="inclination" Txt="eats" EncTxt="pendulous" Qty2="4028.86" MaxShow="1636.80" CxllationRights="M" MnyLaunderingStat="N" Designation="tied" >
<Hdr SID="997453497" D2ID="5969180787" SSub="swiftest" D2Sub="flay" PosDup="N" Snt="2003-10-24T12:13:50" OrigSnt="2003-07-19T00:23:46" MsgEncd="lechery" ><Hop ID="9148044310" Ref="33787" Snt="2003-08-24T21:26:11"></Hop>
</Hdr><Pty ID="8059449011" Src="H" ><Sub ID="228" ></Sub></Pty>
<Instrmt Sym="VRTS" Sfx="CD" ID="8962619773" Src="5" CFI="entrances" MatDt="2003-12-09" CpnPmt="2004-06-12" Issued="2004-05-14" RepoTrm="2749" CrdRtg="dad" IssuCtry="purpose" Redeem="2003-10-17" Strk="2028.23" StrkCcy="posterns" Exch="religiously" EncSecDescLen="4238" Pool="separation" IntAcrl="2003-08-17" ></Instrmt>
<OrdQty Qty="3652" Cash="3036.44" Pct="3882.34" RndDir="2" RndMod="1819.70" ></OrdQty>
</Order>

我想要一个ID属性的索引。我的配置文件是:

   <collection xmlns="http://exist-db.org/collection-config/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<index>
    <create qname="@ID" type="xs:string"/>
</index>
<triggers>
    <trigger class="org.exist.extensions.exquery.restxq.impl.RestXqTrigger"/>
</triggers>

我创建的索引仅用于纯xpath查询,例如

//Order[@ID ="170475"]

但不在xquery查询中,例如:

for $ord in//Order/@ID
where $ord = "150985"
return $ord

有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

请尝试将您的查询更改为

for $ord in//Order
where $ord/@ID = "150985"
return $ord

查询引擎尝试重写表达式以使用索引。它将无法分析您之前的配方,但应该在上面的配方上取得成功。

一般建议尽可能使用带有过滤器的XPath语句,因为它们更容易自动重写。

答案 1 :(得分:0)

eXist-db xquery处理器难以使用where子句优化查询,这是documented

虽然您的第二个查询在语法上是正确的,但建议使用XPATH等效项。