exist icon indicating copy to clipboard operation
exist copied to clipboard

[BUG] `binary` Attribute in Lucene full text fields does not work any more.

Open scheidelerl opened this issue 1 year ago • 10 comments

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

scheidelerl avatar Aug 29 '24 11:08 scheidelerl