2017-09-13 70 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),但我相信这个挑战并非不可逾越。

同时,作为一种解决方法,您可以添加一个额外的查询来查找完全匹配,并仅返回此值或作为模糊匹配上方的第一个匹配。根据您的应用程序,您可能需要从用户提供的输入中去除波形符号,但这应该可以实现您的目标。