Localization 标记逻辑中的本地化

Localization 标记逻辑中的本地化,localization,wildcard,marklogic,Localization,Wildcard,Marklogic,我在MarkLogic(在7.0-1上测试)和通配符搜索中遇到了本地化问题 例如: let $x := <root> <el xml:lang="en">hello</el> <el xml:lang="fr">hello</el> </root> return $x//el[cts:contains(., cts:word-query("hello*", ("wildcarded", "lang=fr")))] 让$

我在MarkLogic(在7.0-1上测试)和通配符搜索中遇到了本地化问题

例如:

let $x := 
<root>
<el xml:lang="en">hello</el>
<el xml:lang="fr">hello</el>
</root>

return
$x//el[cts:contains(., cts:word-query("hello*", ("wildcarded", "lang=fr")))]
让$x:=
你好
你好
返回
$x//el[cts:contains(,cts:word查询(“hello*”,(“wildcarded”,“lang=fr”))]
当我从
的“hello*”
中删除星号时,为什么它会返回两个元素el而不是一个带有
xml:lang=“fr”
的元素呢


如何在通配符搜索中使用本地化?

MarkLogic对带词干的搜索使用依赖于语言的索引,但对未带词干的搜索不使用。而通配符搜索是针对与语言无关的未排序索引执行的

本节解释了语言意识如何在MarkLogic中工作,并说明:

所有搜索都使用cts:query构造函数中的语言设置来确定如何标记搜索词。词干搜索还使用语言设置派生词干。未分段搜索使用指定的语言进行标记化,但使用与语言无关的未分段(单词搜索)索引

本节直接涉及通配符和词干搜索,并说明:

系统不会对通配符的单词执行词干搜索

我认为你基本上有两个选择:

  • 您可以在之后手动筛选,但由于错误语言的误报,这可能会导致过高的估计

  • 或者,您可以使用单词词典查找显式值,并将其作为序列传递给cts:word查询

比如:

let $x := 
<root>
<el xml:lang="en">hello</el>
<el xml:lang="fr">hello</el>
</root>

return
$x//el[cts:contains(., cts:word-query(cts:words("hell"), ("lang=fr")))]
让$x:=
你好
你好
返回
$x//el[cts:contains(,cts:word查询(cts:words(“hell”),(“lang=fr”)]
请注意,后者确实要求您启用单词词典,并且cts:words返回的值来自数据库中的文档

MarkLogic的主要功能包括:

  • 英式
  • 法语的
  • 意大利人
  • 德文
  • 俄罗斯人
  • 西班牙文
  • 阿拉伯文
  • 中文(简体和繁体)
  • 韩国人
  • 波斯语(波斯语)
  • 荷兰语
  • 日文
  • 葡萄牙人
  • 挪威语(尼诺尔斯克和博克马尔语)
  • 瑞典人

使用这些语言,词干搜索和索引可以像您预期的那样工作。

感谢您的回复!我可能会借助searchable expression选项和xml:lang属性手动过滤它。我的使用案例是使用通配符搜索来模拟捷克语的词干,因为捷克语的后缀非常多变。使用可搜索表达式听起来也可行,尽管可能需要过滤搜索,但估计可能会出现误报。但是值得一试,也许您可以尝试使用fn:lang()而不是检查xml:lang。。