2017-09-13 4 views
1

Wir verwenden exist-db Basis zum Speichern verschiedener XML-Dokumente, auf denen wir suchen mit xquery. Dies ist Beispiel für XML-Dokument:XQuery unscharfe Suche in exist-db

<person personID="some_id"> 
 
    <name> 
 
     <familyName>Doe</familyName> 
 
     <firstName>John</firstName> 
 
    </name> 
 
</person>

Die Suche wir verwenden, ist Fuzzy-Suche und die Abfrage ist in folgenden Form

xquery version "3.0"; 
 
for $doc in collection('/db/Persons')/*[ft:query(.,'milan~')] 
 
let $score := ft:score($doc) 
 
order by $score descending return base-uri($doc)

Die Problem ist, dass Suchaufträge eher merkwürdig sind. Zum Beispiel rangiert es Milun, Milun, Golan, Vilon vor Milan. Mit anderen Worten, die Suche weist den Ergebnissen, die im Vergleich zur exakten Übereinstimmung nicht exakt übereinstimmen, eine höhere Punktzahl zu (Milan). Was machen wir falsch? Gibt es eine Möglichkeit, dass exakte Übereinstimmungen im Vergleich zu fast exakten Übereinstimmungen höhere Werte haben?

Antwort

0

Der Volltextsuchindex von eXist-db basiert auf Apache Lucene. Dieses Problem wurde im Lucene Bug Tracker (siehe https://issues.apache.org/jira/browse/LUCENE-329) und anderen darauf aufbauenden Produkten wie ElasticSearch (siehe https://github.com/elastic/elasticsearch/issues/20369) gemeldet, und in Lucene 5.3 mit https://svn.apache.org/viewvc?view=revision&revision=1680548 wurde ein Fehler behoben.

Damit eXist von dieser Verbesserung profitieren kann, müsste eXist seine Lucene-Bibliotheken von der Version in der aktuellen Version von eXist, Lucene 4.10.4, auf Lucene 5.3 oder höher aufrüsten. Einige API-Inkompatibilitäten zwischen Lucene 4.x und 5.x + haben eXist bislang davon abgehalten, diesen Sprung zu machen (siehe das offene Problem https://github.com/eXist-db/exist/issues/1160), aber ich glaube, dass die Herausforderung nicht unüberwindbar ist.

In der Zwischenzeit können Sie als Workaround eine zusätzliche Abfrage hinzufügen, die nach einer genauen Übereinstimmung sucht und diese nur oder als ersten Treffer über den Fuzzy-Übereinstimmungen zurückgibt. Abhängig von Ihrer Anwendung müssen Sie möglicherweise die Tilde von den vom Benutzer bereitgestellten Eingaben entfernen. Dies sollte jedoch Ihr Ziel erreichen.