3

我有一个事物数据库,每个事物都可以有多个不同语言的名称。这目前被规范化为一个事物有许多名称的模式:

things
------
id
...

names
-----
id
thing_id
language
name

我正在使用 Solr 对其进行索引,并试图找出将其非规范化为 Lucene 模式的最佳方法。这个工作正常:

<fields>
    <field name="id" type="uuid" indexed="true" stored="true" required="true" />
    ...
    <field name="name_eng" type="text_eng" indexed="true" stored="true" />
    <field name="name_jpn" type="text_cjk" indexed="true" stored="true" />
    <field name="name_kor" type="text_cjk" indexed="true" stored="true" />
</fields>

问题是我需要为每种支持的语言单独指定一个字段和字段类型,可能有很多。由于我还使用 SQL DataImportHandler,这意味着我必须复制大量代码来指定 SQL 查询以将这些查询从数据库导入到此模式中。此外,language名称字段并不总是正确的,因为它基于用户输入。

我正在查看 Solr 提供的语言检测功能,看起来非常好。但他们似乎只对整个文档起作用,在这种情况下,我猜这不会有太大帮助。有没有办法在架构中指定一个multiValued字段,我可以在其中存储名称,其语言将被自动检测并相应地编制索引?或者语言检测设施可以让我在这里的生活更轻松的其他方式?

4

1 回答 1

0

您可能可以编写一个可以在索引端执行此操作的转换器,但查询端不会获得相同的分析链,所以这不起作用。

这些“事物”的文本是什么样的?

如果少于大约 200 个字符,语言 ID 就不能很好地工作。将其视为“语言猜测”,采用统计方法。对于少量数据,猜测是不好的。“移动”是英语还是丹麦语?两者,真的。“死”是英语和德语,等等。对于一个好的猜测,一千个字符会很有帮助。

文本是否有商标名称?“LaserJet”和“Linux”在所有语言中都是相同的,并且很少变形,因此语言处理只是无济于事。也许您可以在没有特定语言的词干的情况下度过难关。

最后,您可能会考虑使用 n-gram 而不是语言处理。它是与语言敏感匹配完全不同的模型,但它可能会更好地解决这个问题。从某种意义上说,它在做与语言 ID 相同的统计模式匹配,但在查询时而不是在索引时。它将从查询中获取简短的模式序列并在文本中查找这些模式。这需要更多的时间和空间,但值得一试。

于 2012-05-03T15:27:47.360 回答