存在db中的XQuery模糊搜索

时间:2017-09-13 12:06:41

标签: lucene xquery fuzzy-search exist-db

我们使用exists-db base存储各种xml文档,我们使用xquery执行搜索。这是xml文档的示例:



<person personID="some_id">
    <name>
        <familyName>Doe</familyName>
        <firstName>John</firstName>
    </name>
</person>
&#13;
&#13;
&#13;

我们使用的搜索是模糊搜索,查询格式如下

&#13;
&#13;
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)
&#13;
&#13;
&#13;

问题是搜索订单结果相当奇怪。例如,它在米兰之前排名 Milun,Milun,Golan,Vilon 。换句话说,与完全匹配(米兰)相比,搜索会为不完全匹配的结果指定更高的分数。我们做错了什么?与近精确匹配相比,精确匹配是否有更高的分数?

1 个答案:

答案 0 :(得分:1)

eXist-db的全文搜索索引建立在Apache Lucene之上。在Lucene错误跟踪器(请参阅https://issues.apache.org/jira/browse/LUCENE-329)和其上构建的其他产品(如E {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),但我认为挑战并非难以克服。

与此同时,作为一种变通方法,您可以添加一个查找完全匹配的附加查询,并仅返回此值或作为模糊匹配上方的第一个匹配。根据您的应用程序,您可能需要从用户提供的输入中删除代字号,但这应该可以实现您的目标。