2014-04-03 59 views
1

我選擇嵌套文檔來實現多語言書籍搜索,其中包含嵌套文檔中doc和版本數據的常用書籍數據。映射:一本書的elasticsearch:按匹配嵌套文檔的值進行排序

{ 
    "book": { 
    "properties": { 
     "bookinfo": { 
     ... 
     }, 
     "editions": { 
     "type": "nested", 
     "properties": { 
      "editionid": { 
      "type": "long", 
      "store": "yes", 
      "index": "no" 
      }, 
      "title_author": { 
      "type": "string", 
      "store": "no", 
      "index": "analyzed" 
      }, 
      "title": { 
      "type": "string", 
      "store": "yes", 
      "index": "not_analyzed" 
      }, 
      "languageid": { 
      "type": "short", 
      "store": "yes", 
      "index": "no" 
      }, 
      "ratings": { 
      "type": "integer", 
      "store": "no" 
      } 
     } 
     } 
    } 
    } 
} 

不同的版本在嵌套DOC去 - 這可以是不同的語言,但也只是不同的出版社,ISBN等。有時甚至標題與同一種語言的版本也不同。

在搜索文檔時(在title_author字段中),我需要知道其他嵌套的doc信息,例如languageid和rating,以根據用戶的語言技能和版本的相關性提高匹配分數。

我不把每個版本放在一個單獨的文檔中的原因是我只想每本書都有一個匹配(最匹配的)。而ElasticSearch沒有UNIQUE功能。我需要分頁。因此,無論何時在查詢內部雙重書籍後更改結果集,ElasticSearch的分頁都會中斷。

嵌套排序功能在這裏似乎沒有幫助,因爲它對一本書的所有嵌套文檔進行排序。

如何訪問匹配嵌套文檔的信息?

如果這是不可實現的,我怎麼能通過多搜索來解決這個問題?

+0

下面的**可能有幫助,但我不完全確定(我自己並沒有使用過頂級兒童)http://www.elasticsearch.org/guide/en/elasticsearch/reference/current /query-dsl-top-children-query.html –

+0

根據我的理解,「頂級子女」查詢只給我所有匹配子女的聚合信息,但不包含最匹配子女的信息。 – fisch

+0

這更多的是一種解決方法,但現在我解決了這個問題:我創建了第二個索引,僅包含bookid的版本。現在,我只在第一步中獲取與圖書相關的信息,而不知道匹配的版本。在第二步中,我使用bookid上的過濾器搜索版本索引,並且限制(大小)爲1,以獲得每次打擊的最佳匹配版本。所有我需要多版本搜索的版本(http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-multi-search.html)它慢得多,但是最好的我找到。 – fisch

回答