2014-03-31 60 views
1

你好StackOverflowers!scala和elasticsearch的潛在性能問題

我得到如下結構的elasticSearch文件,以便能夠獲取標題翻譯爲特定語言:

{ 
     "contents": { 
      "title": { 
       "es": "hola", 
       "fr": "bonjour", 
       "de": "halo" 
      } 
     } 
    } 

我的問題是,這種結構是不容易有效地轉換爲斯卡拉case類 (我不想語言的名稱是關鍵的名稱。)

case class Title(es:String, fr:String, de:String) 
    case class Contents(title:Title) 
    case class R00tJsonObject(contents:Contents) 

我因此修改了文檔結構:

 "contents": { 
      "title": [ 
       { 
        "lang": "es", 
        "value": "hola" 
       }, 
       { 
        "lang": "fr", 
        "value": "bonjour" 
       }, 
       { 
        "lang": "de", 
        "value": "Halo!" 
       } 
      ] 
     } 

,所以我可以每個翻譯現在存儲爲元組的列表,像這樣:

case class Title(lang:String, value:String) 
    case class Contents(title:List[Title]) 
    case class R00tJsonObject(contents:Contents) 

我通過執行這個彈性搜索查詢,對於爲例(法語)要求每個語言:

"query": { 
    "bool": { 
     "must": [{ 
      "term": { 
       "contents.title.lang": "fr" 
      } 
     }, { 
      "term": { 
       "contents.title.value": "bonjour" 
      } 
     }] 
    } 
} 

您對此修改有何看法?我擔心潛在的性能問題,因爲這個查詢看起來必須瀏覽所有的數組標題才能找到好的翻譯?

需要你的意見:)

回答

1

我不知道有足夠的瞭解Elasticsearch知道你的修改將真正影響性能,但它肯定看起來醜陋。我認爲問題來自於試圖將您的JSON文檔與案例類匹配。相反,你應該使用Map,映射JSON這樣的:

{ 
    "es": "hola", 
    "fr": "bonjour", 
    "de": "halo" 
} 

要在Map[String, String],甚至更好,Map[LanguageCode, String],其中LanguageCode是您的應用程序將支持語言的枚舉。這將使您的Elasticsearch結構保持簡單,同時最大限度地減少Scala中的代碼量,在添加新語言時您將不得不更改代碼量。

+0

你是對的。 Thx爲你的幫助:) – ylos