Hi, Christian!
Thank you again for your help!!
Yes, I have the full-text index enabled.
I have tried something like this:
let $dbs := for $i in db:list()[starts-with(.,'000999~')] return $i
for $db in $dbs
for $doc in db:open($db)/.//*[(# db:enforceindex #) { text() contains text { 'TEN-9258' } any }]
return $doc
No effect.
Then I have tried:
let $dbs := for $i in db:list()[starts-with(.,'000999~')] return $i
for $db in $dbs
let $ft := ft:search($db, "TEN-9258")/parent::*
for $node in $ft
return root($node)
And it works like a charm =)
But I don't understand why the first way doesn't work...
20.07.2018, 11:31, "Christian Grün" <christian.gr...@gmail.com>:
Hi Vladimir,
But if I search in "db:list...db:open..." - it takes about 12-15 seconds.
If the name of the database is not statically known, the query cannot
be rewritten for index access (because one the targeted database may
not have the required index). I guess you have the full-text index
enabled?
However, since BaseX 9, you can take advantage of the ENFORCEINDEX
option: All queries will then optimized for index operations, based on
your knowledge that there an index will be available. See [1] for
further details.
By the way, you can have a look at the compilation section of the Info
View in the GUI to see if indexes will be applied in your query.
Best,
Christian
[1] http://docs.basex.org/wiki/Indexes#Enforce_Rewritings
Example takes ~12-15s:
let $db := for $i in db:list()[starts-with(.,'000999~')] return try {db:open($i)} catch * {}
for $doc in $db/.//*[text() contains text { 'TEN-9258' } any]
return $doc
Example takes ~180ms (returns 2 rows):
let $db := for $i in db:list()[starts-with(.,'000999~201807')] return db:open($i)
for $doc in $db/.//*[text() contains text { 'TEN-9258' } any]
return $doc
Example takes ~10ms (returns 2 rows):
for $doc in db:open('000999~201807')/.//*[text() contains text { 'TEN-9258' } any]
return $doc
Why do the last 2 examples take different times?
How can I improve this?
Example takes ~2s (returns 0 rows):
let $db := for $i in db:list()[starts-with(.,'000999~201806')] return db:open($i)
for $doc in $db/.//*[text() contains text { 'TEN-9258' } any]
return $doc
Example takes ~12ms (returns 0 rows):
for $doc in db:open('000999~201806')/.//*[text() contains text { 'TEN-9258' } any]
return $doc
25.06.2018, 13:07, "Alexander Shpack" <shadow...@gmail.com>:
Hi, Vladimir,
If you will do db names with the particular prefix, for example "db_", you may use the next code
let $docs := for $i in db:list()[starts-with(.,"db_")] return db:open($i)return $docs/*
On Mon, Jun 25, 2018 at 12:32 PM Ветошкин Владимир <en-tra...@yandex.ru> wrote:
Hi, Alexander,
Some questions:
After that, how can I perform a search in all of these databases?
Can I search for substring without fulltext using only text index?
25.06.2018, 11:56, "Alexander Shpack" <shadow...@gmail.com>:
Hey Vladimir,
You can use sharding approach for you data import and split all DBs even every month.
On Mon, Jun 25, 2018 at 11:50 AM Ветошкин Владимир <en-tra...@yandex.ru> wrote:
Hi, Alexander!
Thank you!
In my previous letter I have described the proccess in short.
I'll think about separated DB. But I'm afraid that this base will also be very big in future.
Although I can try to split data to several databases - one per year.. Hmm..
25.06.2018, 11:25, "Alexander Shpack" <shadow...@gmail.com>:
Hey, Vladimir!
Just put this specific files to the separated DB and than index it.
You can process it automatically, BaseX allows to create and index DB right from XQuery.
I hope it helps you. Anyhow, you can provide more details about your task and we can figure out the best solution for you.
On Mon, Jun 25, 2018 at 10:42 AM Ветошкин Владимир <en-tra...@yandex.ru> wrote:
Hi, Fabrice!
Thank you.
All databases constantly change.That is why there is no way to single out "a big readonly collection" :(
Maybe it is possible to use some other incremental indexes?
I have to index specific xml-files, not all files in database.
21.06.2018, 17:16, "Fabrice ETANCHAUD" <fetanch...@pch.cerfrance.fr>:
Hi Vladimir,
I don’t think there is something like a incremental full text index for the moment [1].
As index is per collection, the recommanded way shall be to split your data in two collections :
- A big readonly collection of all the past updates, indexed once
- A small/medium sized collection whom full text index can be recreated in an acceptable time after each update.
At the end of a predefined time period, you have to add the live collection to the readonly one, reindex it, and truncate the live one.
Best regards from France,
Fabrice Etanchaud
[1] http://docs.basex.org/wiki/Indexes#Updates
De : BaseX-Talk [mailto:basex-talk-boun...@mailman.uni-konstanz.de] De la part de ???????? ????????
Envoyé : jeudi 21 juin 2018 16:02
À : BaseX
Objet : [basex-talk] Full-Text
Hi, everyone!
Is there any way to index only imported xml-files?
Now, when I import xml-files the full-text index is deleted.
After importing I recreate whole full-text index and it takes too much time :(
--
С уважением,
Ветошкин Владимир Владимирович
--
С уважением,
Ветошкин Владимир Владимирович
--
s0rr0w
--
С уважением,
Ветошкин Владимир Владимирович
--
s0rr0w
--
С уважением,
Ветошкин Владимир Владимирович
--
s0rr0w
--
С уважением,
Ветошкин Владимир Владимирович
--
С уважением,
Ветошкин Владимир Владимирович