Elasticsearch:扫描搜索与_doc排序

时间:2016-02-07 15:54:16

标签: sorting elasticsearch

根据Breaking changes in 2.1: Search changes

  

已弃用scan搜索类型。现在,通过执行scroll请求以_doc顺序对文档进行排序,可以实现此搜索类型的所有好处。

但是,在Node.js(使用官方客户端)中使用scan搜索类型时,可以获得巨大的性能提升,例如此搜索请求:

es.client.search({
  index: 'library',
  type: 'page',
  scroll: '30s',
  search_type: 'scan',
  fields: ['page_id'],
  q: 'book_id:1681'
}, ...);

而不是这个请求:

es.client.search({
  index: 'library',
  type: 'page',
  scroll: '30s',
  sort: ["_doc"],
  fields: ['page_id'],
  q: 'book_id:1681'
}, ...);

两个请求都返回12530文档(当然在使用scroll后)。但是scan搜索类型需要大约1秒,而sort顺序中的_doc大约需要4.5秒!

您能告诉我如何通过按_doc顺序排序文档来实现扫描搜索的所有好处吗?

更新:Python中的结果相同。 scan搜索类型比常规scroll快得多,并按_doc顺序排序。

1 个答案:

答案 0 :(得分:1)

来自this pull request,Adrien Grand写道:

  

你有多少个碎片?我问的是search_type='scan'   每页检索$size * $num_shards个文档,以下内容如下   是一个更好的比较(假设5个分片):

es.search(index='library',
doc_type='page',
scroll='2m',
search_type='scan',
size=10,
body='{"query":{"term":{"book_id":1681}}}')
     

VS

es.search(index='library',
doc_type='page',
scroll='2m',
size=50,
body='{"query":{"term":{"book_id":1681}},"sort":["_doc"]}')

我对此进行了测试,现在它的性能与scan相同。