Hi Philip (cc:mailing list),
does the index still work if you reopen the GUI and run your query? Next, which full-text options have you set?
Christian ___________________________
On Tue, Jan 25, 2011 at 10:15 AM, Philip Oliver phil3@olivercomputing.com wrote:
Christian - I've gotten around to trying BaseX 6.5.1 (generated from SVN) with some code changes, and I'm trying to figure out some strange behavior: a query executed in the GUI is using an index, whereas the same query executed in my program via client/server execution, does not (so is very slow.)
(One thing I've noticed is that the fulltext indices are not used if the "English" language option is chosen. I figure this is the same principle as the indices not being used if the "contains text" query options don't match the database fulltext index properties - but I don't know what fulltext options to use in the query, then. I don't know if this is related to the problem I'm seeing.)
This is the query:
let $paras:=db:open('CIVWAR')//node()[text() contains text "ohio"] let $books:=$paras/ancestor::book return (for $book in $books where exists($book/@id) order by number($book/@id) return <book id="{$book/@id}" series="{$book/@series}" title="{$book/title}"/>)
This is the result of session.info() with "set queryinfo on", after the query is executed in my program:
Query: let $paras:=db:open('CIVWAR')//node()[text() contains text "zanesville"] let $books:=$paras/ancestor::book return (for $book in $books where exists($book/@id) order by number($book/@id) return <book id="{$book/@id}" series="{$book/@series}" title="{$book/title}"/>)
Compiling:
- pre-evaluating open("CIVWAR")
- optimizing descendant-or-self step(s)
- binding static variable $paras
- merging axis paths
- binding static variable $books
- rewriting where clause to predicate(s)
- rewriting exists(@*:id)
- removing variable $paras
- removing variable $books
- simplifying flwor expression
Result: for $book in (document-node { "DYERS_P1.xml" }, ...)/descendant::node()[text() contains text "zanesville"]/ancestor::*:book[@*:id] order by number($book/@id) return element { "book" } { attribute { "id" } { $book/@id }, attribute { "series" } { $book/@series }, attribute { "title" } { $book/title } }
Parsing: 1.83 ms Compiling: 8.73 ms Evaluating: 36902.45 ms Printing: 0.71 ms Total Time: 36913.74 ms Results: 15 Items Updated: 0 Items Printed: 964 Bytes Memory: 11970 KB
Query executed in 36914.08 ms.
And this is the query info from the GUI:
Query: let $paras:=db:open('CIVWAR')//node()[text() contains text "ohio"] let $books:=$paras/ancestor::book return (for $book in $books where exists($book/@id) order by number($book/@id) return <book id="{$book/@id}" series="{$book/@series}" title="{$book/title}"/>) Compiling:
- pre-evaluating open("CIVWAR")
- optimizing descendant-or-self step(s)
- applying full-text index
- binding static variable $paras
- merging axis paths
- binding static variable $books
- rewriting where clause to predicate(s)
- rewriting exists(@id)
- removing variable $paras
- removing variable $books
- simplifying flwor expression
Result: for $book in FTIndexAccess("CIVWAR", "ohio")/..[ancestor::document-node()]/ancestor::book[@id] order by number($book/@id) return element { "book" } { attribute { "id" } { $book/@id }, attribute { "series" } { $book/@series }, attribute { "title" } { $book/title } } Query plan:
<GFLWOR> <For var="$book"> <AxisPath> <FTIndexAccess data="CIVWAR"> <FTWords>ohio</FTWords> </FTIndexAccess> <IterStep axis="parent" test="node()"> <AxisPath> <IterStep axis="ancestor" test="document-node()"/> </AxisPath> </IterStep> <IterStep axis="ancestor" test="book"> <AxisPath> <IterStep axis="attribute" test="id"/> </AxisPath> </IterStep> </AxisPath> </For> <Order> <OrderByExpr dir="ascending" empty="least"> <FNAcc name="number(item?)"> <AxisPath> <VarRef name="$book"/> <IterStep axis="attribute" test="id"/> </AxisPath> </FNAcc> </OrderByExpr> </Order> <Return> <CElem> <Item value="book" type="xs:QName"/> <CAttr> <Item value="id" type="xs:QName"/> <AxisPath> <VarRef name="$book"/> <IterStep axis="attribute" test="id"/> </AxisPath> </CAttr> <CAttr> <Item value="series" type="xs:QName"/> <AxisPath> <VarRef name="$book"/> <IterStep axis="attribute" test="series"/> </AxisPath> </CAttr> <CAttr> <Item value="title" type="xs:QName"/> <AxisPath> <VarRef name="$book"/> <IterStep axis="child" test="title"/> </AxisPath> </CAttr> </CElem> </Return> </GFLWOR> Timing: - Parsing: 0.99 ms - Compiling: 0.59 ms - Evaluating: 864.56 ms - Printing: 1.09 ms - Total Time: 867.25 ms