我最近接到任务,在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”或“tillegg2-halvlederenheter”时得到正确的结果,但是当我包含更多的标题时失败了。我需要将字符串预处理为and查询,还是有更聪明的方法?

最佳答案

如果有人碰巧在寻找同一个问题的答案,我就是这样解决的:
在搜索字符串上使用fn:normalize-space删除空白
使用fn:tokenize($searchString, '\s+')获取搜索标记列表。
删除单字母标记
做一个cts:and-query里面有一个cts:element-word-query的数字。他们有“不区分大小写”、“不区分标点符号”、“不区分音调符号”、“不区分空白”、“未加修饰”、“未加修饰”等搜索选项。

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

10-10 10:07
查看更多