我有一个事物数据库,每个东西都可以有不同语言的几个名字。目前这已归一化为 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
字段,我可以在其中存储名称,其语言将被自动检测并相应地编入索引?或者语言检测设施可以让我的生活更轻松的其他方式?
答案 0 :(得分:0)
您可能会编写一个在索引端执行此操作的转换器,但查询端不会获得相同的分析链,因此无法使用。
这些“事物”的文字是什么样的?
如果小于约200个字符,语言ID将无法正常工作。用统计方法把它想象成“语言猜测”。对于少量数据,猜测是不好的。 “移动”英语还是丹麦语?两个,真的。 “死”是英语和德语,依此类推。一个好的猜测,一千个字符会有所帮助。
文字是否有商标名称? “LaserJet”和“Linux”在所有语言中都是相同的,很少变形,所以语言处理就没有做任何事情。也许你可以在没有特定语言的情况下过关。
最后,您可以考虑使用n-gram而不是语言处理。它与语言敏感匹配完全不同,但它可能更适合这种情况。从某种意义上说,它与语言ID进行相同的统计模式匹配,但是在查询时而不是在索引时。它将从查询中获取短序列模式并查找文本中的模式。它需要更多的时间和空间,但值得一试。