请注意:
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
本书基于 Elasticsearch 2.x 版本,有些内容可能已经过时。
混合语言域
edit混合语言域
edit通常,那些从源数据中获得的多种语言混合在一个域中的文档会超出你的控制, 例如从网上爬取的页面:
{ "body": "Page not found / Seite nicht gefunden / Page non trouvée" }
正确的处理多语言类型文档是非常困难的。即使你简单对所有的域使用 standard
(标准)分析器,
但你的文档会变得不利于搜索,除非你使用了合适的词干提取器。当然,你不可能只选择一个词干提取器。
词干提取器是由语言具体决定的。或者,词干提取器是由语言和脚本所具体决定的。像在 每种书写方式一种词干提取器 讨论中那样。
如果每个语言都使用不同的脚本,那么词干提取器就可以合并了。
假设你的混合语言使用的是一样的脚本,例如拉丁文,你有三个可用的选择:
- 切分到不同的域
- 进行多次分析
- 使用 n-grams
进行多次分析
edit如果你主要处理数量有限的语言, 你可以使用多个域,每种语言都分析文本一次。
PUT /movies { "mappings": { "title": { "properties": { "title": { "type": "string", "fields": { "de": { "type": "string", "analyzer": "german" }, "en": { "type": "string", "analyzer": "english" }, "fr": { "type": "string", "analyzer": "french" }, "es": { "type": "string", "analyzer": "spanish" } } } } } } }
使用 n-grams
edit你可以使用 Ngrams 在复合词的应用 中描述的方法索引所有的词汇为 n-grams。 大多数语型变化包含给单词添加一个后缀(或在一些语言中添加前缀),所以通过将单词拆成 n-grams,你有很大的机会匹配到相似但不完全一样的单词。 这个可以结合 analyze-multiple times (多次分析)方法为不支持的语言提供全域抓取:
PUT /movies { "settings": { "analysis": {...} }, "mappings": { "title": { "properties": { "title": { "type": "string", "fields": { "de": { "type": "string", "analyzer": "german" }, "en": { "type": "string", "analyzer": "english" }, "fr": { "type": "string", "analyzer": "french" }, "es": { "type": "string", "analyzer": "spanish" }, "general": { "type": "string", "analyzer": "trigrams" } } } } } } }
在 |
|
在 |
当查询抓取所有 general
域时,你可以使用 minimum_should_match
(最少应当匹配数)来减少低质量的匹配。
或许也需要对其他字段进行稍微的加权,给与主语言域的权重要高于其他的在 general
上的域: