Hi Christian, Thank you very much for your detailed answer, your comments are very useful for me.
*- Could you check once again if this is fixed with the new snapshot?*: I confirm it. With your new snapshot, the problem is fixed. [1]. Thank you very much for your comments about duplicate paths, you're right: it's more performant if we write it in the other way. I've changed it. [2] About "*ft:search*" ( and full index in general ) I've noticed a "strange" behaviour when you perform a search using the full text. But, I'll write about it in a separated thread to keep everything consistent. Best regards, Sebastian [1] https://imgur.com/XnRdxyD [2] https://imgur.com/U1wo4y3 On Thu, May 14, 2020 at 11:25 AM Christian Grün <christian.gr...@gmail.com> wrote: > Hi Sebastian, > > I couldn’t get this reproduced out of the box. A technical guess: > Global full-text options may have been overwritten by > database-specific properties in the second switch branch at compile, > which yielded wrong/restricted results in the first branch at runtime. > > Could you check once again if this is fixed with the new snapshot [1]? > > Some more comments on your query: If you formulate duplicate paths > only once, you might get even better performance: > > OLD: > for $a in A > where $a/B/C/D/E contains text { $text } > return $a/B/C/D/E > > NEW: > for $e in A/B/C/D/E > where $e contains text { $text } > return $e > > In a future version of BaseX, such patterns will automatically be > rewritten. Currently, basic patterns are already simplified [2]: > > for $e in A/B where $e/C/D return $e/C/D/E > → A/B[C/D]/C/D/E > → A/B/C/D/E > > The enforceindex is still in a somewhat experimental stage (hence, > thanks for your feedback), and its behavior is sometimes surprising if > there are various competing candidates for index rewrites in your > expression. If you want to have more control on how your queries are > executed, you can directly call ft:search: > > for $db in ('US00','US01','US02') > return ft:search($db, $text)[parent::mark-identification] > > If all 'mark-identification' elements occur on the same level in your > document, you can omit the remaining parent steps (this will further > speed up query evaluation). A look at the optimized query in the > InfoView panel will give you some more hints. > > Cheers, > Christian > > [1] http://files.basex.org/releases/latest/ > [2] https://github.com/BaseXdb/basex/issues/1864 > > > > On Wed, May 13, 2020 at 11:23 PM Sebastian Guerrero <chap...@gmail.com> > wrote: > > > > Hi everyone! it's me again. > > > > Here is my doubt: > > > > If I execute this query: > > > > (# db:enforceindex #) { > > for $db in ('US00','US01','US02') > > for $tmUS in > db:open($db)/trademark-applications-daily/application-information/file-segments/action-keys/case-file > > where > $tmUS/case-file-header/mark-identification/text() contains text { 'apple' } > > return > $tmUS/case-file-header/mark-identification/text() > > } > > > > I get 4k results in 139ms from three databases of 90GB and 13M of > records. It works like a charm. [01] > > > > But, if I include that query into a for and then into a switch ( I tried > with if-then-else too ), the same query returns only 11 results in 107ms > [02]: > > > > declare namespace gb="http://www.ipo.gov.uk/schemas/tm"; > > let $text := "apple" > > let $registries := ('US') > > > > for $registry in $registries > > return > > switch ($registry) > > > > case "US" > > return > > (# db:enforceindex #) { > > for $db in ('US00','US01','US02') > > for $tmUS in > db:open($db)/trademark-applications-daily/application-information/file-segments/action-keys/case-file > > where > $tmUS/case-file-header/mark-identification/text() contains text { $text } > > return > $tmUS/case-file-header/mark-identification/text() > > } > > > > case "GB" > > return > > (# db:enforceindex #) { > > for $tmGB in > db:open('GB')/gb:MarkLicenceeExportList/gb:TradeMark > > where > $tmGB/gb:WordMarkSpecification/gb:MarkVerbalElementText/text() contains > text { $text } > > return > $tmGB/gb:WordMarkSpecification/gb:MarkVerbalElementText/text() > > } > > > > default return "Unknown registry code" > > > > > > > > I noticed that removing the case option "GB" ( even if it's not > evaluated ), it works fine and returns the 4k records [03]: > > > > declare namespace gb="http://www.ipo.gov.uk/schemas/tm"; > > let $text := "apple" > > let $registries := ('US') > > > > for $registry in $registries > > return > > switch ($registry) > > > > case "US" > > return > > (# db:enforceindex #) { > > for $db in ('US00','US01','US02') > > for $tmUS in > db:open($db)/trademark-applications-daily/application-information/file-segments/action-keys/case-file > > where > $tmUS/case-file-header/mark-identification/text() contains text { $text } > > return > $tmUS/case-file-header/mark-identification/text() > > } > > > > default return "Unknown registry code" > > > > > > > > What I'm missing here? is this the right behaviour? > > > > Best regards, > > Sebastian > > > > [01] https://imgur.com/o4RUUyO > > [02] https://imgur.com/533c0rI > > [03] https://imgur.com/mCb3qEe >