Hi Chris,
as you already noted, the full-text index will
only
be
utilized with the
options that you choose when creating an index. If you want to do more fine-grained searches, it’s
usually
recommendable to choose
the most general options for creating the index (case insensitive, diacritics insensitive, etc). and
then
refine the results in a second step. This can e.g. look as follows
:
declare function local:search($db, $terms) {
for $result in db:open($db)//*[text() contains text { $terms }]
return $result[text() contains text { $terms } using case sensitive]
};
local:search('factbook', ('German', 'English'))
Hope this helps,
Christian
On Thu, Aug 14, 2014 at 10:54 PM, Chris Yocum <cyocum@gmail.com> wrote:
> Hi Christian,
>
> Apologies for bringing this back up but if I use "using diacritics
> insensitive" in the full text search, it seems to turn full text
> searching off. I have diacritics true on the database. I am just
> suprised to see diacritics causing the full text searching to be
> turned off.
>
> All the best,
> Chris
>
> On Wed, Aug 13, 2014 at 01:18:26PM +0200, Christian Grün wrote:
>> Hi Chris,
>>
>> there are various caches involved when evaluating queries, but I can't
>> see for the given query where a cache may be utilized. However, your
>> query may be evaluated faster if you simplify the nested where clause:
>>
>> <results>{
>> subsequence(
>> ft:mark(
>> for $x in collection($col)//entry
>> where $x//text() contains text { $term } using wildcards
>> order by fn:lower-case(
>> fn:replace(($x//orth[1]/text())[1], '\\p{P}|\\d+','')
>> ) collation "?lang=ga"
>> return $x
>> ), 1, 5000
>> )
>> }</results>
>>
>> You could as well use a predicate with position(), it may be evaluated
>> faster than subsequence (I'm not sure, though, because most time will
>> probably be spent for ordering all results):
>>
>> <results>{
>> ft:mark(
>> for $x in collection($col)//entry
>> where $x//text() contains text { $term } using wildcards
>> order by fn:lower-case(
>> fn:replace(($x//orth[1]/text())[1], '\\p{P}|\\d+','')
>> ) collation "?lang=ga"
>> return $x
>> )[position() = 1 to 5000]
>> }</results>
>>
>> Could you please open the InfoView in the GUI, execute the query again
>> and check if the full-text index is applied?
>>
>> Christian
>>
>>
>>
>> On Wed, Aug 13, 2014 at 12:02 PM, Christopher Yocum <cyocum@gmail.com> wrote:
>> > declare variable $term as xs:string external; declare variable $col as
>> > xs:string external; <results>{subsequence(ft:mark(for $x in
>> > collection($col)//entry where $x//text()[. contains text {$term} using
>> > wildcards] order by fn:lower-case(fn:replace(($x//orth[1]/text())[1],
>> > '\\p{P}|\\d+','')) collation \"?lang=ga\" return $x), 1, 5000)}</results>