exist
exist copied to clipboard
[BUG] `binary` Attribute in Lucene full text fields does not work any more.
Describe the bug
The use of binary attribute for fields in full text index does not work any more.
Expected behavior
The use of the binaryattribute should work.
To Reproduce
Try to index a field with as binary.
With binary:
xquery version "3.1";
module namespace t="http://exist-db.org/xquery/test";
(: LIBRARIES :)
declare namespace test="http://exist-db.org/xquery/xqsuite";
(: NAMESPACES :)
declare namespace array="http://www.w3.org/2005/xpath-functions/array";
declare namespace exist="http://exist.sourceforge.net/NS/exist";
declare namespace ft="http://exist-db.org/xquery/lucene";
declare namespace map="http://www.w3.org/2005/xpath-functions/map";
declare namespace output="http://www.w3.org/2010/xslt-xquery-serialization";
declare namespace xmldb="http://exist-db.org/xquery/xmldb";
(: VARIABLES :)
declare variable $t:XML :=
<div>
<test>Adm. 1,10</test>
<test>Bdm. 1,11</test>
<test>Cdm. 1,12</test>
<test>Edm. 1,1</test>
<test>Fdm. 1,2</test>
<test>Gdm. 1,3</test>
<test>Zdm. 1,4</test>
<test>Wdm. 1,5</test>
<test>Odm. 1,6</test>
<test>Ydm. 1,7</test>
<test>Cdm. 1,8</test>
<test>Vdm. 1,9</test>
<test>Pdm. 1,13</test>
<test>Edm. 1,14</test>
</div>;
declare variable $t:xconf :=
<collection xmlns="http://exist-db.org/collection-config/1.0">
<index xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Full-text indexing with Lucene -->
<lucene>
<!-- Elements upon which to build an index. -->
<text qname="test">
<field name="sortable" expression="./string()" type="xs:string" binary="yes"/>
</text>
</lucene>
</index>
</collection>;
(: FUNCTIONS :)
declare
%test:setUp
function t:setup() {
let $testCol := xmldb:create-collection("/db", "test")
let $indexCol := xmldb:create-collection("/db/system/config/db", "test")
return (
xmldb:store("/db/test", "test.xml", $t:XML),
xmldb:store("/db/system/config/db/test", "collection.xconf", $t:xconf),
xmldb:reindex("/db/test")
)
};
declare
%test:tearDown
function t:tearDown() {
xmldb:remove("/db/test"),
xmldb:remove("/db/system/config/db/test")
};
declare
%test:name('Sorted result.')
%test:assertExists
%test:assertXPath('count(doc("/db/test/test.xml")//test) eq count($result)')
%test:assertError("err:XPTY0004")
function t:sorted-result() as xs:string* {
let $options := map {
'fields': ('sortable')
}
let $index := doc("/db/test/test.xml")/div[ft:query(., (), $options)]
return
(
let $values := ft:binary-field($index, "sortable","xs:string")
where count($values gt 0 )
for $field in $values
order by $field ascending
return
(
$field
)
)
};
Without binary:
xquery version "3.1";
module namespace t="http://exist-db.org/xquery/test";
(: LIBRARIES :)
declare namespace test="http://exist-db.org/xquery/xqsuite";
(: NAMESPACES :)
declare namespace array="http://www.w3.org/2005/xpath-functions/array";
declare namespace exist="http://exist.sourceforge.net/NS/exist";
declare namespace ft="http://exist-db.org/xquery/lucene";
declare namespace map="http://www.w3.org/2005/xpath-functions/map";
declare namespace output="http://www.w3.org/2010/xslt-xquery-serialization";
declare namespace xmldb="http://exist-db.org/xquery/xmldb";
(: VARIABLES :)
declare variable $t:XML :=
<div>
<test>Adm. 1,10</test>
<test>Bdm. 1,11</test>
<test>Cdm. 1,12</test>
<test>Edm. 1,1</test>
<test>Fdm. 1,2</test>
<test>Gdm. 1,3</test>
<test>Zdm. 1,4</test>
<test>Wdm. 1,5</test>
<test>Odm. 1,6</test>
<test>Ydm. 1,7</test>
<test>Cdm. 1,8</test>
<test>Vdm. 1,9</test>
<test>Pdm. 1,13</test>
<test>Edm. 1,14</test>
</div>;
declare variable $t:xconf :=
<collection xmlns="http://exist-db.org/collection-config/1.0">
<index xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Full-text indexing with Lucene -->
<lucene>
<!-- Elements upon which to build an index. -->
<text qname="div">
<field name="sortable" expression="./test/string()"/>
</text>
</lucene>
</index>
</collection>;
(: FUNCTIONS :)
declare
%test:setUp
function t:setup() {
let $testCol := xmldb:create-collection("/db", "test")
let $indexCol := xmldb:create-collection("/db/system/config/db", "test")
return (
xmldb:store("/db/test", "test.xml", $t:XML),
xmldb:store("/db/system/config/db/test", "collection.xconf", $t:xconf),
xmldb:reindex("/db/test")
)
};
declare
%test:tearDown
function t:tearDown() {
xmldb:remove("/db/test"),
xmldb:remove("/db/system/config/db/test")
};
declare
%test:name('Sorted result.')
%test:assertExists
%test:assertXPath('count(doc("/db/test/test.xml")//test) eq count($result)')
%test:assertError("err:XPTY0004")
function t:sorted-result() as xs:string* {
let $options := map {
'fields': ('sortable')
}
let $index := doc("/db/test/test.xml")/div[ft:query(., (), $options)]
return
(
let $values := ft:field($index, "sortable","xs:string")
where count($values gt 0 )
for $field in $values
order by $field ascending
return
(
$field
)
)
};
Context (please always complete the following information)
- Build: eXist-6.2.0
- Java: 1.8.0_422
- OS: Ubuntu 22.04.4 LTS - Linux 6.8.0-40-generic amd64
Additional context
- How is eXist-db installed? JAR installer