2017-09-13 71 views
1

我們使用exists-db base來存儲各種xml文檔,我們使用xquery執行搜索。這是示例XML文檔:存在的XQuery模糊搜索-db

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

我們使用的搜索是模糊搜索和查詢是在下面的表格

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)

的問題在於搜索訂單結果相當奇怪。例如,它排列Milun,Milun,戈蘭,Vilon之前米蘭。換句話說,搜索會給與精確匹配(米蘭)不完全匹配的結果分配更高的分數。我們做錯了什麼?是否有精確匹配的方法與接近完全匹配的分數相比有更高的分數?

回答

0

eXist-db的全文搜索索引建立在Apache Lucene之上。在Lucene bug跟蹤器(見https://issues.apache.org/jira/browse/LUCENE-329)和其上構建的其他產品(如ElasticSearch)(參見https://github.com/elastic/elasticsearch/issues/20369)中報告了此問題,並在Lucene 5.3中使用https://svn.apache.org/viewvc?view=revision&revision=1680548進行了修復。爲了讓eXist受益於這種改進,eXist需要將其Lucene庫從當前版本的eXist Lucene 4.10.4升級到Lucene 5.3或更高版本。 Lucene 4.x和5.x +之間的某些API不兼容性至今阻止eXist進行這種跳轉(請參閱公開問題https://github.com/eXist-db/exist/issues/1160),但我相信這個挑戰並非不可逾越。

同時,作爲一種解決方法,您可以添加一個額外的查詢來查找完全匹配,並僅返回此值或作爲模糊匹配上方的第一個匹配。根據您的應用程序,您可能需要從用戶提供的輸入中去除波形符號,但這應該可以實現您的目標。