2014-04-03 101 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

回答