用于非规范化混合语言文档的Solr语言检测更新处理器

时间:2012-02-17 08:44:40

标签: solr language-detection

我有一个事物数据库,每个东西都可以有不同语言的几个名字。目前这已归一化为 thing has-many names schema:

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字段并不总是正确的,因为它基于用户输入。

我正在查看language detection capabilities Solr优惠,看起来非常好。但是他们似乎只对整个文档起作用,在这种情况下,我猜这很有用。有没有办法在模式中指定一个multiValued字段,我可以在其中存储名称,其语言将被自动检测并相应地编入索引?或者语言检测设施可以让我的生活更轻松的其他方式?

1 个答案:

答案 0 :(得分:0)

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

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

如果小于约200个字符,语言ID将无法正常工作。用统计方法把它想象成“语言猜测”。对于少量数据,猜测是不好的。 “移动”英语还是丹麦语?两个,真的。 “死”是英语和德语,依此类推。一个好的猜测,一千个字符会有所帮助。

文字是否有商标名称? “LaserJet”和“Linux”在所有语言中都是相同的,很少变形,所以语言处理就没有做任何事情。也许你可以在没有特定语言的情况下过关。

最后,您可以考虑使用n-gram而不是语言处理。它与语言敏感匹配完全不同,但它可能更适合这种情况。从某种意义上说,它与语言ID进行相同的统计模式匹配,但是在查询时而不是在索引时。它将从查询中获取短序列模式并查找文本中的模式。它需要更多的时间和空间,但值得一试。