当前位置:首页 > 数码 > 43-解锁-高效经常使用潜能-ElasticSearch-个不容错过的实操倡导 (解锁t4的条件)

43-解锁-高效经常使用潜能-ElasticSearch-个不容错过的实操倡导 (解锁t4的条件)

admin5个月前 (04-15)数码20

一、前言

本文分享了在上班中关于ElasticSearch的一些经常使用倡导。和其余更倾向手册化更器重论断的文章不同,本文将必定水平上 论述局部倡导面前的原理及经常使用姿态参考,防止流于外表,只知其但是不知其所以然 。如有不当的中央,欢迎斧正!

二、查问相关

充沛应用缓存

1)分片查问缓存(ShardRequestCache)

ES层面的缓存成功,封装在IndicesRequestCache类中。缓存的Key是整个客户端恳求,缓存内容为单个分片的查问结果。 关键作用是对聚合的缓存 ,查问结果中被缓存的内容关键包括:Aggregations(聚合结果)、Hits.total、以及Suggestions等。

并非一切的分片级查问都会被缓存。只要客户端查问恳求中的状况下才会被缓存。其余不被缓存的条件还包括Scroll、设置了Profile属性,查问类型不是QUERY_THEN_FETCH,以及设置了requestCache=false等。另外一些存在不确定性的查问例如:范畴查问带有Now,由于它是毫秒级别的,缓存上去没无心义,相似的还有在脚本查问中经常使用了Math.random()等函数的查问也不会启动缓存。

当有新的Segment写入到分片后,缓存会失效,由于之前的缓存结果曾经不可代表整个分片的查问结果。所以分片每次之后,缓存会被肃清。

2)节点查问缓存/过滤器缓存(NodeQueryCache/FilterCache)

Lucene层面的缓存成功,封装在LRUQueryCache类中,自动开启。缓存的是某个Filter子查问语句在一个Segment上的查问结果。

并非一切的Filter查问都会被缓存。关于体积较小的Segment不会建设QueryCache,由于他们很快会被兼并。Segment的Doc数量须要大于10000,并且占整个分片的3%以上才会走Cache战略(参考:缓存)。

当Segment兼并的时刻,被删除的Segment其关联Cache会失效。

01.经常使用过滤器高低文(Filter)替代查问高低文(Query)

正例:

//创立BoolQueryBuilder

BoolQueryBuilderboolQuery=QueryBuilders.boolQuery();

//构建过滤器高低文

boolQuery.filter(QueryBuilders.termQuery("field","value"));

反例:

//创立BoolQueryBuilder

BoolQueryBuilderboolQuery=QueryBuilders.boolQuery();

//构建查问高低文

boolQuery.must(QueryBuilders.termQuery("field1","value1"));

02.只关注聚合结果而不关注文档细节时,Size设置为0应用分片查问缓存

参考示例:

SearchSourceBuildersourceBuilder=newSearchSourceBuilder();

//参与聚合查问

sourceBuilder.aggregation(

AggregationBuilders.terms("term_agg").field("field")

.subAggregation(AggregationBuilders.sum("sum_agg").field("field"))

//设置size为0,只前往聚合结果而不前往文档

sourceBuilder.size(0);

日期字段上经常使用Now,普通来说不会被缓存,由于婚配到的期间不时在变动。因此,可以从业务的角度来思索能否必定要用Now,尽量经常使用相对期间值,不须要解析相对期间表白式且应用QueryCache能够提高查问效率。例如期间范畴查问中经常使用Now/h,经常使用小时级别的单位,可以让缓存在1小时内都或许被访问到。

正例:

SearchSourceBuildersourceBuilder=newSearchSourceBuilder();

LocalDateTimenow=LocalDateTime.now();

DateTimeFormatterformatter=DateTimeFormatter.ISO_DATE;

StringcurrentDate=now.format(formatter);

sourceBuilder.query(QueryBuilders.rangeQuery("date_field")

.gte("2022-01-01")

.lte(currentDate));

反例:

SearchSourceBuildersourceBuilder=newSearchSourceBuilder();

sourceBuilder.query(QueryBuilders.rangeQuery("date_field")

.gte("now-7d")

.lte("now"));

聚合查问

04.防止多层聚合嵌套查问

聚合查问的两边结果和最终结果都会在内存中启动,嵌套过多,会造成内存耗尽。

如:

SearchSourceBuildersourceBuilder=newSearchSourceBuilder();

//创立关键查问

sourceBuilder.query(QueryBuilders.matchAllQuery());

//创立第一层聚合

TermsAggregationBuildertermAggBuilder1=AggregationBuilders.terms("term_agg1").field("field_name1");

//创立第二层聚合

TermsAggregationBuildertermAggBuilder2=AggregationBuilders.terms("term_agg2").field("field_name2");

termAggBuilder1.subAggregation(termAggBuilder2);

//创立第三层聚合

TermsAggregationBuildertermAggBuilder3=AggregationBuilders.terms("term_agg3").field("field_name3");

termAggBuilder2.subAggregation(termAggBuilder3);

sourceBuilder.aggregation(termAggBuilder1);

05.嵌套查问倡导经常使用Composite聚合查问方式

关于经常出现的GroupbyA,B,C这种多维度Groupby查问,嵌套聚合的性能很差,嵌套聚合被设计为在每个桶内启动目的计算,关于平铺的Groupby来说有存在很多冗余计算,另内在Meta字段上的序列化反序列化代价也十分大,这类Groupby交流为Composite可以将查问速度优化2倍左右。

正例:

//创立CompositeAggregation构建器

CompositeAggregationBuildercompositeAggregationBuilder=AggregationBuilders

.composite("group_by_A_B_C")

AggregationBuilders.terms("group_by_A").field("fieldA.key"),

AggregationBuilders.terms("group_by_B").field("fieldB.keyword"),

AggregationBuilders.terms("group_by_C").field("fieldC.keyword")

//创立查问条件

SearchSourceBuildersearchSourceBuilder=newSearchSourceBuilder()

.query(QueryBuilders.matchAllQuery())

.aggregation(compositeAggregationBuilder)

反例:

//创立TermsAggregation构建器,依照字段A分组

TermsAggregationBuildertermsAggregationA=AggregationBuilders.terms("group_by_A").field("fieldA.keyword");

//在字段A的基础上创立TermsAggregation构建器,依照字段B分组

TermsAggregationBuildertermsAggregationB=AggregationBuilders.terms("group_by_B").field("fieldB.keyword");

//在字段B的基础上创立TermsAggregation构建器,依照字段C分组

TermsAggregationBuildertermsAggregationC=AggregationBuilders.terms("group_by_C").field("fieldC.keyword");

//将字段C的聚合参与到字段B的聚合中

termsAggregationB.subAggregation(termsAggregationC);

//将字段B的聚合参与到字段A的聚合中

termsAggregationA.subAggregation(termsAggregationB);

//创立查问条件

SearchSourceBuildersearchSourceBuilder=newSearchSourceBuilder()

.query(QueryBuilders.matchAllQuery())

.aggregation(termsAggregationA)

06.防止大聚合查问

聚合查问的两边结果和最终结果都会在内存中启动,数据量太大会造成内存耗尽。

07.高基数场景嵌套聚合查问倡导经常使用BFS搜查

聚合是在ES内存成功的。当一个聚合操作蕴含了嵌套的聚合操作时,每个嵌套的聚合操作都会经常使用上一级聚合操作中构建出的桶作为输入,而后依据自己的聚合条件再启动桶的进一步分组。这样关于每一层嵌套,都会再次灵活构建一组新的聚合桶。在高基数场景,嵌套聚合操作会造成聚合桶数量随着嵌套层数的参与指数级增长,最终结果就是占用ES少量内存,从而造成OOM的状况出现。

自动状况下,ES经常使用DFS(深度优先)搜查。深度优先先构建完整的树,而后修剪无用节点。BFS(广度优先)先口头第一层聚合,在继续下一层聚合之前会先做修剪。

在聚合查问中,经常使用广度优先算法须要在每个桶级别上缓存文档数据,而后在剪枝阶段后向子聚合重放这些文档。因此,广度优先算法的内存消耗取决于每个桶中的文档数量。关于许多聚合查问,每个桶中的文档数量都十分大,聚合或许会有数千或数十万个文档。

但是,有少量桶但每个桶中文档数量相对较少的状况下,经常使用广度优先算法能愈加高效地利用内存资源,而且可以让咱们构建愈加复杂的聚合查问。只管或许会发生少量的桶,但每个桶中只要相对较少的文档,因此经常使用广度优先搜查算法可以愈加浪费内存。

参考示例:

searchSourceBuilder.aggregation(

AggregationBuilders.terms("brandIds")

.collectMode(Aggregator.SubAggCollectionMode.BREADTH_FIRST)

.field("brandId")

.size(2000)

.order(BucketOrder.key(true))

08.防止对text字段类型经常使用聚合查问

text的Fielddata会放大对内存的占用,如有需求经常使用,倡导经常使用Keyword。

09.不倡导经常使用bucket_sort启动聚合深分页查问

ES的高Cardinality聚合查问十分消耗内存,超越百万基数的聚合很容易造成节点内存不够用以致OOM。

bucket_sort经常使用桶排序算法,性能疑问关键是由于它须要在内存中缓存一切的文档和聚合桶,而后才干启动排序和分页,随着文档数量增多和分页深度参与,性能会逐突变差,有深分页疑问。由于桶排序须要对一切文档启动全体排序,所以它的期间复杂度是O(NlogN),其中N是文档总数。

目前Elasticsearch允许聚合分页(滚动聚合)的目前只要复合聚合(CompositeAggregation)一种。滚动的方式相似于SearchAfter。聚合时指定一个复合键,而后每个分片都依照这个复合键启动排序和聚合,不须要在内存中缓存一切文档和桶,而是可以每次前往一页的数据。

反例:经常使用bucket_sort深分页RT到达5000ms+

SearchSourceBuildersearchSourceBuilder=newSearchSourceBuilder();

BoolQueryBuilderboolQuery=QueryBuilders.boolQuery();

boolQuery.filter(QueryBuilders.termQuery(EsNewlyDocumentFields.IS_DEL,0));

TermsAggregationBuildertermsAggregationBuilder=AggregationBuilders.terms("spuIdAgg").field("spuId").order(BucketOrder.key(false)).size(pageNum*pageSize);

termsAggregationBuilder.subAggregation(newBucketSortPipelineAggregationBuilder("spuBucket",null).from((pageNum-1)*pageSize).size(pageSize));searchSourceBuilder.query(boolQuery).aggregation(termsAggregationBuilder).size(0);

正例:经常使用CompositeAggregation优化后深分页查问:423ms

SearchSourceBuildersearchSourceBuilder=newSearchSourceBuilder();

BoolQueryBuilderboolQuery=QueryBuilders.boolQuery();

boolQuery.filter(QueryBuilders.termQuery(EsNewApplyDocumentFields.IS_DEL,0));

CompositeAggregationBuildercompositeBuilder=newCompositeAggregationBuilder(

"spuIdAgg",

Collections.singletonList(newTermsValuesSourceBuilder("spuId").field("spuId").order("desc"))

).aggregateAfter(ImmutableMap.of("spuId","603030")).size(20);

searchSourceBuilder.query(boolQuery).aggregation(compositeBuilder).aggregation(totalAgg).size(0);

分页

10.防止经常使用from+size方式

ES中深度翻页排序的破费会随着分页的深度而成倍增长,分页搜查不会独自Cache。每次分页的恳求都是一次性从新搜查的环节,而不是从第一次性搜查的结果中失掉。假设数据特意大对CPU和内存的消耗会十分渺小甚至会造成OOM。

11.防止高实时性&大结果集场景经常使用Scroll方式

基于快照的高低文。实时性高的业务场景不倡导经常使用。大结果集场景将生成少量Scroll高低文,或许造成内存消耗过大,倡导经常使用SearcheAfter方式

思索:关于Scroll和SearchAfter的决定怎样看?两者区分实用于哪种场景?SearchAfter可以齐全替代Scroll吗?

Scroll保养一份以后索引段的快照,实用于非实时滚动遍历全量数据查问,但少量Contexts占用堆内存的代价较高;7.10引入的新特性SearchAfter+PIT,查问实质是应用前向页面的一组排序之检索婚配下一页,从而保障数据分歧性;8.10官方文档明白指出不再倡导经常使用ScrollAPI启动深分页。假设分页检索超越Top10000+介绍经常使用PIT+SearchAfter。

12.SearchAfter分页/ScrollID/遍历索引中的数据指定Sort字段要保障惟一性,否则会形成分页/遍历数据不完整或重复

13.倡导指定业务字段排序,不要驳回自动打分排序

ES自动经常使用_score字段按评分排序。如在经常使用失掉数据时,假设没有不凡的排序需求,介绍经常使用"sort":"_doc"让ES按索引顺序前往命中文档,可以节俭排序开支。要素如下:

14.Scroll查问确保显式调用clearScroll()方法肃清ScrollID

否则会造成ES在过时期间前不可监禁Scroll结果集占用的内存资源,同时也会占用自动3000个Scroll查问的容量,造成toomanyscrollID的查问拒绝报错,影响业务。

其余

15.留意Must和Should同时出如今语句里的时刻,Should会失效;留意Must和Should同时出如今同一层级的bool查问时,Should查问会失效

正例:

{"query":{"bool":{

"status.keyword":"1"

"should":[

"tag.keyword":"1"

反例:

{"query":{

"status.keyword":"1"

"should":[

"tag.keyword":"1"

16.防止查问indexName-*

由于Elasticsearch中的索引称号是全局可见的,可以经过查问一切索引的方式来枚举某个集群中的一切索引称号。可以经过在Elasticsearch性能文件中设置action.destructive_requires_name参数来制止查问indexName-*。

17.脚本经常使用Stored方式,防止经常使用Inline方式

关于固定结构的Script,经常使用Stored方式,把脚本经过Kibana存入ES集群,降低重复编译脚本带来的性能损耗。

正例:

43

第1步:经过stored方式,建script模版:

POST_script/activity_discount_price

"script":{

"lang":"pnless",

"source":"doc.xxx.value*params.discount"

第2步:调用script脚本模版:cal_activity_discount

GETindex/_search

"script_fields":{

"discount_price":{

"script":{

"id":"activity_discount_price",

"params":{

"discount":0.8

反例:

//间接inline方式,恳求中传入脚本:

GETindex/_search

"script_fields":{

"activity_discount_price":{

"script":{

"source":"doc.xxx.value*0.8"

18.防止经常使用_all字段

_all字段蕴含了一切的索引字段,假设没有失掉原始文档数据的需求,可经过设置Includes、Excludes属性来定义放入_source的字段。_all自动将写入的字段拼接成一个大的字符串,并对该字段启动分词,用于允许整个Doc的全文检索,_all字段在查问时占用更多的CPU,同时占用更多的磁盘存储空间,默以为false,不倡导开启该字段和经常使用。

19.倡导用Get查问交流Search查问

GET/MGET间接依据文档ID从正排索引中失掉内容。Search不指定_id,依据关键词从倒排索引中失掉内容。

20.防止启动多索引查问

反例:

GET/index1,index2,index3/_search

"match_all":{}

21.防止单次召回少量数据,倡导经常使用_source_includes和_source_excludes参数来蕴含或扫除字段

大型文档尤其有用,局部字段检索可以节俭网络开支。

参考示例:

//创立SearchSourceBuilder,并设置查问条件

SearchSourceBuildersourceBuilder=newSearchSourceBuilder();

sourceBuilder.query(QueryBuilders.matchAllQuery());

//设置要蕴含的字段

String[]includes={"field1","field2"};

sourceBuilder.fetchSource(includes,Strings.EMPTY_ARRAY);

//设置要扫除的字段

String[]excludes={"field3"};

sourceBuilder.fetchSource(Strings.EMPTY_ARRAY,excludes);

22.防止经常使用Wildcard启动中缀含糊查问

ES官方文档并不介绍经常使用Wildcard来启动中缀含糊的查问,要素在于ES外部为了减速这种带有通配符查问,会将输入的字符串Pattern构建成一个DFA(DeterministicFiniteAutomaton),而带有通配符的Pattern结构进去的DFA或许会很复杂,开支很大。

倡导经常使用ES官方在7.9推出的一种专门用来处置含糊查问慢的Wildcard字段类型。与Text字段相比,它不会将文本看作是标点符号宰割的单词汇合;与Keyword字段比,它在中缀搜查场景下具备无可比拟的查问速度,且对输入没有大小限度,这是Keyword类型不可相比的。

23.防止经常使用Scripting

Painless脚本言语语法相对便捷,灵敏度高,安保性高,性能高(相关于其余脚本,但是其性能比DSL要低)。不实用于非复杂业务,普通DSL能处置大局部的疑问,处置不了的用相似Painless等脚本言语。关键性能影响如下:单次查问或更新耗时参与,脚本的口头期间相比于其余查问和更新操作或许会更长,由于在口头脚本之前须要对其启动词法剖析、语法剖析和代码编译等预处置上班。

24.防止经常使用脚本查问(ScriptQuery)计算灵活字段,倡导在索引时计算并在文档中参与该字段

例如,咱们有一个蕴含少量用户消息的索引,咱们须要查问以"1234"扫尾的一切用户。运转一个脚本查问如"source":doc[‘num’].value.startsWith(‘1234’)。这个查问十分消耗资源,索引时思索参与num_prefix的keyword字段,而后查问"name_prefix":1234。

三、写入相关

25.防止代码中或手工间接Refresh操作

正当设置索引Settings/Refresh_Interval期间,经过系统成功举措。

26.防止单个文档过大

鉴于自动http.max_content_length设置为100MB,Elasticsearch将拒绝索引任何大于该值的文档。

27.写入数据不指定Doc_ID,让ES智能生成

索引具备显式ID的文档时ES在写入环节中会多一步判别的环节,即审核具备相反ID的文档能否曾经存在于相反的分片中,随着索引增长而变得愈加低廉。

28.正当经常使用BulkAPI批量写

大数据量写入时可以经常使用Bulk,但是恳求照应的耗时会参与,即使衔接断开,ES集群外部也依然在口头。高速少量量数据写入时,或许形成集群短期间内照应缓慢甚至假死的的状况。

29.脚本刷少量数据,写入前调大RefreshInterval,不倡导将正本分片为0,待写入成功后再调回来

正本分片从新参与节点会触发副分片复原Recovery流程,假设是大分片会影响集群性能。

四、索引创立

分片

30.正本分片数大于等于1

高可用性保障。参与正本数可以必定水平上提高搜查性能;但会降低写入性能, 倡导每个主分片对应1-2个正本分片即可

31.官方倡导单分片限度最大数据条数不超越2^32-1

32.索引主分片数量不要设置过大

ES创立好索引后,普通状况下不再灵活调整主分片数量。

每个分片实质上就是一个Lucene索引,因此会消耗相应的文件句柄、内存和CPU资源。

ES经常使用词频统计来计算相关性,当然这些统计也会调配到各个分片上,假设在少量分片上只保养了很少的数据,则将造成最终的文档相关性较差。

普通来说,咱们遵照一些准则:

33.单个分片数据量不要超越50GB

单个索引的规模控制在1TB以内,单个分片大小控制在30~50GB,Docs数控制在10亿内,假设超越倡导滚动。

Mapping设计

34.防止经常使用字段灵活映射性能,指定详细字段类型,子类型(若须要),分词器(特意有场景须要)

35.关于不须要分词的字符串字段,经常使用Keyword类型而不是Text类型

36.ES自动字段个数最大1000,倡导不要超越100

单个Doc在建设索引时的运算复杂度,最大的要素不在于Doc的字节数或许说某个字段Value的长度,而是字段的数量。例如在满负载的写入压力测试中,Mapping相反的状况下,一个有10个字段,200字节的Doc,经过参与某些字段Value的长度到500字节,写入ES时速度降低很少,而假设字段数参与到20,即使整个Doc字节数没参与多少,写入速度也会降低一倍。

37.关于不索引字段,Index属性设置为False

在上方的例子中,Title字段的Index属性被设置为False,示意该字段不会被蕴含在索引中。而Content字段的Index属性默以为True,示意该字段会被蕴含在索引中。须要留意的是,即使Index属性被设置为False,该字段依然会被保留在文档中,可以被查问和聚合。

参考示例:

"mappings":{

"properties":{

"type":"text",

"index":false

"content":{

"type":"text"

38.防止经常使用Nested或Parent/Child

NestedQuery慢,Parent/ChildQuery更慢,针对1个Document,每一个NestedField都会生成一个独立的Document,这将使Doc数量剧增,影响查问效率尤其是JOIN的效率。因此能在Mapping设计阶段搞定的(大宽表设计或驳回比拟Smart的数据结构),就不要用父子相关的Mapping。假设必定要经常使用NestedFields,保障NestedFields字段不能过多,目前ES自动限度是Index.mapping.nested_fields.limit=50。不倡导经常使用Nested,那有什么方式来处置ES不可JOIN的疑问?关键有几种成功方式:

39.防止经常使用Norms

Norm是索引评分因子,假设不用按评分对文档启动排序,设置为False。

参考示例:

"title":{"type":"string","norms":{"enabled":false}}

关于Text类型的字段而言,自动开启了Norms,而Keyword类型的字段则自动封锁了Norms。

开启Norms之后,每篇文档的每个字段须要一个字节存储Norms。关于Text类型的字段而言是自动开启Norms的,因此关于不须要评分的Text类型的字段,可以禁用Norms。

40.对不须要启动聚合/排序的字段禁用列存Doc_Values

面向列的方式存储,关键用户排序、聚合和访问脚本中字段值等数据访问场景。简直一切字段类型都允许Doc_Values,值得留意的是,须要剖析的字符串字段除外。自动状况下,一切允许Doc_Values的字段都启用了这特性能。假设确定不须要对字段启动排序或聚合,或从脚本访问字段值,则可以禁用此性能以缩小冗余存储老本。

Keyword和Numeric的决定

Keyword类型的关键缺陷是在聚合的时刻须要构建全局序数,而数值类型则不用。但低基数字段通常会命中少量结果集,例如性别,经常使用Numeric则会在构建Bitset上发生很高的代价。

综上所述,在类型决定上可以参考上方的准则:

41.关于极少经常使用Range查问的数字值,经常使用Keyword类型

并非一切数值数据都应映射为数值字段数据类型。Elasticsearch为查问优化数字字段,例如Integerorlong。假设不须要范畴查找,关于Term查问而言,Keyword比Integer性能更好。

42.关于有频繁且较为固定的Range查问字段,参与Keyword类型Pre-Indexing字段。

假设对字段的大少数查问在一个固定的范畴上运转Range聚合,那么可以参与一个Keyword类型的字段,经过将范畴Pre-Indexing到索引中并经常使用Terms聚合来放慢聚合速度。

43.对须要聚合查问的高基数Keyword字段启用Eager_Global_Ordinals

参考:eager_global_ordinals

序号(Ordinals)用于在Keyword字段上运转Terms聚合。序号用一个自增数值示意,ES保养这个自增数字与实践值的映射相关,并为每一数值调配一个Bucket,映射相关是Segment级别的。

但是做聚合操作时往往须要联合多个Segment的结果,而每个Segment的Ordinals映射相关是不分歧的,所以ES会在每个分片上创立全局序号(GlobalOrdinals)结构,一个全局一致的映射,保养全局的Ordinal与每个Segment的Ordinal的映射相关。

自动状况下,GlobalOrdinals自动是延时构建,在第一次性查问如TermAggregation经常使用到时才会构建。由于ES不知道哪些字段将用于Terms聚合,哪些字段不会。关于基数大的字段,构建老本较大。

启用eager_global_ordinals后,Elasticsearch会在分片构建时预先计算出全局词项表,以便在查问时能够更快地加载和经常使用。但启用eager_global_ordinals后,每次口头Refresh操作都会构建GlobalOrdinals,相当于把搜查时刻破费的构建老本转移到写入时,所以会对写入效率有必定的影响,可以配合增大索引的RefreshInterval来经常使用。

参考示例:

"mappings":{

"properties":{

"type":"keyword",

"eager_global_ordinals":true

五、总结

最近十年,Elasticsearch曾经成为了最受欢迎的开源检索引擎,并积淀了少量的通常案例及优化总结。在本文中,咱们尽或许片面地总结了Elasticsearch日常开发中的一些关键通常&避坑指南,宿愿能为大家提供Elasticsearch经常使用上的一些自创点,欢迎探讨!

>>>>参考资料

作者丨希希


推荐几部科幻喜剧片

金龟车贺比,法国特工,超级塞豆隆。 另:2009年观影指南:最新上映50部卖座大片1.《哈利·波特与混血王子》导演: 大卫·叶慈 2009年7月17日2.《公众之敌》导演: 迈克尔·曼 2009年7月1日3.《星舰迷航》导演: J.J. 艾布斯 2009年5月8日4.《守望者》导演: 扎克·施奈德 2009年3月6日5.《X战警前传:金刚狼》导演: 加文·胡德 2009年4月29日6.《天使与魔鬼》导演: 朗·霍华德 2009年5月15日7.《异次元战神》导演: 詹姆斯·卡梅隆 2009年5月22日8.《异形战魔怪》导演: 罗伯·莱特曼 康拉德·弗农 2009年3月26日9.《终结者:救世主》导演: 约瑟夫·麦克金提·尼彻 2009年5月22日10.《无耻混蛋》导演: 昆汀·塔伦蒂诺 2009年6月11.《告密者》导演: 史蒂文·索德伯格 2009年9月12.《骑劫地下铁》导演: 托尼·斯科特 2009年7月31日13.《变形金刚2》导演: 迈克尔·贝 2009年6月26日14.《楼上的外星人》 2009年2月13日15.《鬼妈妈》导演: 亨利·塞利克 2009年2月16.《帕那索斯博士的奇幻秀》导演: 特瑞·吉列姆 待定17.《可爱的尸骨》导演: 彼得·杰克逊 2009年3月19日18.《本杰明·巴顿奇事》导演: 大卫·芬奇 2008年12月25日19.《2012世界末日》 导演: 罗兰·艾默里奇 2009年7月10日20.《结婚大作战》导演: 盖瑞·温尼克 2009年1月9日21.《诺丁汉》导演: 雷德利·斯科特 2009年11月6日22.《冰河世纪3》导演: 卡洛斯·沙尔丹哈 2009年7月1日23.《大侦探福尔摩斯》导演: 盖·里奇 2009年11月20日24.《道林·格雷》 导演: 奥利弗·帕克 2009年11月25.《乖乖女是大明星》导演: 彼德·切尔瑟姆 2009年5月1日26.《死亡幻觉2》导演: 克里斯·费许尔 待定27.《群鸟》 导演: 马丁·坎贝尔 待定28.《一次完美的逃亡》导演: David Twohy 2009年3月13日29.《鬼魂》导演: 弗兰克·米勒 2008年12月25日30.《狼人》导演: 乔·庄斯顿 2009年2月13日31.《国际组织》导演: 汤姆·提克威 2009年2月13日32.《代理人》导演: 乔纳森·莫斯托 2009年9月25日33.《墨水心》导演: 伊恩·索夫特雷 2009年1月23日34.《星战迷友》导演: 凯尔·纽曼 2009年2月6日35.《特种部队》 导演: 斯蒂芬·索莫斯 2009年8月7日36.《黑湖妖谭》 导演: 布瑞克·埃斯纳尔 待定37.《黑夜传说前传:狼族再起》导演: 帕特里克·塔特普洛斯 2009年1月21日38.《聚宝盒》导演: 理查德·凯利 2009年3月20日39.《51号星球》 2009年11月20日40.《假结婚》导演: 安妮·弗莱彻 2009年6月12日41.《忍者刺客》 导演:詹姆斯·麦克提格 待定42.《Them》待定43.《先知》导演:亚历克斯·普罗亚斯 2009年3月20日44.《九》导演: 罗伯·马歇尔 2009年12月11日45.《间谍猎手》 导演: 保罗·安德森 待定46.《速度与激情4》导演: 林诣彬 2009年6月5日47.《博物馆奇妙夜2》 导演: 肖恩·利维 2009年5月22日48.《女王神剑》 导演: 道格拉斯·阿诺科斯基 待定49.《13号星期五》 导演: 马库斯·尼斯佩尔 2009年2月50.《粉红豹2》导演: 哈罗德·兹瓦特 2009年2月

现在什么歌 最流行 最好听

1一个人的寂寞两个人的错2爱情的虚伪3此生不换4被爱伤害以后 5崩溃 蓝雨6错错错-六哲 7邓天晴-难道你真的忍心让我哭8分手的伤 晓柏9寂寞的人伤心的雨10泪流一千遍等你一千年11冷漠 -醉红颜12明聪-将紫色的梦带走13那么爱你为什么14你的灵魂背叛了你的心 张月 16亲爱的别让我难过 段千寻17我的心好冷 SARA 18 烟花易冷 19一直到最后 陶燕青20在你的心里我算是你的谁 俊宇 21最爱的人却伤我最深 沙靖杰 22被伤过的心还可以爱谁-六哲23雪 杜鹃+王艺翔24相思引25是我不够温柔 26解药27马健涛-为爱闯天涯 28非主流歌手-初雪 29别再让我为你受折磨 30冯超-爱你只是一场孤独梦 31爱情错觉32贝多芬的忧伤 33怎样34独立36天边的眷恋 37他还在38我会好好的42曾经的约定 43情醉

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: ElasticSearch

“43-解锁-高效经常使用潜能-ElasticSearch-个不容错过的实操倡导 (解锁t4的条件)” 的相关文章

的概念解析与经常使用方式-ElasticSearch (的概念解析与概念解析)

的概念解析与经常使用方式-ElasticSearch (的概念解析与概念解析)

ElasticSearch(后续简称ES)在企业中的经常使用可以说是十分宽泛了,那么ES究竟是什么呢?咱们学习ES能做到哪些事件呢?接上去我将用几篇文章详细聊一聊ES。 ES是一款高性能的散...