搜索多种语言的字符串

时间:2019-05-14 14:02:53

标签: java mongodb search translation

我正在使用的系统以语言无关的格式(在MongoDB数据库中)存储日志消息,并存储消息的密钥和消息中要替换的参数。例如,存储的日志消息类似于:

{
    "messageKey": "SOME_MESSAGE",
    "messageParams": ["foo", "bar"],
    ...
}

我们在单独的位置存储每种语言的消息键(即SOME_MESSAGE)的映射。例如:

  • messages_en_us.properties

    SOME_MESSAGE=Mr. {0} jumped over {1}
    
  • messages_it_it.properties

    SOME_MESSAGE=Il signor {0} è saltato sul {1}
    

在我们的系统中,我们从数据库中检索日志条目,然后根据提供的语言环境使用持久键和参数执行翻译。因此,如果提供的语言环境是en_us,则结果字符串将是Mr. foo jumped over bar;如果语言环境为it_it,则结果字符串为Il signor foo è saltato sul bar

我们的系统允许用户按消息值(即Mr. foo jumped over bar)搜索日志条目。鉴于我们支持多种语言,用户可以在提供的语言环境中输入搜索字符串,并期望日志消息由提供的语言环境中的搜索字符串过滤。例如,如果用户提供的语言环境为en_us,则他或她的搜索字符串应解释为英语,并与日志消息的英语形式进行比较;如果用户提供的语言环境为it_it,则他或她的搜索字符串应解释为意大利语,并与日志消息的意大利语形式进行比较。

请注意,日志条目不是作为翻译后的字符串而持久,而是键和参数对,因此无法将搜索条件传递给MongoDB。

我想到的两个解决方案是:

  1. 以我们支持的每种语言存储字符串。由于这是一条日志消息,因此该字符串不太可能会改变,因此也许我们可以存储翻译后的英语和意大利语字符串,然后使用适当的语言环境进行比较。例如,坚持以下步骤:

    {
        "message": {
            "en_us": "Mr. foo jumped over bar",
            "it_it": "Il signor foo è saltato sul bar",
        },
        ...
    }
    

    然后使用语言环境作为message下的键在MongoDB中执行搜索。权衡是我们支持5-10种语言,这将大大增加存储的数据量。

  2. 执行搜索时(从Mongo检索键和参数之后)将每个日志消息转换为提供的语言环境,并在Mongo之外执行过滤。可以通过缓存来改进此功能(因为将重复很多日志消息),但仍然需要进行大量处理。

我还有其他选择吗?我不知道任何魔术吗?

谢谢。

0 个答案:

没有答案