xml - 当节点包含特殊字符时使用 Xquery 处理 XML 标题搜索的最佳方法

标签 xml database search xquery marklogic

我最近接到一项任务,要在我们的 MarkLogic 数据库中创建一个搜索字段。我们 XML 中需要搜索的点可能如下所示:

<title_group>
    <title xml:lang="fr" source="sdo">Amendement 2 - Dispositifs à semiconducteurs - Partie 16-1: Circuits intégrés hyperfréquences - Amplificateurs</title>
    <title xml:lang="en" source="sdo">Amendment 2 - Semiconductor devices - Part 16-1: Microwave integrated circuits - Amplifiers</title>
    <title xml:lang="no">Tillegg 2 - Halvlederenheter - Del 16-1: Mikrobøgekretser - Forsterkere</title>
  </title_group>

这些节点当前不是管理中的范围元素索引。

现在,在这种特殊情况下,我认为连字符导致了问题。我试过:

  let $searchTerm := fn:replace($title, "\s+-\s+", "* *")
  let $searchTerm := fn:replace($searchTerm, "-", "* *")

但收效甚微。

当前搜索是这样进行的:

  let $product_query:= cts:element-word-query(xs:QName("product:title"), fn:concat("*",$searchTerm,"*"), ("case-insensitive", "punctuation-insensitive"))
  let $products := cts:search(/product:product, $product_query, ("filtered", $index_order))[1 to $result_limit]

当我搜索“Tillegg 2”或“Tillegg 2 - Halvlederenheter”时,这使我能够获得正确的结果,但当我包含更多标题时它会失败。我是否需要将字符串预处理为一个与查询,还是有更聪明的方法?

最佳答案

如果其他人碰巧在寻找同一件事的答案,我就是这样解决的:

  1. 在搜索字符串上使用fn:normalize-space,去除空格
  2. 使用 fn:tokenize($searchString, '\s+') 获取搜索标记列表。
  3. 删除单字母标记
  4. 制作一个cts:and-query,里面有一些cts:element-word-query。他们有搜索选项“case-insensitive”、“punctuation-insensitive”、“diacritic-insensitive”、“whitespace-insensitive”、“unstemmed”、“unwildcarded”

关于xml - 当节点包含特殊字符时使用 Xquery 处理 XML 标题搜索的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43605358/

相关文章:

c# - 使用C#在xml文档中获取特定值

c# - 如何让 ASP.NET Core 返回 XML 结果?

mysql - 数据库中的 GMT 时间

database - 带密码的 PostgreSQL 身份验证

sql - 删除 SQL 中的 CONSTRAINT 花费的时间太长

algorithm - 黄金分割搜索比二分搜索好吗?

c# - 如何检查字符串是否包含 C# 中的无效文件名字符?

sql-server - 使用 OPENROWSET 和 OPENXML 将 XML 导入 SQL Server

xml - 在postgres中使用xpath提取多级xml数据

java - 在二维数组中搜索 O(n) 未排序的行