首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当节点包含特殊字符时,使用Xquery在XML中处理标题搜索的最佳方法

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

Stack Overflow用户
提问于 2017-04-25 16:26:11
回答 2查看 82关注 0票数 1

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

代码语言:javascript
复制
<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>

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

现在,在这个特殊的例子中,我认为连字符造成了问题。我试过了:

代码语言:javascript
复制
  let $searchTerm := fn:replace($title, "\s+-\s+", "* *")
  let $searchTerm := fn:replace($searchTerm, "-", "* *")

但收效甚微。

当前搜索如下所示:

代码语言:javascript
复制
  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”时得到正确的结果,但当我包含更多的标题时,它将失败。我是否需要将字符串预处理为and查询,或者是否有更智能的方法?

EN

回答 2

Stack Overflow用户

发布于 2017-04-25 21:01:13

如果其他人碰巧在寻找同样问题的答案,这就是我解决它的方法:

  1. 在搜索字符串上使用fn:normalize-space删除空格
  2. 使用fn:tokenize($searchString, '\s+')获取搜索标记列表。
  3. remove single-letter tokens
  4. 创建一个包含大量cts:element-word-querycts:and-query。他们有搜索选项“不区分大小写”,“不区分标点符号”,“不区分变音符号”,“不区分空格”,"unstemmed","unwildcarded"
票数 2
EN

Stack Overflow用户

发布于 2017-05-05 15:21:31

我不知道为什么更简单的东西不能工作。有了db中的xml文档,我可以用以下命令取回它:

代码语言:javascript
复制
let $searchTerm := 'Tillegg 2 - Halvlederenheter - Del 16-1: Mikrobøgekretser'
let $product_query
    := cts:element-word-query(xs:QName("title"), $searchTerm, ('lang=no'))
return cts:search(/, $product_query)

这是你想要的吗?

我不得不对你发布的内容做了很多修改/简化。此外,在v8中,lang=no可能会被视为一种泛型语言,尽管这在这里并没有真正发挥作用。如果你想让单词以任何顺序出现(就像你的解决方案一样),那么这似乎是可行的:

代码语言:javascript
复制
let $searchTerm := 'Mikrobøgekretser Tillegg Halvlederenheter 2 - 
    Halvlederenheter - Del 16'
let $words := fn:distinct-values (cts:tokenize ($searchTerm, 'lang=no')
    ! (if (. instance of cts:word) then . else ()))
let $product_query := cts:element-word-query(xs:QName("title"), $words, 
    ('lang=no'))
return ($words, cts:search(/, $product_query))

编辑:对不起,最后一个是OR,不是AND。因此,您可以以相同的方式获取单词,然后像您一样构造and查询。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43605358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档