The full-text index of the database is enabled and the compiling info section of the query states

- apply full-text index for { $string_0 } using language 'English'

The optimized query looks to me as if the index is applied only once via ft:search, but not in both cases.

Best,
Sebastian


Am 23.07.2018 um 11:47 schrieb Christian Grün:
Hi Sebastian,

Did you check in the Info View panel if the index is applied? If no,
you might try something as follows:

  if ($fuzzy) then (
    collection('ZK')/tei:TEI[... using fuzzy])
  ) else (
    collection('ZK')/tei:TEI[...])
  )

Usually, if full-text options are dynamic, I tend to use ft:search [1].

Best,
Christian

[1] http://docs.basex.org/wiki/Full-Text_Module#ft:search




On Mon, Jul 23, 2018 at 11:41 AM Sebastian Zimmer
<sebastian.zimmer@uni-koeln.de> wrote:
Hi Christian,

thanks for the fix, the result is correct now.

But this query now takes about 18 seconds (!) to execute, instead of <1 second like before. Do you think, this could be accelerated?

See attached for the complete console output.

Best,
Sebastian


Am 12.07.2018 um 13:03 schrieb Christian Grün:

Hi Sebastian,

This has been fixed. The background: In one of the optimizations of
the "if" expression, identical branches are merged:

  if(..expensive query..) then 1 else 1
  → Optimized Query: 1

The full-text options were ignored in the equality check.
A new snapshot is online.

Best,
Christian



On Wed, Jul 11, 2018 at 1:22 PM Sebastian Zimmer
<sebastian.zimmer@uni-koeln.de> wrote:

Hi,

I have a query which is optimized in a curious way in BaseX 9.0.2 (yesterday's snapshot).

This is the original query:

xquery version "3.1";
declare namespace tei = "http://www.tei-c.org/ns/1.0";
let $string := "string"
let $fuzzy := false()

return (
  collection('ZK')/tei:TEI[
    if (false())
      then (.[descendant::text() contains text {$string} using fuzzy])
      else (.[descendant::text() contains text {$string}])
  ],
  collection('ZK')/tei:TEI[
    if ($fuzzy)
    then (.[descendant::text() contains text {$string} using fuzzy])
    else (.[descendant::text() contains text {$string}])
  ]
)

And this is the optimized one (newlines inserted by me for better readability):

(
ft:search("ZK", "string" using language 'English')/ancestor::tei:TEI[parent::document-node()],
ft:search("ZK", "string" using fuzzy using language 'English')/ancestor::tei:TEI[parent::document-node()]
)

I'm curious why the second search is using fuzzy, even though the variable $fuzzy is false. I presume that query optimization is independent of the data, so you won't need the data to reproduce. But if you do, I can provide it. A database with enabled full-text index is required obviously.

Best regards,
Sebastian Zimmer

--
Sebastian Zimmer
sebastian.zimmer@uni-koeln.de

Cologne Center for eHumanities
DH Center at the University of Cologne
@CCeHum


--
Sebastian Zimmer
sebastian.zimmer@uni-koeln.de

Cologne Center for eHumanities
DH Center at the University of Cologne
@CCeHum

--
Sebastian Zimmer
sebastian.zimmer@uni-koeln.de
CCeH
              Logo

Cologne Center for eHumanities
DH Center at the University of Cologne
Twitter Logo@CCeHum