我正在学习XQuery关键字搜索,并将结果显示在网站上。而且我发现有有用的教程网站逐步地开发了一个网站。
但是,执行代码后出现错误(无效的qname文本:match-count)。是否缺少定义名称空间的内容?
任何人都可以帮助我解决此问题吗?谢谢。
教程网站:https://en.wikibooks.org/wiki/XQuery/Keyword_Search
答案 0 :(得分:0)
已弃用错误消息text:match-count()
标记的功能,并将其从eXist中删除,原始的特定于eXist的全文本搜索操作符&=
也已被删除。结果,这篇文章(历史页面使我想起了我10年零3个月前所写的文章!)迫切需要进行更新。这些“传统”全文功能已从eXist中删除,因为添加了一个更为出色的解决方案,即基于Lucene的全文索引,您可以在https://exist-db.org/exist/apps/doc/lucene中进行阅读。
更新后的文章将重点介绍基于Lucene的新全文本索引。首先,创建一个名为collection.xconf
的集合配置文件:
<collection xmlns="http://exist-db.org/collection-config/1.0">
<index xmlns:xs="http://www.w3.org/2001/XMLSchema">
<lucene>
<text qname="body"/>
<text qname="biography"/>
</lucene>
</index>
</collection>
将此文档保存在/db/test
集合中。 eXide通过提供(1)将文档的副本存储在其实际需要的位置(在/db/system/config/db/test
中)和(2)重新索引/db/test
集合以应用文档,从而为您节省了一些步骤。新的集合配置(您可以使用xmldb:reindex("/db/test")
手动进行配置):
将集合配置文件另存为/db/system/config/db/test/collection.xconf
之后,您就可以使用/db/test
函数来查询ft:query
集合并使用ft:score
函数对结果进行排序:>
let $hits :=
(
collection('/db/test/articles')/article/body,
collection('/db/test/people')/people/person/biography
)[ft:query(., $q)]
for $hit in $hits
let $score := ft:score($hit)
order by $score descending
return $hit
(请注意,与本文相反,我们可以省去过滤用户提供的查询字符串,因为我们不再使用util:eval
。实际上并没有必要。)
有了这一更改-切换到eXist的基于Lucene的较新的全文本搜索引擎-本文的其余部分基本上仍将适用。