我们使用exist库来存储各种xml文档,在这些文档上我们使用xquery执行搜索。这是xml文档的示例:
<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)
问题是,搜索订单的结果相当奇怪。例如,在米兰之前,它将米伦、米伦、戈兰、维隆排在第一位。换句话说,搜索给不完全匹配的结果分配了比精确匹配(米兰)更大的分数。我们做错什么了?是否有办法让精确匹配的分数高于接近精确匹配的分数?
发布于 2017-09-13 05:06:21
eXist-db的全文搜索索引构建在阿帕奇·卢塞尼之上。在Lucene跟踪器(参见https://issues.apache.org/jira/browse/LUCENE-329)和其他构建在其上的产品(如ElasticSearch (参见https://github.com/elastic/elasticsearch/issues/20369) )中报告了此问题,并在Lucene5.3中使用https://svn.apache.org/viewvc?view=revision&revision=1680548进行了修复。
为了使eXist从这一改进中获益,eXist需要将其Lucene库从当前eXist版本Lucene4.10.4的版本升级到Lucene 5.3或更高版本。到目前为止,Lucene4.x和5.x+之间的一些API不兼容已经阻止了eXist实现这一跳转(参见未决问题https://github.com/eXist-db/exist/issues/1160),但我相信这个挑战并不是不可克服的。
同时,作为一种解决办法,您可以添加一个额外的查询来查找精确匹配,并且只返回这个,或者返回模糊匹配之上的第一个命中。根据您的应用程序,您可能需要从用户提供的输入中去掉倾斜,但这应该可以实现您的目标。
https://stackoverflow.com/questions/46197136
复制相似问题