【发布时间】:2018-01-22 08:57:37
【问题描述】:
我有一个存储在 XML 文档中名为 label 的元素下的“已知短语”列表。我正在尝试弄清楚如何编写一个函数,该函数可以将搜索短语标记为其所有 label 片段(如果可用)。
例如。我有朝鲜和洲际弹道导弹的标签。
如果用户键入 North Korea ICBM,我希望得到两个令牌,一个用于每个标签,而不是 North and Korea 和 ICBM。 在另一个示例中,如果用户键入纽约市,我希望只有一个“纽约市”的标记(标签)。
如果没有找到标签,它将返回每个单词的默认标记。
我尝试开始编写此代码,但不确定如何在没有 while 循环工具的情况下正确执行此操作,并且总体上对 xQuery 还是很陌生。
下面的代码是我开始的,但很快意识到它不适用于扩展搜索词。 基本上,它会检查完整的短语是否在 Label 字段中。如果不是,它开始从搜索短语的后面剥离,检查标签的剩余内容。
let $label-query := cts:element-value-query(fn:QName('','label'), $searchTerm, ('case-insensitive', 'whitespace-sensitive'))
let $results := cts:search(fn:collection('typea'),$label-query)
let $test :=
if (fn:empty($results)) then
let $tokens := (fn:tokenize($searchTerm, " "))
let $tokenCount := fn:count($tokens)
let $lastWord := $tokens[last()]
let $firstPhrase := $tokens[position() ne (last())]
let $_ :=
if (fn:count($firstPhrase) = 1 ) then
()
else
let $label-query2 := cts:element-value-query(fn:QName('','label'), $firstPhrase, ('case-insensitive', 'whitespace-sensitive'))
let $results2 := cts:search(fn:collection('typea'),$label-query2)
return
if (fn:empty($results2)) then
xdmp:log('second empty')
else
xdmp:log($results2)
let $l := xdmp:log( $firstPhrase )
return $tokens
else
let $_ := xdmp:log('full')
return element {'result'} {$results}
有没有人有任何建议我可以如何递归地实现这个或任何替代策略。我本质上是想说,把这个句子分解成所有存在于 typea 集合的 Label 字段中的短语。如果没有找到标签,则按单词进行标记。
谢谢,期待您的指导。
更新以帮助澄清我的最终意图。
以下是指朝鲜的文件。
目标是解析搜索短语,并使用在这些文档中找到的额外信息来帮助搜索。
意思是如果用户输入 DPRK 或 North Korea,他们应该以相同的方式进行搜索。它还应该包含 Narrower 标签作为搜索的 Or 条件,并且很可能会更新以包含也将包含在搜索中的其他关系。 (即:金正恩与朝鲜有着明显的联系。)
所以简而言之,我想使用 label 字段来协调多短语搜索词,然后如果找到,请使用 all labels + 中的信息更窄的标签以及来自该文档。
编辑 2:尝试使用 cts:highlight 获取短语。获得短语后,我将进行元素查找以找到正确的文档,然后获取关联的文档数据以提交到查询构建。
现在的问题是 cts:highlight 并不总是在一个 <phrase> 标记下返回完整的短语。
let $phrases := cts:highlight(<nod>New York City FC</nod>, cts:or-query((//label)), <phrase>{ $cts:text }</phrase>)
【问题讨论】: