Difference between revisions of "Full-Text Module"
m (Text replacement - "db:open" to "db:pre") |
|||
(2 intermediate revisions by the same user not shown) | |||
Line 10: | Line 10: | ||
{| width='100%' | {| width='100%' | ||
− | |- | + | |- valign="top" |
| width='120' | '''Signatures''' | | width='120' | '''Signatures''' | ||
|{{Func|ft:search|$db as xs:string, $terms as item()*|text()*}}<br/>{{Func|ft:search|$db as xs:string, $terms as item()*, $options as map(*)?|text()*}} | |{{Func|ft:search|$db as xs:string, $terms as item()*|text()*}}<br/>{{Func|ft:search|$db as xs:string, $terms as item()*, $options as map(*)?|text()*}} | ||
− | |- | + | |- valign="top" |
| '''Summary''' | | '''Summary''' | ||
|Returns all text nodes from the full-text index of the database {{Code|$db}} that contain the specified {{Code|$terms}}.<br/>The options used for tokenizing the input and building the full-text will also be applied to the search terms. As an example, if the index terms have been stemmed, the search string will be stemmed as well. | |Returns all text nodes from the full-text index of the database {{Code|$db}} that contain the specified {{Code|$terms}}.<br/>The options used for tokenizing the input and building the full-text will also be applied to the search terms. As an example, if the index terms have been stemmed, the search string will be stemmed as well. | ||
Line 33: | Line 33: | ||
** {{Code|max}}: specify the maximum distance in terms of ''units''. The default is {{Code|∞}}. | ** {{Code|max}}: specify the maximum distance in terms of ''units''. The default is {{Code|∞}}. | ||
** {{Code|unit}}: can be {{Code|words}}, {{Code|sentences}} or {{Code|paragraphs}}. The default is {{Code|words}}. | ** {{Code|unit}}: can be {{Code|words}}, {{Code|sentences}} or {{Code|paragraphs}}. The default is {{Code|words}}. | ||
− | |- | + | |- valign="top" |
| '''Errors''' | | '''Errors''' | ||
− | |{{Error|db: | + | |{{Error|db:get|Database Module#Errors}} The addressed database does not exist or could not be opened.<br/>{{Error|db:no-index|Database Module#Errors}} the index is not available.<br/>{{Error|options|#Errors}} the fuzzy and wildcard option cannot be both specified. |
− | |- | + | |- valign="top" |
| '''Examples''' | | '''Examples''' | ||
| | | | ||
Line 64: | Line 64: | ||
{| width='100%' | {| width='100%' | ||
− | |- | + | |- valign="top" |
| width='120' | '''Signatures''' | | width='120' | '''Signatures''' | ||
|{{Func|ft:tokens|$db as xs:string|element(value)*}}<br/>{{Func|ft:tokens|$db as xs:string, $prefix as xs:string|element(value)*}} | |{{Func|ft:tokens|$db as xs:string|element(value)*}}<br/>{{Func|ft:tokens|$db as xs:string, $prefix as xs:string|element(value)*}} | ||
− | |- | + | |- valign="top" |
| '''Summary''' | | '''Summary''' | ||
|Returns all full-text tokens stored in the index of the database {{Code|$db}}, along with their numbers of occurrences.<br/>If {{Code|$prefix}} is specified, the returned nodes will be refined to the strings starting with that prefix. The prefix will be tokenized according to the full-text used for creating the index. | |Returns all full-text tokens stored in the index of the database {{Code|$db}}, along with their numbers of occurrences.<br/>If {{Code|$prefix}} is specified, the returned nodes will be refined to the strings starting with that prefix. The prefix will be tokenized according to the full-text used for creating the index. | ||
− | |- | + | |- valign="top" |
| '''Errors''' | | '''Errors''' | ||
− | |{{Error|db: | + | |{{Error|db:get|Database Module#Errors}} The addressed database does not exist or could not be opened.<br/>{{Error|db:no-index|Database Module#Errors}} the full-text index is not available. |
− | |- | + | |- valign="top" |
| '''Examples''' | | '''Examples''' | ||
|Returns the number of occurrences for a single, specific index entry: | |Returns the number of occurrences for a single, specific index entry: | ||
Line 87: | Line 87: | ||
{| width='100%' | {| width='100%' | ||
− | |- | + | |- valign="top" |
| width='120' | '''Signatures''' | | width='120' | '''Signatures''' | ||
|{{Func|ft:contains|$input as item()*, $terms as item()*|xs:boolean}}<br/>{{Func|ft:contains|$input as item()*, $terms as item()*, $options as map(*)?|xs:boolean}} | |{{Func|ft:contains|$input as item()*, $terms as item()*|xs:boolean}}<br/>{{Func|ft:contains|$input as item()*, $terms as item()*, $options as map(*)?|xs:boolean}} | ||
− | |- | + | |- valign="top" |
| '''Summary''' | | '''Summary''' | ||
|Checks if the specified {{Code|$input}} items contain the specified {{Code|$terms}}.<br/>The function does the same as the [[Full-Text]] expression {{Code|contains text}}, but options can be specified more dynamically. The {{Code|$options}} are the same as for {{Function||ft:search}}, and the following ones exist: | |Checks if the specified {{Code|$input}} items contain the specified {{Code|$terms}}.<br/>The function does the same as the [[Full-Text]] expression {{Code|contains text}}, but options can be specified more dynamically. The {{Code|$options}} are the same as for {{Function||ft:search}}, and the following ones exist: | ||
Line 97: | Line 97: | ||
* {{Code|stemming}}: determines is tokens are stemmed. Allowed values are {{Code|true}} and {{Code|false}}. By default, stemming is turned off. | * {{Code|stemming}}: determines is tokens are stemmed. Allowed values are {{Code|true}} and {{Code|false}}. By default, stemming is turned off. | ||
* {{Code|language}}: determines the language. This option is relevant for stemming tokens. All language codes are supported. The default language is {{Code|en}}. | * {{Code|language}}: determines the language. This option is relevant for stemming tokens. All language codes are supported. The default language is {{Code|en}}. | ||
− | |- | + | |- valign="top" |
| '''Errors''' | | '''Errors''' | ||
|{{Error|options|#Errors}} specified options are conflicting. | |{{Error|options|#Errors}} specified options are conflicting. | ||
− | |- | + | |- valign="top" |
| '''Examples''' | | '''Examples''' | ||
| | | | ||
Line 116: | Line 116: | ||
{| width='100%' | {| width='100%' | ||
− | |- | + | |- valign="top" |
| width='120' | '''Signatures''' | | width='120' | '''Signatures''' | ||
|{{Func|ft:count|$nodes as node()*|xs:integer}} | |{{Func|ft:count|$nodes as node()*|xs:integer}} | ||
− | |- | + | |- valign="top" |
| '''Summary''' | | '''Summary''' | ||
|Returns the number of occurrences of the search terms specified in a full-text expression. | |Returns the number of occurrences of the search terms specified in a full-text expression. | ||
− | |- | + | |- valign="top" |
| '''Examples''' | | '''Examples''' | ||
| | | | ||
Line 131: | Line 131: | ||
{| width='100%' | {| width='100%' | ||
− | |- | + | |- valign="top" |
| width='120' | '''Signatures''' | | width='120' | '''Signatures''' | ||
|{{Func|ft:score|$item as item()*|xs:double*}} | |{{Func|ft:score|$item as item()*|xs:double*}} | ||
− | |- | + | |- valign="top" |
| '''Summary''' | | '''Summary''' | ||
|Returns the score values (0.0 - 1.0) that have been attached to the specified items. {{Code|0}} is returned a value if no score was attached. | |Returns the score values (0.0 - 1.0) that have been attached to the specified items. {{Code|0}} is returned a value if no score was attached. | ||
− | |- | + | |- valign="top" |
| '''Examples''' | | '''Examples''' | ||
| | | | ||
Line 146: | Line 146: | ||
{| width='100%' | {| width='100%' | ||
− | |- | + | |- valign="top" |
| width='120' | '''Signatures''' | | width='120' | '''Signatures''' | ||
|{{Func|ft:tokenize|$string as xs:string?|xs:string*}}<br/>{{Func|ft:tokenize|$string as xs:string?, $options as map(*)?|xs:string*}} | |{{Func|ft:tokenize|$string as xs:string?|xs:string*}}<br/>{{Func|ft:tokenize|$string as xs:string?, $options as map(*)?|xs:string*}} | ||
− | |- | + | |- valign="top" |
| '''Summary''' | | '''Summary''' | ||
|Tokenizes the given {{Code|$string}}, using the current default full-text options or the {{Code|$options}} specified as second argument, and returns a sequence with the tokenized string. The following options are available: | |Tokenizes the given {{Code|$string}}, using the current default full-text options or the {{Code|$options}} specified as second argument, and returns a sequence with the tokenized string. The following options are available: | ||
Line 157: | Line 157: | ||
* {{Code|language}}: determines the language. This option is relevant for stemming tokens. All language codes are supported. The default language is {{Code|en}}. | * {{Code|language}}: determines the language. This option is relevant for stemming tokens. All language codes are supported. The default language is {{Code|en}}. | ||
The {{Code|$options}} argument can be used to control full-text processing. | The {{Code|$options}} argument can be used to control full-text processing. | ||
− | |- | + | |- valign="top" |
| '''Examples''' | | '''Examples''' | ||
| | | | ||
Line 168: | Line 168: | ||
{| width='100%' | {| width='100%' | ||
− | |- | + | |- valign="top" |
| width='120' | '''Signatures''' | | width='120' | '''Signatures''' | ||
|{{Func|ft:normalize|$string as xs:string?|xs:string}}<br/>{{Func|ft:normalize|$string as xs:string?, $options as map(*)?|xs:string}} | |{{Func|ft:normalize|$string as xs:string?|xs:string}}<br/>{{Func|ft:normalize|$string as xs:string?, $options as map(*)?|xs:string}} | ||
− | |- | + | |- valign="top" |
| '''Summary''' | | '''Summary''' | ||
|Normalizes the given {{Code|$string}}, using the current default full-text options or the {{Code|$options}} specified as second argument. The function accepts the same arguments as {{Function||ft:tokenize}}; special characters and separators will be preserved. | |Normalizes the given {{Code|$string}}, using the current default full-text options or the {{Code|$options}} specified as second argument. The function accepts the same arguments as {{Function||ft:tokenize}}; special characters and separators will be preserved. | ||
− | |- | + | |- valign="top" |
| '''Examples''' | | '''Examples''' | ||
| | | | ||
Line 183: | Line 183: | ||
{| width='100%' | {| width='100%' | ||
− | |- | + | |- valign="top" |
| width='120' | '''Signatures''' | | width='120' | '''Signatures''' | ||
|{{Func|ft:thesaurus|$node as node(), $term as xs:string|xs:string*}}<br/>{{Func|ft:thesaurus|$node as node(), $term as xs:string, $options as map(*)?|xs:string*}}<br/> | |{{Func|ft:thesaurus|$node as node(), $term as xs:string|xs:string*}}<br/>{{Func|ft:thesaurus|$node as node(), $term as xs:string, $options as map(*)?|xs:string*}}<br/> | ||
− | |- | + | |- valign="top" |
| '''Summary''' | | '''Summary''' | ||
|Looks up a {{Code|$term}} in a [[Full-Text#Thesaurus|Thesaurus Structure]] supplied by {{Code|$node}}. The following {{Code|$options}} exist: | |Looks up a {{Code|$term}} in a [[Full-Text#Thesaurus|Thesaurus Structure]] supplied by {{Code|$node}}. The following {{Code|$options}} exist: | ||
* {{Code|relationship}}: determines the relationship between terms | * {{Code|relationship}}: determines the relationship between terms | ||
* {{Code|levels}}: determines the maximum number of levels to traverse | * {{Code|levels}}: determines the maximum number of levels to traverse | ||
− | |- | + | |- valign="top" |
| '''Examples''' | | '''Examples''' | ||
| Returns {{Code|happy}} and {{Code|lucky}}: | | Returns {{Code|happy}} and {{Code|lucky}}: | ||
Line 215: | Line 215: | ||
{| width='100%' | {| width='100%' | ||
− | |- | + | |- valign="top" |
| width='120' | '''Signatures''' | | width='120' | '''Signatures''' | ||
|{{Func|ft:mark|$nodes as node()*|node()*}}<br />{{Func|ft:mark|$nodes as node()*, $name as xs:string|node()*}} | |{{Func|ft:mark|$nodes as node()*|node()*}}<br />{{Func|ft:mark|$nodes as node()*, $name as xs:string|node()*}} | ||
− | |- | + | |- valign="top" |
| '''Summary''' | | '''Summary''' | ||
|Puts a marker element around the resulting {{Code|$nodes}} of a full-text request.<br />The default name of the marker element is {{Code|mark}}. An alternative name can be chosen via the optional {{Code|$name}} argument.<br />Please note that: | |Puts a marker element around the resulting {{Code|$nodes}} of a full-text request.<br />The default name of the marker element is {{Code|mark}}. An alternative name can be chosen via the optional {{Code|$name}} argument.<br />Please note that: | ||
* The full-text expression that computes the token positions must be specified as argument of the <code>ft:mark()</code> function, as all position information is lost in subsequent processing steps. You may need to specify more than one full-text expression if you want to use the function in a FLWOR expression, as shown in Example 2. | * The full-text expression that computes the token positions must be specified as argument of the <code>ft:mark()</code> function, as all position information is lost in subsequent processing steps. You may need to specify more than one full-text expression if you want to use the function in a FLWOR expression, as shown in Example 2. | ||
* The supplied node must be a [[Database Module#Database Node|Database Node]]. As shown in Example 3, {{Code|update}} or {{Code|transform}} can be utilized to convert a fragment to the required internal representation. | * The supplied node must be a [[Database Module#Database Node|Database Node]]. As shown in Example 3, {{Code|update}} or {{Code|transform}} can be utilized to convert a fragment to the required internal representation. | ||
− | |- | + | |- valign="top" |
| '''Examples''' | | '''Examples''' | ||
|'''Example 1''': The following query returns {{Code|<XML><mark>hello</mark> world</XML>}}, if one text node of the database {{Code|DB}} has the value "hello world": | |'''Example 1''': The following query returns {{Code|<XML><mark>hello</mark> world</XML>}}, if one text node of the database {{Code|DB}} has the value "hello world": | ||
<syntaxhighlight lang="xquery"> | <syntaxhighlight lang="xquery"> | ||
− | ft:mark(db: | + | ft:mark(db:get('DB')//*[text() contains text 'hello']) |
</syntaxhighlight> | </syntaxhighlight> | ||
'''Example 2''': The following expression loops through the first ten full-text results and marks the results in a second expression: | '''Example 2''': The following expression loops through the first ten full-text results and marks the results in a second expression: | ||
Line 234: | Line 234: | ||
let $end := 10 | let $end := 10 | ||
let $term := 'welcome' | let $term := 'welcome' | ||
− | for $ft in (db: | + | for $ft in (db:get('DB')//*[text() contains text { $term }])[position() = $start to $end] |
return element hit { | return element hit { | ||
ft:mark($ft[text() contains text { $term }]) | ft:mark($ft[text() contains text { $term }]) | ||
Line 250: | Line 250: | ||
{| width='100%' | {| width='100%' | ||
− | |- | + | |- valign="top" |
| width='120' | '''Signatures''' | | width='120' | '''Signatures''' | ||
|{{Func|ft:extract|$nodes as node()*|node()*}}<br />{{Func|ft:extract|$nodes as node()*, $name as xs:string|node()*}}<br />{{Func|ft:extract|$nodes as node()*, $name as xs:string, $length as xs:integer|node()*}} | |{{Func|ft:extract|$nodes as node()*|node()*}}<br />{{Func|ft:extract|$nodes as node()*, $name as xs:string|node()*}}<br />{{Func|ft:extract|$nodes as node()*, $name as xs:string, $length as xs:integer|node()*}} | ||
− | |- | + | |- valign="top" |
| '''Summary''' | | '''Summary''' | ||
|Extracts and returns relevant parts of full-text results. It puts a marker element around the resulting {{Code|$nodes}} of a full-text index request and chops irrelevant sections of the result.<br />The default element name of the marker element is {{Code|mark}}. An alternative element name can be chosen via the optional {{Code|$name}} argument.<br />The default length of the returned text is {{Code|150}} characters. An alternative length can be specified via the optional {{Code|$length}} argument. Note that the effective text length may differ from the specified text due to formatting and readibility issues.<br />For more details on this function, please have a look at {{Function||ft:mark}}. | |Extracts and returns relevant parts of full-text results. It puts a marker element around the resulting {{Code|$nodes}} of a full-text index request and chops irrelevant sections of the result.<br />The default element name of the marker element is {{Code|mark}}. An alternative element name can be chosen via the optional {{Code|$name}} argument.<br />The default length of the returned text is {{Code|150}} characters. An alternative length can be specified via the optional {{Code|$length}} argument. Note that the effective text length may differ from the specified text due to formatting and readibility issues.<br />For more details on this function, please have a look at {{Function||ft:mark}}. | ||
− | |- | + | |- valign="top" |
| '''Examples''' | | '''Examples''' | ||
| | | | ||
* The following query may return {{Code|<XML>...<b>hello</b>...<XML>}} if a text node of the database {{Code|DB}} contains the string "hello world": | * The following query may return {{Code|<XML>...<b>hello</b>...<XML>}} if a text node of the database {{Code|DB}} contains the string "hello world": | ||
<syntaxhighlight lang="xquery"> | <syntaxhighlight lang="xquery"> | ||
− | ft:extract(db: | + | ft:extract(db:get('DB')//*[text() contains text 'hello'], 'b', 1) |
</syntaxhighlight> | </syntaxhighlight> | ||
|} | |} | ||
Line 270: | Line 270: | ||
! width="110"|Code | ! width="110"|Code | ||
|Description | |Description | ||
− | |- | + | |- valign="top" |
|{{Code|options}} | |{{Code|options}} | ||
|Both wildcards and fuzzy search have been specified as search options. | |Both wildcards and fuzzy search have been specified as search options. |
Revision as of 14:18, 20 July 2022
This XQuery Module extends the Full-Text features of BaseX: The index can be directly accessed, full-text results can be marked with additional elements, or the relevant parts can be extracted. Moreover, the score value, which is generated by the contains text
expression, can be explicitly requested from items.
Contents
Conventions
All functions and errors in this module are assigned to the http://basex.org/modules/ft
namespace, which is statically bound to the ft
prefix.
Database Functions
ft:search
Signatures | ft:search($db as xs:string, $terms as item()*) as text()* ft:search($db as xs:string, $terms as item()*, $options as map(*)?) as text()*
|
Summary | Returns all text nodes from the full-text index of the database $db that contain the specified $terms .The options used for tokenizing the input and building the full-text will also be applied to the search terms. As an example, if the index terms have been stemmed, the search string will be stemmed as well. The
|
Errors | db:get : The addressed database does not exist or could not be opened.db:no-index : the index is not available.options : the fuzzy and wildcard option cannot be both specified.
|
Examples |
<syntaxhighlight lang="xquery"> ft:search("db", ("A", "B"), map { "mode": "all words", "distance": map { "max": "5", "unit": "words" } }) </syntaxhighlight>
<syntaxhighlight lang="xquery"> let $terms := "Hello Worlds" let $fuzzy := true() for $db in 1 to 3 let $dbname := 'DB' || $db return ft:search($dbname, $terms, map { 'fuzzy': $fuzzy })/.. </syntaxhighlight> |
ft:tokens
Signatures | ft:tokens($db as xs:string) as element(value)* ft:tokens($db as xs:string, $prefix as xs:string) as element(value)*
|
Summary | Returns all full-text tokens stored in the index of the database $db , along with their numbers of occurrences.If $prefix is specified, the returned nodes will be refined to the strings starting with that prefix. The prefix will be tokenized according to the full-text used for creating the index.
|
Errors | db:get : The addressed database does not exist or could not be opened.db:no-index : the full-text index is not available.
|
Examples | Returns the number of occurrences for a single, specific index entry:
<syntaxhighlight lang="xquery"> let $term := ft:tokenize($term) return number(ft:tokens('db', $term)[. = $term]/@count) </syntaxhighlight> |
General Functions
ft:contains
Signatures | ft:contains($input as item()*, $terms as item()*) as xs:boolean ft:contains($input as item()*, $terms as item()*, $options as map(*)?) as xs:boolean
|
Summary | Checks if the specified $input items contain the specified $terms .The function does the same as the Full-Text expression contains text , but options can be specified more dynamically. The $options are the same as for ft:search , and the following ones exist:
|
Errors | options : specified options are conflicting.
|
Examples |
<syntaxhighlight lang="xquery"> ft:contains("John Doe", ("jack", "john"), map { "mode": "any" }) </syntaxhighlight>
<syntaxhighlight lang="xquery"> (true(), false()) ! ft:contains("Häuser", "Haus", map { 'stemming': ., 'language':'de' }) </syntaxhighlight> |
ft:count
Signatures | ft:count($nodes as node()*) as xs:integer
|
Summary | Returns the number of occurrences of the search terms specified in a full-text expression. |
Examples |
|
ft:score
Signatures | ft:score($item as item()*) as xs:double*
|
Summary | Returns the score values (0.0 - 1.0) that have been attached to the specified items. 0 is returned a value if no score was attached.
|
Examples |
|
ft:tokenize
Signatures | ft:tokenize($string as xs:string?) as xs:string* ft:tokenize($string as xs:string?, $options as map(*)?) as xs:string*
|
Summary | Tokenizes the given $string , using the current default full-text options or the $options specified as second argument, and returns a sequence with the tokenized string. The following options are available:
The |
Examples |
|
ft:normalize
Signatures | ft:normalize($string as xs:string?) as xs:string ft:normalize($string as xs:string?, $options as map(*)?) as xs:string
|
Summary | Normalizes the given $string , using the current default full-text options or the $options specified as second argument. The function accepts the same arguments as ft:tokenize ; special characters and separators will be preserved.
|
Examples |
|
ft:thesaurus
Signatures | ft:thesaurus($node as node(), $term as xs:string) as xs:string* ft:thesaurus($node as node(), $term as xs:string, $options as map(*)?) as xs:string* |
Summary | Looks up a $term in a Thesaurus Structure supplied by $node . The following $options exist:
|
Examples | Returns happy and lucky :
<syntaxhighlight lang="xquery"> ft:thesaurus( <thesaurus> <entry> <term>happy</term> <synonym> <term>lucky</term> <relationship>RT</relationship> </synonym> </entry> </thesaurus>, 'happy' ) </syntaxhighlight> |
Highlighting Functions
ft:mark
Signatures | ft:mark($nodes as node()*) as node()* ft:mark($nodes as node()*, $name as xs:string) as node()*
|
Summary | Puts a marker element around the resulting $nodes of a full-text request.The default name of the marker element is mark . An alternative name can be chosen via the optional $name argument.Please note that:
|
Examples | Example 1: The following query returns <XML><mark>hello</mark> world</XML> , if one text node of the database DB has the value "hello world":
<syntaxhighlight lang="xquery"> ft:mark(db:get('DB')//*[text() contains text 'hello']) </syntaxhighlight> Example 2: The following expression loops through the first ten full-text results and marks the results in a second expression: <syntaxhighlight lang="xquery"> let $start := 1 let $end := 10 let $term := 'welcome' for $ft in (db:get('DB')//*[text() contains text { $term }])[position() = $start to $end] return element hit { ft:mark($ft[text() contains text { $term }]) }
</syntaxhighlight>
Example 3: The following expression returns |
ft:extract
Signatures | ft:extract($nodes as node()*) as node()* ft:extract($nodes as node()*, $name as xs:string) as node()* ft:extract($nodes as node()*, $name as xs:string, $length as xs:integer) as node()*
|
Summary | Extracts and returns relevant parts of full-text results. It puts a marker element around the resulting $nodes of a full-text index request and chops irrelevant sections of the result.The default element name of the marker element is mark . An alternative element name can be chosen via the optional $name argument.The default length of the returned text is 150 characters. An alternative length can be specified via the optional $length argument. Note that the effective text length may differ from the specified text due to formatting and readibility issues.For more details on this function, please have a look at ft:mark .
|
Examples |
<syntaxhighlight lang="xquery"> ft:extract(db:get('DB')//*[text() contains text 'hello'], 'b', 1) </syntaxhighlight> |
Errors
Code | Description |
---|---|
options
|
Both wildcards and fuzzy search have been specified as search options. |
Changelog
- Version 9.6
- Added:
ft:thesaurus
- Updated:
ft:search
,ft:contains
: newerrors
option.
- Version 9.1
- Updated:
ft:tokenize
andft:normalize
can be called with empty sequence.
- Version 9.0
- Updated: error codes updated; errors now use the module namespace
- Version 8.0
- Added:
ft:contains
,ft:normalize
- Updated: Options added to
ft:tokenize
- Version 7.8
- Added:
ft:contains
- Updated: Options added to
ft:search
- Version 7.7
- Updated: the functions no longer accept Database Nodes as reference. Instead, the name of a database must now be specified.
- Version 7.2
- Updated:
ft:search
(second argument generalized, third parameter added)
- Version 7.1
- Added:
ft:tokens
,ft:tokenize