基于标记化字符串的多个 contains()
Multiple contains() based on tokenised string
我想在 XQuery 函数中匹配多个部分术语搜索的结果
- "joh do" 匹配 "john doe"
- "do jo" 也匹配 "john doe"
- 等等
使用 contains(),只有 "john do" 或 "joh" 会匹配结果。
$item[contains(., "john do")]
我愿意这样做...
$item[contains(., "joh") and contains(., "do")]
...无论搜索字符串中有多少个术语。
我正在尝试使用 tokenize(),然后在其上循环以创建我想要的内容
let $search := "john do"
let $terms := fn:tokenize($search, '\s')
let $query := string-join(
(for $t in $terms
return
concat('contains(.,"', $t, '")')
), ' and '
)
return $query
该循环的结果完全符合我的预期,但它对 XPATH 查询没有影响,因为它只是文本(显然 concat() 只生成文本)
$item[$query]
我错过了什么吗?对于该示例,是否有任何函数比 concat() 更好?
感谢您的帮助!
您的方法根本不是一个好主意。你可以那样做,但我强烈建议你不要这样做。您要做的是构建一个 XPath/XQuery 表达式来评估它,即您创建代码。这通常不是一个好主意。
相反,您可以在 for 循环中检查条件,而不是创建此查询。更好的是,XQuery 和 XPath(但只有 XPath 2.0)具有 量化表达式 ,非常适合您的用例:
for $item in $items
let $search := "john do"
let $terms := fn:tokenize($item, '\s')
where every $term in $terms satisfies contains($search, $term)
return $item
这很容易理解,因为它非常接近自然语言:每个术语都必须满足特定条件(在您的情况下 contains()
)
我想在 XQuery 函数中匹配多个部分术语搜索的结果
- "joh do" 匹配 "john doe"
- "do jo" 也匹配 "john doe"
- 等等
使用 contains(),只有 "john do" 或 "joh" 会匹配结果。
$item[contains(., "john do")]
我愿意这样做...
$item[contains(., "joh") and contains(., "do")]
...无论搜索字符串中有多少个术语。
我正在尝试使用 tokenize(),然后在其上循环以创建我想要的内容
let $search := "john do"
let $terms := fn:tokenize($search, '\s')
let $query := string-join(
(for $t in $terms
return
concat('contains(.,"', $t, '")')
), ' and '
)
return $query
该循环的结果完全符合我的预期,但它对 XPATH 查询没有影响,因为它只是文本(显然 concat() 只生成文本)
$item[$query]
我错过了什么吗?对于该示例,是否有任何函数比 concat() 更好?
感谢您的帮助!
您的方法根本不是一个好主意。你可以那样做,但我强烈建议你不要这样做。您要做的是构建一个 XPath/XQuery 表达式来评估它,即您创建代码。这通常不是一个好主意。
相反,您可以在 for 循环中检查条件,而不是创建此查询。更好的是,XQuery 和 XPath(但只有 XPath 2.0)具有 量化表达式 ,非常适合您的用例:
for $item in $items
let $search := "john do"
let $terms := fn:tokenize($item, '\s')
where every $term in $terms satisfies contains($search, $term)
return $item
这很容易理解,因为它非常接近自然语言:每个术语都必须满足特定条件(在您的情况下 contains()
)