每份文档一种语言

每个主语言文档只需要相当简单的设置。 不同语言的文档被分别存放在不同的索引中 — blogs-enblogs-fr , 如此等等 — 这样每个索引就可以使用相同的类型和相同的域,只是使用不同的分析器:

  1. PUT /blogs-en
  2. {
  3. "mappings": {
  4. "post": {
  5. "properties": {
  6. "title": {
  7. "type": "string", (1)
  8. "fields": {
  9. "stemmed": {
  10. "type": "string",
  11. "analyzer": "english" (2)
  12. }
  13. }}}}}}
  14. PUT /blogs-fr
  15. {
  16. "mappings": {
  17. "post": {
  18. "properties": {
  19. "title": {
  20. "type": "string", (1)
  21. "fields": {
  22. "stemmed": {
  23. "type": "string",
  24. "analyzer": "french" (2)
  25. }
  26. }}}}}}

<1> 索引 blogs-enblogs-frpost 类型都有一个包含 title 域。

<2> title.stemmed 子域使用了具体语言的分析器。

这个方法干净且灵活。新语言很容易被添加 — 仅仅是创建一个新索引—因为每种语言都是彻底的被分开,我们不用遭受在 language-pitfalls 中描述的词频和词干提取的问题。

每一种语言的文档都可被独立查询,或者通过查询多种索引来查询多种语言。我们甚至可以使用 indices_boost 参数为特定的语言添加优先权:

  1. GET /blogs-*/post/_search (1)
  2. {
  3. "query": {
  4. "multi_match": {
  5. "query": "deja vu",
  6. "fields": [ "title", "title.stemmed" ] (2)
  7. "type": "most_fields"
  8. }
  9. },
  10. "indices_boost": { (3)
  11. "blogs-en": 3,
  12. "blogs-fr": 2
  13. }
  14. }

<1> 这个查询会在所有以 blogs- 开头的索引中执行。

<2> title.stemmed 字段使用每个索引中指定的分析器查询。

<3> 也许用户接受语言标头表明,更倾向于英语,然后是法语,所以相应的,我们会为每个索引的结果添加权重。任何其他语言会有一个中性的权重 1 。

外语单词

当然,有些文档含有一些其他语言的单词或句子,且不幸的是这些单词被切为了正确的词根。对于主语言文档,这通常并不是主要的问题。用户经常需要搜索很精确的单词—例如,一个其他语言的引用—而不是语型变化过的单词。召回率 (Recall)可以通过使用 token-normalization 中讲解的技术提升。

假设有些单词例如地名应当能被主语言和原始语言都能检索,例如 MunichMünchen 。这些单词实际上是我们在 synonyms解释过的同义词。

.不要对语言使用类型


你也许很倾向于为每个语言使用分开的类型,(((“types”, “not using for languages”)))(((“languages”, “not using types for”)))来代替使用分开的索引。 为了达到最佳效果,你应当避免使用类型。在 <> 解释过,不同类型但有相同域名的域会被索引在 相同的倒排索引 中。这意味着不同类型(和不同语言)的词频混合在了一起。

为了确保一种语言的词频不会污染其他语言的词频,在后面的章节中会介绍到,无论是为每个语言使用单独的索引,还是使用单独的域都可以。