Simple expressions using the full-text index

In the following example queries, the entire set of Shakespeare plays and works in this demo are queried.

Find out where Juliet talks about love

declare namespace tei="http://www.tei-c.org/ns/1.0";
 
collection("@@path/data")//tei:sp[ft:query(., 'love')][tei:speaker = "Juliet"]
        

Search for a phrase

declare namespace tei="http://www.tei-c.org/ns/1.0";
 
collection("@@path/data")//tei:sp[ft:query(., '"fenny snake"')]

Find speeches in which "love" and "father" occur closely together, using XML query syntax:

declare namespace tei="http://www.tei-c.org/ns/1.0";
 
let $query :=
    <query>
        <near slop="20"><term>love</term><near>father</near></near>
    </query>
return 
    collection("@@path/data")//tei:sp[ft:query(., $query)]
            

Find speeches in which "boil" and "bubble" occur, ordering them by full-text match score

declare namespace tei="http://www.tei-c.org/ns/1.0";
 
for $m in collection("@@path/data")//tei:sp[ft:query(., "boil bubble")]
let $score := ft:score($m)
order by $score descending
return 
    <m score="{$score}">{$m}</m>

Find speeches and group them by play

xquery version "3.0";

import module namespace kwic="http://exist-db.org/xquery/kwic";

declare namespace tei="http://www.tei-c.org/ns/1.0";

declare function local:search($query) {
    let $hits := //tei:sp[ft:query(., $query)]
    return
        local:display($hits)
};

declare function local:display($hits) {
    for $speechInPlay in $hits
    group by $play := $speechInPlay/ancestor::tei:TEI/@xml:id
    return
        <div class="play">
            <h1>{$play/../tei:teiHeader//tei:titleStmt/tei:title/text()}</h1>
            <ul>
            {
                for $speech in $speechInPlay
                return
                    <li>
                        <h4>{$speech/tei:speaker/text()}</h4>
                        {
                            kwic:summarize($speech, <config width="40" table="no"/>)
                        }
                    </li>
            }
            </ul>
        </div>
};

let $query := "'fenny snake'"
return
    local:search($query)