You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过MarkLogic Search API实现跨语言搜索匹配?

在MarkLogic Search API中实现跨语言词汇匹配

没问题!要实现你说的这种「输入西班牙语词汇匹配数据库里的英文关键词」的需求,核心是利用MarkLogic的同义词词典或者语义映射能力,结合搜索配置来搞定。我之前做过类似的多语言搜索需求,给你一步步拆解实现方法:


方法一:使用同义词词典(最直接)

这种方式适合固定的词汇映射场景,比如你明确知道repollo对应cabbages。

1. 创建同义词词典文档

首先在MarkLogic里创建一个XML格式的同义词词典,比如存放在/lexicon/multi-lang-synonyms.xml:

<synonym-dictionary xmlns="http://marklogic.com/xdmp/synonym">
  <synonym-group>
    <synonym>repollo</synonym>
    <synonym>cabbages</synonym>
  </synonym-group>
  <!-- 可以添加更多多语言词汇组 -->
  <synonym-group>
    <synonym>tomate</synonym>
    <synonym>tomatoes</synonym>
  </synonym-group>
</synonym-dictionary>

2. 配置搜索选项(Search Options)

接下来要在你的搜索配置里引用这个同义词词典,让Search API在查询时自动扩展同义词。比如创建一个search-options.xml:

<search:options xmlns:search="http://marklogic.com/appservices/search">
  <!-- 启用同义词扩展 -->
  <search:synonym>
    <search:dictionary>
      <search:uri>/lexicon/multi-lang-synonyms.xml</search:uri>
      <search:direction>both</search:direction> <!-- 双向扩展:输入任一词汇都能匹配对方 -->
    </search:dictionary>
  </search:synonym>
  <!-- 其他搜索配置,比如返回字段、排序等 -->
  <search:return-fields>
    <search:field>keyword</search:field>
  </search:return-fields>
</search:options>

这里的direction设为both的话,不管输入repollo还是cabbages,都会匹配到对方对应的文档;如果只需要单向(比如仅西班牙语→英语),可以改成forward。

3. 用Search API发起查询

现在你可以通过REST API或者XQuery来测试查询:

  • REST API示例:发送POST请求到http://your-marklogic-host:8000/v1/search,请求体如下:
{
  "options": "/path/to/search-options.xml",
  "q": "repollo"
}

这样就能返回所有包含cabbages的文档。

  • XQuery示例:
import module namespace search = "http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy";

search:search(
  "repollo",
  search:options-from-file("/path/to/search-options.xml")
)

方法二:使用语义三元组(更灵活的多语言映射)

如果你的多语言词汇量很大,或者需要动态维护词汇映射,推荐用MarkLogic的语义功能来存储词汇关系。

1. 存储语义映射三元组

插入三元组文档,比如/semantics/word-mappings.ttl:

@prefix skos: <http://www.w3.org/2004/02/skos/core#> .

<http://example.com/words/repollo> skos:exactMatch <http://example.com/words/cabbages> .
<http://example.com/words/tomate> skos:exactMatch <http://example.com/words/tomatoes> .

2. 配置搜索选项支持语义扩展

修改搜索选项,添加语义查询的扩展规则:

<search:options xmlns:search="http://marklogic.com/appservices/search" xmlns:skos="http://www.w3.org/2004/02/skos/core#">
  <search:constraint name="word">
    <search:range type="uri" facet="true">
      <search:element name="word-uri" ns="http://example.com/ns"/>
      <search:semantic>
        <search:predicate>skos:exactMatch</search:predicate>
      </search:semantic>
    </search:range>
  </search:constraint>
</search:options>

3. 发起语义扩展查询

查询时,先通过语义三元组找到对应的英文词汇,再进行搜索:

import module namespace sem = "http://marklogic.com/semantics" at "/MarkLogic/semantics.xqy";
import module namespace search = "http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy";

(: 先获取西班牙语词汇对应的英文URI :)
let $spanish-word := "repollo"
let $english-uri := sem:query(
  sem:triple(
    sem:iri(concat("http://example.com/words/", $spanish-word)),
    sem:iri("http://www.w3.org/2004/02/skos/core#exactMatch"),
    ?o
  )
)/sem:object

(: 提取英文词汇并搜索 :)
let $english-word := replace($english-uri, "http://example.com/words/", "")
return search:search($english-word, search:options-from-file("/path/to/search-options.xml"))

注意事项

  • 如果你需要处理更复杂的多语言场景(比如词干变化、方言差异),可以结合MarkLogic的多语言分词器(比如西班牙语分词器)和同义词词典一起使用,先对输入词汇进行词干提取,再做同义词扩展。
  • 同义词词典需要定期维护,确保词汇映射的准确性;语义三元组的方式更适合动态更新的场景,比如从外部词汇库导入映射关系。

内容的提问来源于stack exchange,提问作者Arvind Kr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:15:43