las

阅读 / 问答 / 标签

virglass是3D虚拟现实眼镜吗

  virglass是一款基于虚拟现实技术的智能3D眼镜。戴上virglass可以观看3D电影,透过镜片看到的是巨幕3D,等同于个人移动影院,3D效果非常好,2D电影一样可以观看,同样是巨幕效果;virglass连接电脑、psp、xbox还可以玩3D游戏,视角会跟着头部转动。

娜扎《GLASS中文版》开年刊透出,粉色虎纹外套搭配长靴酷爽利落

娜扎是慢热型的,不急不躁,她始终在等待下一个更好的机会,鼓励自己是娜扎自洽的一种方式,“努力”这一点便是娜扎一直在做的。初出茅庐到渐入佳境,娜扎对自己的职业有了更深的理解,对自己也有了更大的把握,她找到了尽量让自己舒服的方式。冬天过半,春天将至,迈着越发轻盈的步伐,属于娜扎的新十年也才正要开始! 粉色虎纹衬衫、果绿针织衫、黄色大衣、草绿套装等大胆色彩都被娜扎轻松驾驭,再搭配湿发背头造型,彰显和往常不一样的酷飒帅气! 造型①:粉色虎纹上衣配黑色高筒靴 虎年的开年刊封面,各大 时尚 平台都运用了这个元素,包括很多服装品牌,也都把虎纹的元素运用上了,娜扎身上这件也不例外,用上了虎纹元素,粉丝的甜美配上虎纹元素就显得格外霸气了,造型真的是既酷又飒,特别有气质。 选择衬衫式的上衣,会比较精致干练一些,不会显得柔美,坚韧而有品味,宽松的上衣会显得慵懒而有韵味。 造型②:拼接虎纹,野性十足 黑色拼接驼色虎纹,这样的造型会显得野性十足,没有娇美的柔情,更多是强大的外表,娜扎还是露出了大长腿,配上高筒靴硬朗有型。 拼接的宽松裙装设计,包容性太强了,那种显瘦显高的穿搭模式直接拉满,特有霸气!造型虽然为 时尚 封面,但完全可以出街,潮味十足! 造型③:大面积绿色穿搭,2022幸运色 1、果绿色有着独特的魅力,不仅显白还显得更加具有时髦感,再普通的款式和版型也可以轻轻松松凹造型;绿色是很惹眼的,鲜明而富有生机! 整体用果绿色的呈现方式,绿色似乎是一种态度,让美丽的不动人,冬日和煦,暖和轻柔,美而清新;慵懒宽松的版型很随意,简单大方的样子显得很温柔可人。绿色会给人生机勃勃的感觉。其实绿色是一个统称,其中分为各种各样的绿色,不同的绿色适合的服装搭配也是不一样的。 2、草绿色套装,很显白,宽松的廓形具有很强的包容性,一把椅子营造出来的 时尚 感,娜扎真的很飒,拉风的造型似乎就在娜扎的眉宇之间,特别大气。 扎起的裤脚显得更加有有设计感,灯笼裤型真的超级遮肉显瘦,娜扎穿出了纸片人的感觉,特别美。 造型④:黄色大衣配绿色尖头鞋 淡黄色的长款大衣似乎出现的很多 时尚 场景,配上一双绿色的尖头鞋,这显得独特多了,没有烂大街,果然, 时尚 是造出来的,不是一件单品能完全撑出场面的。 色彩的碰撞 时尚 品味真的太敢尝试了,出来那些色控,能拥有同色系的任何单品,平时凹造型轻松时髦。 造型⑤:印花上衣配短款 高筒靴 古力娜扎的表现力果然是一绝,在 时尚 这方面总是能玩得明明白白!大长腿好吸眼,古力娜扎这一套 时尚 大片简直是活力满满,洋溢出青春活泼跳跃的色彩!大胆的配色就给人眼前一亮的感觉,又不失协调,观赏性十足。

large house comfortable classes

原文一个稍微修改一下: towns like B and E sprang up,house large “comfortable” classes who had retired on their incomes,and who have no relation to the rest of the community except that of drawing dividends and occasionally attending a shareholders"s metting to dictate their orders to mangement. 这句子有两个并列的句子,有两个定语从句,一个修饰主语,另一个修饰宾语 主语是“towns”,后面的“like B and E”是定语从句,它修饰主语”towns“,其实可以看成“towns (that/which) like B and E",在此括弧里的”that“或”which“已省略. 谓语是sprang up,意思是指象雨后春笋般地到处出现. 后面的”house“是并列结构的谓语,其实在”house“前省略了一个连词”and“,此处”house“不是名词指房屋,而是动词,指安置,容纳,住有等. 宾语是”classes“,它前面的 large “comfortable”是定语,修饰宾语,但”classes“后面还有一个由”who“引导的定语从句,也是修饰宾语”classes“. 这个定语从句也有并列结构,分别是“who had retired on their incomes,” 和 “who have no relation to the rest of the community”,这两个结构用连词“and”来连接;“that of drawing dividends and occasionally attending..." 也是个并列结构,该结构和前面的“have no relation to the rest of the community”用”except“作为连接词,表示例外的意思,该结构内还有一重并列,即”that of drawing dividends“ 和 "occasionally attending...",它们之间用 ”and“作连词.

thermoflask保温杯怎么样?

ThermoFlask 保温壶确实很不错,颜值不错,保温也不错,1L 的容量也适合长途旅行携带。缺点方面就是 不能洗碗机洗,有点麻烦,所以要是清洗恐怕还得搞一把瓶刷才行。保温保冷效果也一般。

Thermo Scientific Varioskan Flash使用方法

将这种flash芯片挂接在单片机的SPI接口上,就可以进行数据读写操作引脚连接时需要注意的是mosi和miso,前者是单片机的数据输出端,必须接flash芯片的数据输入端;后者是单片机的数据输入端,应当接flash芯片的数据输出端。SS和SCLK一一对应连接即可。

thermoflask是膳魔师吗

是。thermo是个知名保温杯品牌,源于德国,音译成中文就是膳魔师,查询品牌官网显示,thermoflask是产品推出的新款,叫做复古中国膳魔师,是面对中国市场的特殊型号。

在教室里不许戴帽子 翻译英文 ______in the classroom

Don"t wear hats in the classroom.

Slash的《Sahara》 歌词

歌曲名:Sahara歌手:Slash专辑:SlashSaharanightwishmusic~~My ballad of the dark queenEchoes through lightAs he frees the curse of godsThe pharao"s wrathOne thousand one nights unseenThe philosopher and the queenAncient mariner in a sea of sandThe journey beauty he s doomed to die forOne thousand one nights unseenThe philosopher and the queenThe rise will slowly beginHeaven has a darker faceYou were so sorry to have a chaseHeaven has a darker faceChasing him across the wavesLay him or rest under ridges of mirageAs the sun slowly take to elysian fieldsOne thousand one nights unseenThe philosopher and the queen(One thousand one)One thousand one nights unseenThe philosopher and the queen(One thousand one)hai~ya~weyeye~yeyea~http://music.baidu.com/song/7389178

表示过去式的英语单词,不少于30个 例如:Last sunday 上周日 不要重复类型的

yesterday last night last week last month last year

Warp Me in plastic这翻译过来到底是什么?

Warp Me in plastic,这句简短的英文句子可以翻译为:用塑料把我裹起来。

wrap me in plastic翻译中文是什么?

wrap me in plastic翻译中文是让我好好打扮,让我光芒四射。wrap me in plastic出自于最近超火的一首歌曲Wrap me In Plastic,歌曲的演唱者是CHROMANCE,单曲与2017年10月27日发行。plastic用作名词的基本意思是塑料,塑料制品,用作可数名词时常用于复数形式,当plastic指的是制造某种成品的原材料时,多用作不可数名词。warp me in plastic的意思是用塑料弯曲我,warp可引申指歪曲、曲解某事或扭曲某人的心智等。plastic用作名词的基本意思是塑料,塑料制品,用作可数名词时常用于复数形式。当plastic指的是制造某种成品的原材料时,多用作不可数名词。plastic用作形容词的基本意思是指物品塑料的,在专业术语中可指某种物质是可塑的,用于比喻义时可指人的思想等“可以塑造的,可以改变的,用作贬义时还可指某事物不真实的,合成的,人造的。

wrap me in plastic是什么意思?

wrap me in plastic翻译中文是让我好好打扮,让我光芒四射。wrap me in plastic出自于最近超火的一首歌曲Wrap me In Plastic,歌曲的演唱者是CHROMANCE,单曲与2017年10月27日发行。plastic用作名词的基本意思是塑料,塑料制品,用作可数名词时常用于复数形式,当plastic指的是制造某种成品的原材料时,多用作不可数名词。warp me in plastic的意思是用塑料弯曲我,warp可引申指歪曲、曲解某事或扭曲某人的心智等。plastic用作名词的基本意思是塑料,塑料制品,用作可数名词时常用于复数形式。当plastic指的是制造某种成品的原材料时,多用作不可数名词。plastic用作形容词的基本意思是指物品塑料的,在专业术语中可指某种物质是可塑的,用于比喻义时可指人的思想等“可以塑造的,可以改变的,用作贬义时还可指某事物不真实的,合成的,人造的。

美国大学withdraw class

如果你在deadline之前withdraw了的话是不会影响GPA的,但是你的W会出现在成绩单上,无论你之后上不上这门课,W都会在。但是在大学里W算是正常的事,有一两个W不会影响你今后申请研究生工作。

美国学校中withdraw a class与drop a class有什么区别

dropclass是在开学的时候一周左右,有选择的drop不会有问题,而且学校还会退给你学费withdrawclass是不一样的,一般不会退学费,而且在于老师,如果老师不喜欢你或者你的成绩不好的话,你可能会得到WF是withdrawfail,会影响你的GPA.如果你的成绩好,仅仅是不喜欢你现在上的课的话,应该会得到W就是withdraw,是不会影响你的GPA的。

美国学校中withdraw a class与drop a class有什么区别

我来鄙视一下一楼,你什么玩意儿?!接着回答问题,withdraw 免费,drop的话会有记录而且收全科学费

recycledplastic是什么面料

recycledplastic是再生涤纶面料。recycledplastic就是再生涤纶面料,也就是用可乐瓶做的回收涤纶丝做的面料。再生涤纶短纤是利用涤纶布料,废旧聚酯瓶片,纺丝废丝,泡泡料,浆块做原料,废旧瓶片经过粉碎、清洗,各种料的混合物经过干燥,熔融挤出。

recycled plastic是什么面料

recycled是RPET面料。 RPET面料,是一种新型的环保再生面料,英文称 Recycled PET Fabric ,也称为再生PET面料。其纱线是从回收的矿泉水瓶子和可乐瓶中提取的,又俗称为可乐瓶环保布。 因其是一种新型的绿色再生环保面料,其来源的低碳性,为节约石油资源,保护生态环境做出了巨大贡献。所以在国外尤其是欧美发达国家很受青睐,广泛用在吊带衫、衬衫、裙子、童装、丝巾、旗袍、领带、手帕、家纺、窗帘、睡衣、蝴蝶结、礼品袋、套袖,时尚雨伞、枕套、抱枕等等。

sapphireglass手表什么牌子

sapphireglass手表是蓝宝石玻璃手表的意思,不是什么牌子。

Travis的《Last Words》 歌词

歌曲名:Last Words歌手:Travis专辑:Ode To J SmithTravis - Last WordsTry to shine a light into the darkCorners of the mind and of the heartFind out what you"r carrying roundThings you can"t remember having foundHolding onThe best you canFinding outIn the nick of timeBut the last wordsAre hanging on my phoneOh the last wordsEven when you"re standing on your ownNow the last wordsAre lying on my floorAh the last wordsTry to find a place you can beginBegin to fill the space you"re living inRip it uo and start it all againTurning all your enemies to friendsOh oh oh ohHolding onThe best you canFinding outIn the nick of timeBut the last wordsAre hanging on my phoneOh the last wordsEven when you"re standing on your ownNow the last wordsAre lying on my floorAh the last wordsOh the last wordsAre hanging on my phoneOh the last wordsEven when you"re standing on your ownNow the last wordsAre lying on my floorAh the last wordsOh the last wordshttp://music.baidu.com/song/2218617

35. He wore dark glasses to avoid _____. (本题分数:2 分。) A、 having been spotted B、 to be spott

D

英文中 last bus是上班车还是末班车

最末一班公共汽车

这句话的中文翻译:Consignee: ICDAS CELIK ENERJI TERSANE VE ULASIM SANAYI A.S.

Consignee是收货人的意思ICDAS CELIK ENERJI TERSANE VE ULASIM SANAYI A.S. 是收货人的名称,不是英文所以翻译不出来,你做单子的时候照着输入就行了

英语中有world-class 表示世界级,那么外国人常用的(足球里听说的)sheer-class

现象级,希望采纳

The pupils are in the classroom.换种句式,但意思相同,怎么做?

The pupils are in the classroom.学生们在教室里。The students are in the classroom.There are pupils in the classroom.

把每一天都当做最后一天过"Live every day as if it was your last."

昨天下班后在公交车上开始觉得头晕、身体不舒服,浑身没力。以为自己只是这段时间累了,回到宿舍赶紧洗澡,八点多就躺床昏睡过去了,把闹钟调到6:02,比平时晚了7分钟。 第二天起来感觉身体没有异样,精力也恢复过来了,照样起床搭公交去上班了。那么早就出发不是因为工作繁重,只是想赶最早一班车,回到律所还没到八点,至少有一个小时的学习时间,因为开始实习之后,一天公交车来回,通勤时间近三个小时,每天晚上回到宿舍七八点已经没有精力继续学习(最近复盘之后其实都是借口)。 公交车上感觉还可以,回到所里开始吃不下早餐,上吐下泻。在办公桌上趴着休息了一下,还是觉得不能恢复过来,头晕、没力气,从来没有过的难受,跟老板请了假,在附近的医院预约挂号,赶紧去看医生了。医生大概的意思就是吃的东西有问题,叫我最近都喝白粥,给我开了葡萄糖、什么素、什么菌各种补剂。在回学校的公交车上晃悠悠的,觉得胃在翻滚,想吐,希望一秒钟回到宿舍躺着。安全到达学校之后,没吃东西,喝了医生开的葡萄糖,睡了一下午。感谢同事帮我完成了工作。我祈祷自己醒来就好了,但是还是浑身没劲。大学四年以来,在准备任何重要的考试、比赛期间我都不允许自己病倒,靠主观意志hold住,但很多时候在完成任务之后当晚就病倒了,印象最深刻的就是商务英语中级考试。 今晚我也是八点多就爬上床了,身体很累挺难受的,但是有点睡不着,于是开始想七想八,如果明天醒不来怎么办?让我想起那句话:把每一天都当做最后一天过("Live every day as if it was your last.")。 如果今天真的是最后一天,我应该会很不甘心、很不舍得吧。一方面是,我太多东西还没经历过了;另一方面是,过去我还有很多没有做好,或者如果有时间,我可以做得更好。 到生命中每一个时间点都是以往一分一秒的结果,都是有原因的。如果是最后一天了,我最后悔的可能是平时没有多多联系身边爱自己的人;没有多读点书,做做读书笔记;没有看《猫》…… 感觉自己上了大学才开窍,对于初中高中的记忆已经十分模糊。从开学第一天开始,下定决心要珍惜时间,将每一天都过得有滋有味。有身边的好朋友、离学校两个小时车程的父母,四年来极少负面情绪,几乎没有病痛,所以这次这么难受也是我预料之外,也让我开始胡思乱想,再一次感受到时间的宝贵。 关于时间的感悟不能太多,最关键还是活在当下,且对未来有清晰的规划,对过去进行总结。 Enjoy the present, Plan for the future, Learn from yesterday.

英文作文 MY LAST DAY,详情请看一下补充。

Let me tell you something about my last day off. It was OK. Although it is Saturday, I didnu2019t sleep late because I have to go back to school in the morning. My teacher told me I should practice the morning exercise. The weather was really cold. The wind blew strongly. It was terrible. In the afternoon, I went to the library with my friends. I read lots of books. After that, I went to the KFC to eat some food. It was delicious. Finally, tired but happy, I went home by bus. It was an interesting day.

PaulaShaw人物简介

PaulaShawPaulaShaw是一名演员,主要作品有《在节日里结婚》、《KillerBash》。外文名:PaulaShaw职业:演员代表作品:《在节日里结婚》、《KillerBash》曾合作人物:迈克尔·斯科特

PaulaSchramm主要经历

PaulaSchrammPaulaSchramm是一名演员,代表作品有《匿名者》、《告密者》等。外文名:PaulaSchramm职业:演员代表作品:《匿名者》合作人物:罗兰·艾默里奇电影作品人物关系

flash与cash在一起时应该怎么翻译

hot flashn.(名词)潮热:一些妇女在更年期所感到的,因表皮血管瞬间扩张而引起的突然性的,经常是全身性的短暂热感flashvt.(口语中)]亮出(财物等); 炫耀; 卖弄这样你就懂了吧Shoppers flash the cash as Year of the Pig looms 是指猪年快到了,大家都在商场里大肆购物

org.glassfish.jersey.filter.LoggingFilter; 这是什么包里的

jersey-client-》jersey-common

hardwood classic jersey 是什么意思

hardwood classic jersey 是硬木经典球衣的意思

Let this be my last word, that I trust in thy love.什么意思?

是不是拼写有错误??

let this be my last word , that ithust thy love 是什么意思?

泰戈尔《飞鸟集》的结束语,意思是:『“我相信你的爱”,让这句话做为我最后的话。』thy是‘你的"意思,英文的古体,相当于我们的文言文那样的调调。

塞班s60V3.2用JAF刷机出现 Error getting flash id...

诺记刷机的话。。不推荐。。毕竟不是moto,htc之流,,,去专业论坛问问。。

我的C6-00用JAF刷机显示Phone rebooted but not in flash mode...,用塞班助手刷机显示的是等待手机重新引

手机没电了吧充满重刷

laser粉为什么不喜欢manta

???我双担都喜欢,MANTA很不错的,是很真实的男团,他们教L团学会保护自己和生存,L团教M团学会关心爱护,互补的

elasa实验原理

elasa实验原理如下:使抗原或抗体结合到某种固相载体表面,并保持其免疫活性;使抗原或抗体与某种酶连接成酶标抗原或抗体,这种酶标抗原或抗体既保留其免疫活性,又保留酶的活性。酶联免疫吸附测定(enzyme linked immunosorbent assay,简写ELISA)指将可溶性的抗原或抗体结合到聚苯乙烯等固相载体上,利用抗原抗体特异性结合进行免疫反应的定性和定量检测方法。双抗夹心法适用于大分子物质的检测。将已知的可溶性的抗原或抗体结合到聚苯乙烯等固相载体表面,利用抗原抗体特异性结合进行免疫反应的定性和定量检测方法,具有快速、灵敏、简便等优点。竞争法适用于较少表位的小分子物质。将抗体包被于微孔板中,加入无关蛋白载体封闭未结合位点,加入标准品和生物素标记的抗原物质进行竞争结合。做实验的注意事项:1、实验前的准备工作很重要,试验前要准备充分,拿到任务应当进行简单的思考,将试验需要的各种试剂、试液、仪器以及试验的流程、注意事项、以前试验当中遇到的问题等想清楚,准备好,免得到时少东少西,自乱阵脚。第一次新实验的话最好请教一下做过类似实验的人,对于不常做的实验最好做一份详尽的试验流程图做时贴在试验台前,需要特别加以注意的地方要特别标注,可以随时参照。2、保持实验室整洁。做完实验做到药品归位,用过的仪器等恢复原样,不能做到哪里摊到哪里,永远把你的实验台面保持干净,不但是为了让你得到很好的结果,更是为了你自己的心情做实验不能做到整洁。实验时养成隋手清理的习惯。3、消煮后的原液做完后不要急着倒掉,最好等数据算出再倒掉,这样遇异常数据或超标数据,不用重复消煮就可以复检。

last和lust读音区别

答案:一样的嘴巴有不一样的说法。

watch,class的复数形式

watchs classes

英语last semester怎么翻译?

last semester,这个英文词组的中文翻译是:上学期,或者是上个赛季。

怎么制作flash课件

制作flash课件推荐使用focusky。

NicholasMoody人物介绍

NicholasMoody外文名:NicholasMoody职业:演员代表作品:综合医院合作人物:KevinBernhardt电视剧作品

ABS-GUIDE FOR NDT I. O.H.W.-2011 Class A

ABS标准-无损检测指导书,I. O. H. W.部分-2011年 A类注:ABS--美国船级社NDT--无损检测

“一杯酸奶”用英语怎么说? a glass of yogurt 这样翻译对吗?

材料土豆,玉米粉,椒盐做法1、黄色土豆很小,象栗子大,不用削皮,用重点的刀将土豆拍到开花即可。2、蘸上玉米粉兑成的浆水,放入锅炸至金黄色,捞起、滤油,摆盘,开动。可按自己人口味放蘸料,我放了些椒盐在上面,也可蘸茄汁,味道也很好的。

Blueglassyogurt 是什么?

u200d近期,主打“一杯让你变好看的高品质酸奶”的Blueglass Yogurt获得超2亿元B轮融资,将现制酸奶与功能酸奶推向公众视野。在Blueglass Yogurt门店,一杯“10小时冷萃酸奶”售价25元,一瓶草莓舒眠美颜胶原酸奶售价可达38元,胶原、玻尿酸、γ-氨基丁酸等颇具科技感的食材成分,以及变美、舒眠、品质、健康等卖点,让Blueglass成为社交媒体上的新晋网红,吸引资本进入并助其加快扩张。然而,据知情人士向新京报记者透露,Blueglass名称实际是对日本人气咖啡品牌bluebottle的模仿。所谓的“10小时冷萃酸奶”,实则是在供应商提供的酸奶原料基础上,由店员使用家用乳清过滤盒滤去乳清而生产的希腊式酸奶。但是,与工厂无菌环境下使用离心设备脱去乳清的技术相比,这种半手工的制作方式存在卫生漏洞。此外,Blueglass的舒眠、美颜等功效宣称,也被专家质疑缺乏足够的科学与实验依据。Blueglass刚获2亿元B轮融资据媒体报道,现制酸奶品牌Blueglass Yogurt近日获得超2亿元B轮融资,由斯道资本、优山资本共同领投,老股东愉悦资本、华创资本、凌波资本跟投。融资后,Blueglass的目标是在5年内成为现制酸奶引领者。官网信息显示,Blueglass Yogurt原中文名为“阿秋拉尕酸奶”,创立于2012年,隶属于北京悦活餐饮管理有限责任公司。号称自有7万亩牧场、10000头荷斯坦奶牛,自主研发专利菌种,“精准生牛乳无菌发酵,真正做到了健康无添加”。2017年,阿秋拉尕酸奶推出“10小时冷萃酸奶”,次年将品牌升级为Blueglass Yogurt。2019年11月,Blueglass进入功能型酸奶细分领域,推出胶原酸奶系列,2020年11月再次瞄准睡眠、美颜、抗糖功能推出新品。打开Blueglass Yogurt微信公号,首先映入眼帘的就是“一杯让你变好看的酸奶”。官方微信截图“无菌发酵”“疫苗级冷链配送”“冷萃”等听起来高大上的工艺技术,加之高蛋白、胶原、γ-氨基丁酸、健康、变美等成分及功能宣传,使Blueglass成为不少年轻女性的宠儿。在大众点评上,有用户给予Blueglass“健康、低卡、好喝、高颜值”的评价,并将其视为奶茶替代品。u200d凌波资本合伙人赵然晴近期在接受媒体采访时甚至对Blueglass给出高度评价,认为其从满足现代人健康需求的开发角度,形成了极富差异化的产品和品牌定位。Blueglass的92%门店开在星巴克隔壁,门店管理和运营效率是行业内的佼佼者。“相信Blueglass以现制酸奶为切入口,定将成为健康酸奶、健康食品和潮流文化的引领者。”半手工过滤“冷萃”工艺被指存卫生隐患尽管Blueglass受到资本和部分消费者的追捧,但其在知情人士张兆阳(化名)眼中却有着另一个故事版本。2018年“阿秋拉尕酸奶”升级为“Blueglass Yogurt”时,官方给出的解释是,“Blue”代表青海藏区草原天空的蓝,“Glass”代表着酸奶制作工艺的纯净透明,“Blueglass将这个理念融入品牌,不断传递给人们健康、品质、时尚、美好的生活方式。”但据张兆阳了解,“Blueglass”名字的诞生的实际源于创始人谷勇从日本采风回国后,对日本人气咖啡品牌“bluebottle”的模仿。自2020年起,更名后的Blueglass开始进行门店扩张,现在约有30多家门店。官网及天眼查信息显示,Blueglass已在北京、上海、杭州、北戴河等城市布局,其母公司北京悦活餐饮管理有限责任公司目前已开39家分店,并在北戴河拥有分公司。而Blueglass加快扩张的2020年,正是凌波资本、华创资本、愉悦资本进入北京悦活餐饮管理有限责任公司的时间点。快步发展的同时,Blueglass的人员流失似乎也在加快。“以研发部门为例,有的人长则待一个月,短的一周就走了,大家离职各有各的原因。“而在张兆阳看来,Blueglass给员工洗脑式的企业文化以及部门间斗争,是促使一部分人离职的因素。而张兆阳最想“吐槽”的,是Blueglass宣称的“10小时冷萃”技术。按照官网介绍,“Blueglass坚持每一杯都满足10小时以上的滴滤萃取,甚至能达到48小时,口感独特浓醇、倒杯不洒。”“所谓的冷萃是滤乳清工艺,就是希腊式酸奶。”张兆阳称,正常情况下,希腊酸奶是在无菌环境下用离心设备脱去乳清再进行灌装,从而达到提升酸奶蛋白质单位含量的目的。但Blueglass所谓的“冷萃”工艺,实际是在供应商提供的酸奶原料基础上,由店员在门店库房或储藏室内等场所使用家用乳清过滤盒滤去乳清,“这在卫生方面是个漏洞。”此外,Blueglass“自有7万亩牧场、10000头荷斯坦奶牛”的宣称也存在疑点。据业内人士介绍,牧场、工厂在乳制品行业属于重资产投资,建设一个简易的万头牧场大致需要5亿元资金,更完善的万头牧场则需要6亿元资金。据张兆阳证实,所谓的万头牧场实际并非Blueglass独有,仅是在上游牧场进行了少数参股。美容舒眠等功效宣称受质疑“冷萃技术”之外,Blueglass酸奶的美颜、舒眠等功效宣称也受到专业人士质疑。7月20日,新京报记者探访Blueglass北京西单更新场店发现,其宣传立牌上“一杯让你变好看的高品质酸奶”格外醒目。在样品展示区,不同类型酸奶被分别打上了“睡个美容觉”“胶原酸奶”“食物钻石”“每日代餐”等标签提示,25元一份的10小时冷萃酸奶、38元一瓶的草莓舒眠美颜胶原酸奶、42元一杯的蜜桃胶原玻尿酸爆珠酸奶等产品吸引不少消费者驻足。据官微信息,Blueglass在今年6月10日推出了含有玻尿酸、胶原成分的酸奶新品,并在文案中打出了“不惧年龄”的宣传语,称经过反复研发与测试,“阳光玫瑰葡萄系列加入首创玻尿酸胶原爆珠,玻尿酸和法国进口胶原蛋白肽同时补充,清清松松喝出Q弹水光肌”,“玻尿酸+胶原蛋白同时补充,双管齐下,加乘肌肤弹力”。官方微信截图美国食品技术协会高级会员、科学松鼠会成员云无心认为,近年来确实有一些“似是而非”的实验和数据来证明食用胶原蛋白的功效,进而使其受到商家鼓吹,但整个胶原蛋白行业并没有取得新的突破。“不管厂家宣称使用了什么原料或技术,不管宣称把胶原蛋白切得多么小,都是扯淡、噱头。”而在2021年1月国家卫健委批准玻尿酸列入“新资源食品”后,市场上各种玻尿酸饮品、糖果等迅速出现。云无心认为,“批准”只是证明了玻尿酸作为食品的安全性,并不代表其具有美容相关功效。据报道,2012年曾有企业向欧盟食品安全局申报“口服玻尿酸护肤”的能效宣称,但最终被否决,评估结论是没有人体实验支持其所申报的功能,口服玻尿酸和保护皮肤之间无法建立因果关系。另据店员介绍,Blueglass舒眠酸奶中发挥作用的主要成分是γ-氨基丁酸。云无心称,γ-氨基丁酸是一种非蛋白质氨基酸,简称GABA,是人体神经组织中重要的抑制性神经递质,这一活性被演绎成可帮助睡眠和减轻焦虑。但是,目前对这些功能的研究很不充分,这些功能到底是否存在、吃多少才能有效,都缺乏明确的实验证据。针对“冷萃”酸奶工艺、自有牧场的真实情况,产品美颜、舒眠等功能宣称的依据等问题,新京报记者7月21日联系Blueglass公司并发去采访提纲,截至发稿尚未给予回应。现制酸奶赛道兴起Blueglass融资扩张背后,是现制酸奶与功能酸奶两个细分赛道的兴起。2021年1月,新希望乳业宣布以2.31亿元的价格收购重庆新牛瀚虹实业有限公司60%股权,进而将现制酸奶品牌“一只酸奶牛”纳入麾下。官方信息显示,“一只酸奶牛”创立5年来,以20-30岁女性白领为主要目标用户,主打“酸奶+”等差异化茶饮产品,现门店数量已逾千家,业务覆盖重庆、四川、江苏、陕西、广东、海南、福建等18个地区,2019年营业收入约2.4亿元,模拟净利润约3500万元(未经审计)。有报道称,随着4000亿新式茶饮市场的兴起,新希望乳业有望通过此轮投资站上现制酸奶茶饮风口。新京报记者注意到,“一只酸奶牛”此前向皇氏集团来思尔乳业定制酸奶基料,收购完成后,其酸奶基料很可能全部换由新希望乳业提供。事实上,布局现制酸奶赛道的传统乳企远不止新希望。天眼查信息显示,Blueglass母公司北京悦活餐饮管理有限责任公司目前由谷勇持股约53%,为第一大股东。而在其股东深圳中深新创股权投资合伙企业(持股约6.58%)的股权结构中,可以找到温氏食品集团的身影。目前,温氏食品集团旗下已拥有辉山、长城、风行3个乳业品牌及资产。在北京,除Blueglass外,消费者还可以接触到K22、兰熊等现制酸奶品牌。与普通茶饮相比,现制酸奶品牌更喜欢凸显相对的低糖、低卡、健康等概念。一位现制酸奶品牌门店负责人向新京报记者透露,其产品以酸奶为“奶盖”,同时融合鲜榨果汁、少量水制作而成,经营好的情况下毛利率可达到50%以上。为减少安全隐患和加工步骤,门店普遍直接向供应商采购酸奶原料,再由门店简单配以辅料制作。另一方面,低温酸奶增速放缓促使整个行业向更加细分的领域拓展,功能性酸奶就是其中之一,但相关产业方兴未艾。一位大型乳企相关负责人告诉新京报记者,近两年,市面上陆续出现了具有护眼、润喉、助消化等功能的产品,功能宣称主要基于所添加的成分。这些成分通常获得了实验验证,在业内有普遍共识。但对于美容功效的产品,大型乳企普遍采取谨慎态度。“对于美容功效,专业医美机构尚不敢随意宣传,食品企业就更不敢轻易尝试了。”新京报记者查询发现,在保健食品领域,目前我国批准受理的保健功效有27种,与皮肤有关的包括祛痤疮、祛黄褐斑、改善皮肤水分、改善皮肤油分等。最新发布的《允许保健食品声称的保健功能目录 非营养素补充剂(2020年版)(征求意见稿)》,允许保健食品声称的与皮肤有关的功能包括“有助于改善痤疮功能”“有助于改善黄褐斑功能”“有助于改善皮肤水份状况功能等。这意味着新老规定里均未允许有“美容”“补充胶原蛋白”等功效声称。此外,市场监管总局在2020年11月发文表示,相关部门已不再受理延缓衰老的保健功能。新京报记者 郭铁 摄影 郭铁编辑 祝凤岚 校对 陈荻雁

flash中怎么用按钮控制音乐的播放,暂停然后再继续播放,

如果是简单而又效果较差的方法,就是把声音导入帧,然后再帧属性的声音属性哪里选“数据流”,然后直接用按钮动作控制帧的播放,达到控制目的。如果是要高品质的(因为前一种方法的效果是在是太……),就要用动作脚本:_root.createemptymovieclip("player",1);//假设你的场景没有程序复制东西,所以用深度1,这个影片剪辑是声音的“依靠”varsound:sound=newsound(player);sound.loadsound("[这里是声音连接名]",true);sound.stop();varplayedposition:number;varstoped:boolean=true;varpaused:boolean=false;//停止按钮,单击按钮停止播放stop_btn.onrelease=function(){stoped=true;paused=false;sound.stop();}//暂停按钮,控制声音的暂停与继续播放pause_btn.onrelease=function(){if(!paused&&!stoped){//如果不是暂停也不是停止的话paused=true;playedposition=sound.position;//记录声音播放的当前位置sound.stop();}elseif(paused&&!stoped){//如果声音已经暂停,就从上一次记录的位置开始播放paused=false;sound.start(playedposition/1000);//position记录的单位为毫秒,所以要除以1000}}//播放按钮start_btn.onrelease=function(){if(paused){//如果声音已经暂停,就从上一次记录的位置开始播放paused=false;sound.start(playedposition/1000);}elseif(stoped){//如果声音已经停止,就重新播放stoped=false;sound.start();}}类sound的方法sound.getbytestotal()获取导入文件的大小;sound.getbytesloaded()获取已经导入的大小。类sound还包括了3个事件sound.onload(),加载完成时触发;sound.onsoundcomplete(),播放完成时触发sound.onid3,每次有新的可用id3标签时触发。

林俊杰 所有的歌的 乐谱 FLASH钢琴游戏的

我死忠JM9年了,JJ出到猜7年啊

求Sleeping at Last的Saturn的中文歌词

你在离开之前带我见识了星星的胆魄即便死亡之后,星光依旧闪耀呼吸浅短间,你诠释了无限就连生命也变得如此珍稀美丽我忍不住问出声只为你能再说一遍我试着将它记下却找不到笔我愿倾尽一切去聆听你又重复了一遍那是宇宙的开始只为能被我看见我忍不住问出声只为你能再说一遍我试着将它记下却找不到笔你又重复了一遍那是宇宙的开始只为能被我看见呼吸浅短间,我将诠释无限我们的存在是如此珍稀美丽ps:DW 10TH : )

我这边有台HP Laserjet pro 400 color M451dn打印的时候出现竖线非常明显,可能是什么问题需要如何解决?

换硒鼓。注意,不是换粉盒,是换掉硒鼓。

HP LaserJet 400 M401dn忘记密码怎么办,请说明详细步骤

找一个U盘,制作一个老毛桃U盘启动,开机设置为U盘启动,进去后有清除密码这一项

如何安装hp laserjet 2055dn打印机

下载驱动安装

NicholasShields是哪里人

NicholasShieldsNicholasShields是一名演员,代表作有《黄金岁月》,合作人物有艾米利奥·艾斯特维兹。外文名:NicholasShields职业:演员代表作品:黄金岁月合作人物:艾米利奥·艾斯特维兹

请问换热器中的CLASS B和CLASS R怎么划分的,是TEMA中的吗,151中好像没有哦

R、C、B是TEMA中对换热器适用场合的一种分类。R用于苛刻条件下,石化等相关行业使用;C为一般工作条件下的普通换热器,中等程度要求;B为用于化工过程,非直接火的换热器。

tema class r有什么要求

TEMA=Tubular Exchanger Manufacturers Association (管式交换器制造商协会)TEMA标准就是该协会下属的技术委员会编制的一本关于列管式换热器设计、制造和检验的标准,是目前世界上使用最广泛的列管式换热器标准。分为B-chemical、C-general、R-refinery三类。 - 本文出自马后炮化工论坛,原文地址:http://bbs.mahoupao.net/thread-78709-1-1.html

几何校正用envi classic(32-bit)的和envi classic 有什么区别吗?

额,有什么区别吗?我感觉这两个型号的话,什么有什么本质的区别的?

We had a spots meeting last Saturday.变一般疑问句?

Did you have a spots meeting last saturday?

Last night I dreamt of San Pedro 是哪首歌中的歌词?

歌曲的名字叫《La isla bonita》歌词如下Last night I dreamt of San PedroJust like I"d never gone, I knew the songA young girl with eyes like the desertIt all seems like yesterday, not far awayChorusTropical the island breezeAll of nature, wild and freeThis is where I long to beLa isla bonitaAnd when the samba playedThe sun would set so highRing through my ears and sting my eyesYou Spanish lullabyI fell in love with San PedroWarm wind carried on the sea, he called to meTe dijo te amoI prayed taht the days would lastThey went so fastTropical the island breezeAll of nature, wild and freeThis is where I long to beLa isla bonitaAnd when the samba playedThe sun would set so highRing through my ears and sting my eyesYou Spanish lullabyI want to be where the sun warms the skyWhen it"s time for siesta you can watch them go byBeautiful faces, no cares in this worldWhere a girl loves a boyAnd a boy loves a girlLast night I dreamt of San PedroIt all seems like yesterday, not far awayTropical the island breezeAll of nature, wild and freeThis is where I long to beLa isla bonitaAnd when the samba playedThe sun would set so highRing through my ears and sting my eyesYou Spanish lullabyTropical the island breezeAll of nature, wild and freeThis is where I long to beLa isla bonitaAnd when the samba playedThe sun would set so highRing through my ears and sting my eyesYou Spanish lullabyTropical the island breezeAll of nature, wild and freeThis is where I long to beLa isla bonitaAnd when the samba playedThe sun would set so highRing through my ears and sting my eyesYou Spanish lullaby

moi&classic是什么牌子

omi&classic 一个箱包品牌OMI女包是我国国内著名的箱包品牌,隶属于欧米公司旗下

有没有功能强大的视频制作软件,比如Flash

Premiere是Adobe公司出品的视频编缉工具,是目前功能最强大的视频制作软件之一,和其它视频制作工具相比,Premiere操作要复杂一些,不过它能做出更精彩的视频相册。品尼高Pinnacle Studio MediaSuite 10.1 中文版 视频制作套装Pinnacle Studio MediaSuite 10.1 中文版 (视频制作套装):Pinnacle终于发布其目前最强大的视频处理豪华套件Pinnacle Studio Media Suite 10.1,这个产品也是大家望穿秋水的一重量级套件.是目前Pinnacle Studio系列功能最强大的版本!这是(中文)多国语言版!注意:安装时显示的是Pinnacle Studio Plus 10(版本10.1)的信息!是因为Pinnacle Studio MediaSuite是一个完整套件,包括Pinnacle Studio Plus 10.1.价格:10990欧元. Pinnacle Studio MediaSuite v10.1, Pinnacle Systems公司推出全新的影像编辑软件-Pinnacle Studio Plus与Pinnacle Studio MediaSuite,再度强化该公司从初学者到专业使用者等系列解决方案的完整阵容。Studio MediaSuite则是一套完整的媒体工具,对于寻求全方位数字媒体工具的Studio客户而言,新的Pinnacle Studio MediaSuite 能提供Studio Plus影音编辑软件,以及完整的媒体编辑与管理工具。除了Pinnacle Studio Plus以外,Studio MediaSuite 还包括Steinberg WaveLab Lite (音频编辑)、Corel PhotoBook (相片编辑与分享)、Pinnacle Instant DVD Recorder (DVD对录与刻录)、Pinnacle Media Manager (数字媒体管理工具)、Pinnacle Instant CD/DVD (CD/DVD刻录、复制与数据备份)、Pinnacle Instant Cinema (DVD播放软件),以及提供颜色去背效果的绿布背景幕(5尺×6尺)。让使用者可在家里制作颜色去背(chroma key)的特效。Pinnacle Studio Plus采用业界最受欢迎的使用者界面,此界面提供客户及新闻界所公认,容易使用又简单的三步骤电影制作流程。Pinnacle Studio Plus可单独出售或做为 Pinnacle Studio MediaSuite套件的一部分!它提供了新的创意工具:真正A/B-Style编辑的第二影像轨,以及画中画(Picture-in-picture,PIP)效果及颜色去背(Chroma key)特效可录制杜比数位立体声的Dolby Digital Stereo Creator强化的幻灯片功能及更多特效,例如红眼移除、旋转,以及能将静态影像变成动态影片的摇摄及画面缩放控制功能。使用者还可以将纪录性的动画幻灯片,配上音乐、字幕与转场效果,使图片变得活泼生动。双层DVD支持,可制作长达两小时的高品质DVD影片Pinnacle Studio MediaSuite 10.1专业工具包:Pinnacle Studio MediaSuite 10.1提供了一个高质量视频编辑和管理的全套工具,可将创造力发挥到极致。Studio MediaSuite 10.1将视频编辑带到了一个新的级别,您可在影片中添加其他媒体,可以编辑数码照片,创作音乐,并为影片配乐。将视频制作成DVD或复制影片与他人分享更加简单。集成的工具包,带给您无限创意!简单和便于使用 简单明了的用户界面将指导你完成视频制作这三步(1、捕获, 2、编辑,3、分享)。并使学习和使用Studio Plus不费吹灰之力。 效果实时预览(新功能)NEW!Pinnacle Studio Plus now includes hundreds ofand format independent (SD and even HD) real-time effects and transitions. 内置DVD制作Pinnacle"s fully integrated CD and DVD authoring workflow allows you to easily create DVDs with motion menus and custom navigation on the fly for playback on most consumer DVD players or DVD capable computers. 支持任何流行的视频采集源及格式包括HD格式(新)NEW!Pinnacle Studio Plus now gives you the power in combination with Studio"s celebrated ease-of-use to capture video from the latest consumer HDV camcorders and DVD video cameras. 专业TV样式效果With Pinnacle Studio Plus, you can create thereal-time multi-track editing and effects that you see on TV everyday like Chroma Key (green or blue screen) and Picture-in-Picture (PIP).

public class Ldd extends JFrame implements ActionListener 什么意思啊,java初学者

翻译一下:一个叫Ldd的公开(总感觉有点不对)类,它的父类是JFrame(extends JFrame),实现了ActionListener接口(implement ActionListener)

星际争霸2人族选手Flash和Maru谁厉害?

虽然我是flash粉,但是我觉得maru更强,主要教主老是死亡冲锋,让我对其智商总是表示怀疑。

>>> *first,middles,last=range(10) >>> first [0, 1, 2, 3, 4, 5, 6, 7] Python里的

first值为[0]middles值为[1,2,3,4,5,6,7,8]last值为[9]

oakleytolasmik哪个好

tolasmik好。这个牌子的产品品种多样,价格良心,质量也是上乘的,是国内的滑雪用品优质品牌。滑雪运动是运动员把滑雪板装在靴底上在雪地上进行速度、跳跃和滑降的竞赛运动。滑雪板用木材、金属材料和塑料混合制成。高山滑雪由滑降,小回转和大回转(障碍滑雪)组成。

Elasticsearch7.8.0 配置x-pack基础安全

X-Pack是Elastic Stack扩展功能,提供安全性,警报,监视,报告,机器学习和许多其他功能。 ES7.0+之后,默认情况下,当安装Elasticsearch时,会安装X-Pack,无需单独再安装。 自6.8以及7.1+版本之后,基础级安全永久免费。 默认情况下,拥有安全免费许可证时,Elasticsearch安全功能被禁用。 要启用安全功能,需要设置xpack.security.enabled。 在每个节点的elasticsearch.yml配置文件中,新增: 使用范围:配置传输层安全性适用于具有多个节点的集群以及需要外网通信访问的单节点ES。 使用环回地址127.0.0.1的单节点ES可以不用配置。 Elasticsearch节点可能存储是机密的数据,而无处不在的网络攻击对这些数据垂涎欲滴。 网络攻击包括对数据的嗅探,对数据的操纵,以及试图获得对服务器的访问权限,进而访问存储数据的文件。 保护节点的安全有助于降低来自网络的攻击的风险 。 1、证书实现加密通信的原理 TLS需要X.509证书(X.509 证书是一个数字证书,它使用 X.509 公有密钥基础设施标准将公有密钥与证书中包含的身份相关联。X.509 证书由一家名为证书颁发机构 (CA) 的可信实体颁发。CA 持有一个或多个名为 CA 证书的特殊证书,它使用这种证书来颁发 X.509 证书。只有证书颁发机构才有权访问 CA 证书)才能对与之通信的应用程序执行加密和身份验证。 为了使节点之间的通信真正安全, 必须对证书进行验证 。 在Elasticsearch集群中验证证书真实性的推荐方法是信任签署证书的证书颁发机构(CA)。 这样,只需要使用由同一CA签名的证书,即可自动允许该节点加入集群。 2、借助elasticsearch-certutil命令生成证书 启用安全功能后,必须使用TLS来确保节点之间的通信已加密。 在elasticsearch.yml中心新增配置如下: 借助:elasticsearch-setup-passwords 设置集群密码。 核心: auto - 随机生成密码。 interactive - 自定义不同用户的密码。 注意:必须配置好xpack之后,才能设置密码。否则会报错。 最简单的方法, 假定是初始部署集群阶段。 X-Pack安全配置的核心三步骤: 这些对于安全来说只是皮毛,更多的角色、权限、Space需要借助Kibana实现。 5.1 pom文件 5.2修改配置文件

elasticsearch5.2.2怎么用java api创建索引

一、ElasticSearch是什么?ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的搜索引擎。能够达到实时搜索,稳定,可靠,快速,安装使用方便,零配置和完全。我们先说说ES的基本概念。1、索引(Index)ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库,或者一个数据存储方案(schema)。索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。一个ES集群中可以按需创建任意数目的索引。2、类型(Type)类型是索引内部的逻辑分区(category/partition),然而其意义完全取决于用户需求。因此,一个索引内部可定义一个或多个类型(type)。一般来说,类型就是为那些拥有相同的域的文档做的预定义。例如,在索引中,可以定义一个用于存储用户数据的类型,一个存储日志数据的类型,以及一个存储评论数据的类型。类比传统的关系型数据库领域来说,类型相当于“表”。3、文档(Document)文档是Lucene索引和搜索的原子单位,它是包含了一个或多个域的容器,基于JSON格式进行表示。文档由一个或多个域组成,每个域拥有一个名字及一个或多个值,有多个值的域通常称为“多值域”。每个文档可以存储不同的域集,但同一类型下的文档至应该有某种程度上的相似之处。4、映射(Mapping)ES中,所有的文档在存储之前都要首先进行分析。用户可根据需要定义如何将文本分割成token、哪些token应该被过滤掉,以及哪些文本需要进行额外处理等。另外,ES还提供了额外功能,例如将域中的内容按需排序。事实上,ES也能自动根据其值确定域的类型。5、集群(Cluster)ES集群是一个或多个节点的集合,它们共同存储了整个数据集,并提供了联合索引以及可跨所有节点的搜索能力。多节点组成的集群拥有冗余能力,它可以在一个或几个节点出现故障时保证服务的整体可用性。集群靠其独有的名称进行标识,默认名称为“elasticsearch”。节点靠其集群名称来决定加入哪个ES集群,一个节点只能属一个集群。如果不考虑冗余能力等特性,仅有一个节点的ES集群一样可以实现所有的存储及搜索功能。6、节点(Node)运行了单个实例的ES主机称为节点,它是集群的一个成员,可以存储数据、参与集群索引及搜索操作。类似于集群,节点靠其名称进行标识,默认为启动时自动生成的随机Marvel字符名称。用户可以按需要自定义任何希望使用的名称,但出于管理的目的,此名称应该尽可能有较好的识别性。节点通过为其配置的ES集群名称确定其所要加入的集群。7、分片(Shard)和副本(Replica)ES的“分片(shard)”机制可将一个索引内部的数据分布地存储于多个节点,它通过将一个索引切分为多个底层物理的Lucene索引完成索引数据的分割存储功能,这每一个物理的Lucene索引称为一个分片(shard)。每个分片其内部都是一个全功能且独立的索引,因此可由集群中的任何主机存储。创建索引时,用户可指定其分片的数量,默认数量为5个。ES集群可由多个节点组成,各Shard分布式地存储于这些节点上。ES可自动在节点间按需要移动shard,例如增加节点或节点故障时。简而言之,分片实现了集群的分布式存储,而副本实现了其分布式处理及冗余功能。OK,上面把ES相关的基本概念及原理大致说明了下,那么ES到底是怎么实现全文检索的呢?Elasticsearch实现全文检索,首先要确定分词器,ES默认有很多分词器,可参考官方文档。了解分词器主要是怎么实现的。一般中文分词器使用第三方的ik分词器、mmsegf分词器和paoding分词器,最初可能构建于lucene,后来移植于ES。目前我们在最新版的ES中,使用的是IK分词。安装ik分词器到elasticsearch很简单,它有个插件目录analysis-ik,和一个配置目录ik, 分别拷贝到plugins和conf目录就可以了。当你有大量的文本数据时,ES均会将其进行分词并将这些词语保存在索引中,当输入关键词进行查询时,索引就会起到作用,查找对应的相同的查询词,从而实现全文检索。当然这个过程是很吃内存的哦。

怎么将更改elasticsearch服务端端口

elasticsearch的config文件夹里面有两个配置文 件:elasticsearch.yml和logging.yml,第一个是es的基本配置文件,第二个是日志配置文件,es也是使用log4j来记录日 志的,所以logging.yml里的设置按普通log4j配置文件来设置就行了。下面主要讲解下elasticsearch.yml这个文件中可配置的 东西。cluster.name: elasticsearch配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。node.name: "Franz Kafka"节点名,默认随机指定一个name列表中名字,该列表在es的jar包中config文件夹里name.txt文件中,其中有很多作者添加的有趣名字。node.master: true指定该节点是否有资格被选举成为node,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master。

elasticsearch JPA执行save方法后,发现elasticsearch有文件生成,但数据库中没数据

由于需要提升项目的搜索质量,最近研究了一下Elasticsearch,一款非常优秀的分布式搜索程序。最开始的一些笔记放到github,这里只是归纳总结一下。首先,为什么要使用Elasticsearch?最开始的时候,我们的项目仅仅使用MySQL进行简单的搜索,然后一个不能索引的like语句,直接拉低MySQL的性能。后来,我们曾考虑过sphinx,并且sphinx也在之前的项目中成功实施过,但想想现在的数据量级,多台MySQL,以及搜索服务本身HA,还有后续扩容的问题,我们觉得sphinx并不是一个最优的选择。于是自然将目光放到了Elasticsearch上面。根据官网自己的介绍,Elasticsearch是一个分布式搜索服务,提供Restful API,底层基于Lucene,采用多shard的方式保证数据安全,并且提供自动resharding的功能,加之github等大型的站点也采用 Elasticsearch作为其搜索服务,我们决定在项目中使用Elasticsearch。对于Elasticsearch,如果要在项目中使用,需要解决如下问题:索引,对于需要搜索的数据,如何建立合适的索引,还需要根据特定的语言使用不同的analyzer等。搜索,Elasticsearch提供了非常强大的搜索功能,如何写出高效的搜索语句?数据源,我们所有的数据是存放到MySQL的,MySQL是唯一数据源,如何将MySQL的数据导入到Elasticsearch?对于1和2,因为我们的数据都是从MySQL生成,index的field是固定的,主要做的工作就是根据业务场景设计好对应的mapping以及search语句就可以了,当然实际不可能这么简单,需要我们不断的调优。而对于3,则是需要一个工具将MySQL的数据导入Elasticsearch,因为我们对搜索实时性要求很高,所以需要将MySQL的增量数据实时导入,笔者唯一能想到的就是通过row based binlog来完成。而近段时间的工作,也就是实现一个MySQL增量同步到Elasticsearch的服务。LuceneElasticsearch底层是基于Lucene的,Lucene是一款优秀的搜索lib,当然,笔者以前仍然没有接触使用过。:-)Lucene关键概念:Document:用来索引和搜索的主要数据源,包含一个或者多个Field,而这些Field则包含我们跟Lucene交互的数据。Field:Document的一个组成部分,有两个部分组成,name和value。Term:不可分割的单词,搜索最小单元。Token:一个Term呈现方式,包含这个Term的内容,在文档中的起始位置,以及类型。Lucene使用Inverted index来存储term在document中位置的映射关系。譬如如下文档:Elasticsearch Server 1.0 (document 1)Mastring Elasticsearch (document 2)Apache Solr 4 Cookbook (document 3)使用inverted index存储,一个简单地映射关系:TermCountDocuemnt1.0 14 1Apache 1Cookbook 1Elasticsearch 2 .Mastering 1Server 1Solr 1对于上面例子,我们首先通过分词算法将一个文档切分成一个一个的token,再得到该token与document的映射关系,并记录token出现的总次数。这样就得到了一个简单的inverted index。Elasticsearch关键概念要使用Elasticsearch,笔者认为,只需要理解几个基本概念就可以了。在数据层面,主要有:Index:Elasticsearch用来存储数据的逻辑区域,它类似于关系型数据库中的db概念。一个index可以在一个或者多个shard上面,同时一个shard也可能会有多个replicas。Document:Elasticsearch里面存储的实体数据,类似于关系数据中一个table里面的一行数据。document由多个field组成,不同的document里面同名的field一定具有相同的类型。document里面field可以重复出现,也就是一个field会有多个值,即multivalued。Document type:为了查询需要,一个index可能会有多种document,也就是document type,但需要注意,不同document里面同名的field一定要是相同类型的。Mapping:存储field的相关映射信息,不同document type会有不同的mapping。对于熟悉MySQL的童鞋,我们只需要大概认为Index就是一个db,document就是一行数据,field就是table的column,mapping就是table的定义,而document type就是一个table就可以了。Document type这个概念其实最开始也把笔者给弄糊涂了,其实它就是为了更好的查询,举个简单的例子,一个index,可能一部分数据我们想使用一种查询方式,而另一部分数据我们想使用另一种查询方式,于是就有了两种type了。不过这种情况应该在我们的项目中不会出现,所以通常一个index下面仅会有一个 type。在服务层面,主要有:Node: 一个server实例。Cluster:多个node组成cluster。Shard:数据分片,一个index可能会存在于多个shards,不同shards可能在不同nodes。Replica:shard的备份,有一个primary shard,其余的叫做replica shards。Elasticsearch之所以能动态resharding,主要在于它最开始就预先分配了多个shards(貌似是1024),然后以shard为单位进行数据迁移。这个做法其实在分布式领域非常的普遍,codis就是使用了1024个slot来进行数据迁移。因为任意一个index都可配置多个replica,通过冗余备份的方式保证了数据的安全性,同时replica也能分担读压力,类似于MySQL中的slave。Restful APIElasticsearch提供了Restful API,使用json格式,这使得它非常利于与外部交互,虽然Elasticsearch的客户端很多,但笔者仍然很容易的就写出了一个简易客户端用于项目中,再次印证了Elasticsearch的使用真心很容易。Restful的接口很简单,一个url表示一个特定的资源,譬如/blog/article/1,就表示一个index为blog,type为aritcle,id为1的document。而我们使用http标准method来操作这些资源,POST新增,PUT更新,GET获取,DELETE删除,HEAD判断是否存在。这里,友情推荐httpie,一个非常强大的http工具,个人感觉比curl还用,几乎是命令行调试Elasticsearch的绝配。一些使用httpie的例子:# createhttp POST :9200/blog/article/1 title="hello elasticsearch" tags:="["elasticsearch"]"# gethttp GET :9200/blog/article/1# updatehttp PUT :9200/blog/article/1 title="hello elasticsearch" tags:="["elasticsearch", "hello"]"# deletehttp DELETE :9200/blog/article/1# existshttp HEAD :9200/blog/article/1索引和搜索虽然Elasticsearch能自动判断field类型并建立合适的索引,但笔者仍然推荐自己设置相关索引规则,这样才能更好为后续的搜索服务。我们通过定制mapping的方式来设置不同field的索引规则。而对于搜索,Elasticsearch提供了太多的搜索选项,就不一一概述了。索引和搜索是Elasticsearch非常重要的两个方面,直接关系到产品的搜索体验,但笔者现阶段也仅仅是大概了解了一点,后续在详细介绍。同步MySQL数据Elasticsearch是很强大,但要建立在有足量数据情况下面。我们的数据都在MySQL上面,所以如何将MySQL的数据导入Elasticsearch就是笔者最近研究的东西了。虽然现在有一些实现,譬如elasticsearch-river-jdbc,或者elasticsearch-river-mysql,但笔者并不打算使用。elasticsearch-river-jdbc的功能是很强大,但并没有很好的支持增量数据更新的问题,它需要对应的表只增不减,而这个几乎在项目中是不可能办到的。elasticsearch-river-mysql倒是做的很不错,采用了python-mysql-replication来通过binlog获取变更的数据,进行增量更新,但它貌似处理MySQL dump数据导入的问题,不过这个笔者真的好好确认一下?话说,python-mysql-replication笔者还提交过pull解决了minimal row image的问题,所以对elasticsearch-river-mysql这个项目很有好感。只是笔者决定自己写一个出来。为什么笔者决定自己写一个,不是因为笔者喜欢造轮子,主要原因在于对于这种MySQL syncer服务(增量获取MySQL数据更新到相关系统),我们不光可以用到Elasticsearch上面,而且还能用到其他服务,譬如cache上面。所以笔者其实想实现的是一个通用MySQL syncer组件,只是现在主要关注Elasticsearch罢了。项目代码在这里go-mysql-elasticsearch,现已完成第一阶段开发,内部对接测试中。go-mysql-elasticsearch的原理很简单,首先使用mysqldump获取当前MySQL的数据,然后在通过此时binlog的name和position获取增量数据。一些限制:binlog一定要变成row-based format格式,其实我们并不需要担心这种格式的binlog占用太多的硬盘空间,MySQL 5.6之后GTID模式都推荐使用row-based format了,而且通常我们都会把控SQL语句质量,不允许一次性更改过多行数据的。需要同步的table最好是innodb引擎,这样mysqldump的时候才不会阻碍写操作。需要同步的table一定要有主键,好吧,如果一个table没有主键,笔者真心会怀疑设计这个table的同学编程水平了。多列主键也是不推荐的,笔者现阶段不打算支持。一定别动态更改需要同步的table结构,Elasticsearch只能支持动态增加field,并不支持动态删除和更改field。通常来说,如果涉及到alter table,很多时候已经证明前期设计的不合理以及对于未来扩展的预估不足了。更详细的说明,等到笔者完成了go-mysql-elasticsearch的开发,并通过生产环境中测试了,再进行补充。总结最近一周,笔者花了不少时间在Elasticsearch上面,现在算是基本入门了。其实笔者觉得,对于一门不懂的技术,找一份靠谱的资料(官方文档或者入门书籍),蛋疼的对着资料敲一遍代码,不懂的再问google,最后在将其用到实际项目,这门技术就算是初步掌握了,当然精通还得在下点功夫。现在笔者只是觉得Elasticsearch很美好,上线之后铁定会有坑的,那时候只能慢慢填了。话说,笔者是不是要学习下java了,省的到时候看不懂代码就惨了。:-)

elasticsearch 把很多类型都放在一个索引下面 会不会导致查询慢

主要看数据量ES索引优化篇主要从两个方面解决问题,一是索引数据过程;二是检索过程。(本文主要介绍)索引数据过程我在上面几篇文章中有提到怎么创建索引和导入数据,但是大家可能会遇到索引数据比较慢的过程。其实明白索引的原理就可以有针对性的进行优化。ES索引的过程到相对Lucene的索引过程多了分布式数据的扩展,而这ES主要是用tranlog进行各节点之间的数据平衡。所以从上我可以通过索引的settings进行第一优化:“index.translog.flush_threshold_ops”: “100000″“index.refresh_interval”: “-1″,这两个参数第一是到tranlog数据达到多少条进行平衡,默认为5000,而这个过程相对而言是比较浪费时间和资源的。所以我们可以将这个值调大一些还是设为-1关闭,进而手动进行tranlog平衡。第二参数是刷新频率,默认为120s是指索引在生命周期内定时刷新,一但有数据进来能refresh像lucene里面commit,我们知道当数据addDoucment会,还不能检索到要commit之后才能行数据的检索所以可以将其关闭,在最初索引完后手动refresh一之,然后将索引setting里面的index.refresh_interval参数按需求进行修改,从而可以提高索引过程效率。另外的知道ES索引过程中如果有副本存在,数据也会马上同步到副本中去。我个人建议在索引过程中将副本数设为0,待索引完成后将副本数按需量改回来,这样也可以提高索引效率。“number_of_replicas”: 0上面聊了一次索引过程的优化之后,我们再来聊一下检索速度比较慢的问题,其实检索速度快度与索引质量有很大的关系。而索引质量的好坏与很多因素有关。一、分片数分片数,与检索速度非常相关的的指标,如果分片数过少或过多都会导致检索比较慢。分片数过多会导致检索时打开比较多的文件别外也会导致多台服务器之间通讯。而分片数过少为导至单个分片索引过大,所以检索速度慢。在确定分片数之前需要进行单服务单索引单分片的测试。比如我之前在IBM-3650的机器上,创建一个索引,该索引只有一个分片,分别在不同数据量的情况下进行检索速度测试。最后测出单个分片的内容为20G。所以索引分片数=数据总量/单分片数目前,我们数据量为4亿多条,索引大小为近1.5T左右。因为是文档数据所以单数据都中8K以前。现在检索速度保证在100ms 以下。特别情况在500ms以下,做200,400,800,1000,1000+用户长时间并发测试时最坏在750ms以下.二、副本数副本数与索引的稳定性有比较大的关系,怎么说,如果ES在非正常挂了,经常会导致分片丢失,为了保证这些数据的完整性,可以通过副本来解决这个问题。建议在建完索引后在执行Optimize后,马上将副本数调整过来。大家经常有一个误去副本越多,检索越快,这是不对的,副本对于检索速度其它是减无增的我曾做过实现,随副本数的增加检索速度会有微量的下降,所以大家在设置副本数时,需要找一个平衡值。另外设置副本后,大家有可能会出现两次相同检索,出现出现不同值的情况,这里可能是由于tranlog没有平衡、或是分片路由的问题,可以通过?preference=_primary 让检索在主片分上进行。三、分词其实分词对于索引的影响可大可小,看自己把握。大家越许认为词库的越多,分词效果越好,索引质量越好,其实不然。分词有很多算法,大部分基于词表进行分词。也就是说词表的大小决定索引大小。所以分词与索引膨涨率有直接链接。词表不应很多,而对文档相关特征性较强的即可。比如论文的数据进行建索引,分词的词表与论文的特征越相似,词表数量越小,在保证查全查准的情况下,索引的大小可以减少很多。索引大小减少了,那么检索速度也就提高了。四、索引段索引段即lucene中的segments概念,我们知道ES索引过程中会refresh和tranlog也就是说我们在索引过程中segments number不至一个。而segments number与检索是有直接联系的,segments number越多检索越慢,而将segments numbers 有可能的情况下保证为1这将可以提到将近一半的检索速度。$ curl -XPOST ‘http://localhost:9200/twitter/_optimize? max_num_segments =1′五、删除文档删除文档在Lucene中删除文档,数据不会马上进行硬盘上除去,而进在lucene索引中产生一个.del的文件,而在检索过程中这部分数据也会参与检索,lucene在检索过程会判断是否删除了,如果删除了在过滤掉。这样也会降低检索效率。所以可以执行清除删除文档。$ curl -XPOST ‘http://localhost:9200/twitter/_optimize? only_expunge_deletes =true

elasticsearch应该通过什么方式建立连接

由于需要提升项目的搜索质量,最近研究了一下Elasticsearch,一款非常优秀的分布式搜索程序。最开始的一些笔记放到github,这里只是归纳总结一下。首先,为什么要使用Elasticsearch?最开始的时候,我们的项目仅仅使用MySQL进行简单的搜索,然后一个不能索引的like语句,直接拉低MySQL的性能。后来,我们曾考虑过sphinx,并且sphinx也在之前的项目中成功实施过,但想想现在的数据量级,多台MySQL,以及搜索服务本身HA,还有后续扩容的问题,我们觉得sphinx并不是一个最优的选择。于是自然将目光放到了Elasticsearch上面。根据官网自己的介绍,Elasticsearch是一个分布式搜索服务,提供Restful API,底层基于Lucene,采用多shard的方式保证数据安全,并且提供自动resharding的功能,加之github等大型的站点也采用 Elasticsearch作为其搜索服务,我们决定在项目中使用Elasticsearch。对于Elasticsearch,如果要在项目中使用,需要解决如下问题:索引,对于需要搜索的数据,如何建立合适的索引,还需要根据特定的语言使用不同的analyzer等。搜索,Elasticsearch提供了非常强大的搜索功能,如何写出高效的搜索语句?数据源,我们所有的数据是存放到MySQL的,MySQL是唯一数据源,如何将MySQL的数据导入到Elasticsearch?对于1和2,因为我们的数据都是从MySQL生成,index的field是固定的,主要做的工作就是根据业务场景设计好对应的mapping以及search语句就可以了,当然实际不可能这么简单,需要我们不断的调优。而对于3,则是需要一个工具将MySQL的数据导入Elasticsearch,因为我们对搜索实时性要求很高,所以需要将MySQL的增量数据实时导入,笔者唯一能想到的就是通过row based binlog来完成。而近段时间的工作,也就是实现一个MySQL增量同步到Elasticsearch的服务。LuceneElasticsearch底层是基于Lucene的,Lucene是一款优秀的搜索lib,当然,笔者以前仍然没有接触使用过。:-)Lucene关键概念:Document:用来索引和搜索的主要数据源,包含一个或者多个Field,而这些Field则包含我们跟Lucene交互的数据。Field:Document的一个组成部分,有两个部分组成,name和value。Term:不可分割的单词,搜索最小单元。Token:一个Term呈现方式,包含这个Term的内容,在文档中的起始位置,以及类型。Lucene使用Inverted index来存储term在document中位置的映射关系。譬如如下文档:Elasticsearch Server 1.0 (document 1)Mastring Elasticsearch (document 2)Apache Solr 4 Cookbook (document 3)使用inverted index存储,一个简单地映射关系:TermCountDocuemnt1.0 1 <1> 4 1 <3> Apache 1 <3> Cookbook 1 <3> Elasticsearch 2 <1>.<2> Mastering 1 <2> Server 1 <1> Solr 1 <3> 对于上面例子,我们首先通过分词算法将一个文档切分成一个一个的token,再得到该token与document的映射关系,并记录token出现的总次数。这样就得到了一个简单的inverted index。Elasticsearch关键概念要使用Elasticsearch,笔者认为,只需要理解几个基本概念就可以了。在数据层面,主要有:Index:Elasticsearch用来存储数据的逻辑区域,它类似于关系型数据库中的db概念。一个index可以在一个或者多个shard上面,同时一个shard也可能会有多个replicas。Document:Elasticsearch里面存储的实体数据,类似于关系数据中一个table里面的一行数据。document由多个field组成,不同的document里面同名的field一定具有相同的类型。document里面field可以重复出现,也就是一个field会有多个值,即multivalued。Document type:为了查询需要,一个index可能会有多种document,也就是document type,但需要注意,不同document里面同名的field一定要是相同类型的。Mapping:存储field的相关映射信息,不同document type会有不同的mapping。对于熟悉MySQL的童鞋,我们只需要大概认为Index就是一个db,document就是一行数据,field就是table的column,mapping就是table的定义,而document type就是一个table就可以了。Document type这个概念其实最开始也把笔者给弄糊涂了,其实它就是为了更好的查询,举个简单的例子,一个index,可能一部分数据我们想使用一种查询方式,而另一部分数据我们想使用另一种查询方式,于是就有了两种type了。不过这种情况应该在我们的项目中不会出现,所以通常一个index下面仅会有一个 type。在服务层面,主要有:Node: 一个server实例。Cluster:多个node组成cluster。Shard:数据分片,一个index可能会存在于多个shards,不同shards可能在不同nodes。Replica:shard的备份,有一个primary shard,其余的叫做replica shards。Elasticsearch之所以能动态resharding,主要在于它最开始就预先分配了多个shards(貌似是1024),然后以shard为单位进行数据迁移。这个做法其实在分布式领域非常的普遍,codis就是使用了1024个slot来进行数据迁移。因为任意一个index都可配置多个replica,通过冗余备份的方式保证了数据的安全性,同时replica也能分担读压力,类似于MySQL中的slave。Restful APIElasticsearch提供了Restful API,使用json格式,这使得它非常利于与外部交互,虽然Elasticsearch的客户端很多,但笔者仍然很容易的就写出了一个简易客户端用于项目中,再次印证了Elasticsearch的使用真心很容易。Restful的接口很简单,一个url表示一个特定的资源,譬如/blog/article/1,就表示一个index为blog,type为aritcle,id为1的document。而我们使用http标准method来操作这些资源,POST新增,PUT更新,GET获取,DELETE删除,HEAD判断是否存在。这里,友情推荐httpie,一个非常强大的http工具,个人感觉比curl还用,几乎是命令行调试Elasticsearch的绝配。一些使用httpie的例子:# createhttp POST :9200/blog/article/1 title="hello elasticsearch" tags:="["elasticsearch"]"# gethttp GET :9200/blog/article/1# updatehttp PUT :9200/blog/article/1 title="hello elasticsearch" tags:="["elasticsearch", "hello"]"# deletehttp DELETE :9200/blog/article/1# existshttp HEAD :9200/blog/article/1索引和搜索虽然Elasticsearch能自动判断field类型并建立合适的索引,但笔者仍然推荐自己设置相关索引规则,这样才能更好为后续的搜索服务。我们通过定制mapping的方式来设置不同field的索引规则。而对于搜索,Elasticsearch提供了太多的搜索选项,就不一一概述了。索引和搜索是Elasticsearch非常重要的两个方面,直接关系到产品的搜索体验,但笔者现阶段也仅仅是大概了解了一点,后续在详细介绍。同步MySQL数据Elasticsearch是很强大,但要建立在有足量数据情况下面。我们的数据都在MySQL上面,所以如何将MySQL的数据导入Elasticsearch就是笔者最近研究的东西了。虽然现在有一些实现,譬如elasticsearch-river-jdbc,或者elasticsearch-river-mysql,但笔者并不打算使用。elasticsearch-river-jdbc的功能是很强大,但并没有很好的支持增量数据更新的问题,它需要对应的表只增不减,而这个几乎在项目中是不可能办到的。elasticsearch-river-mysql倒是做的很不错,采用了python-mysql-replication来通过binlog获取变更的数据,进行增量更新,但它貌似处理MySQL dump数据导入的问题,不过这个笔者真的好好确认一下?话说,python-mysql-replication笔者还提交过pull解决了minimal row image的问题,所以对elasticsearch-river-mysql这个项目很有好感。只是笔者决定自己写一个出来。为什么笔者决定自己写一个,不是因为笔者喜欢造轮子,主要原因在于对于这种MySQL syncer服务(增量获取MySQL数据更新到相关系统),我们不光可以用到Elasticsearch上面,而且还能用到其他服务,譬如cache上面。所以笔者其实想实现的是一个通用MySQL syncer组件,只是现在主要关注Elasticsearch罢了。项目代码在这里go-mysql-elasticsearch,现已完成第一阶段开发,内部对接测试中。go-mysql-elasticsearch的原理很简单,首先使用mysqldump获取当前MySQL的数据,然后在通过此时binlog的name和position获取增量数据。一些限制:binlog一定要变成row-based format格式,其实我们并不需要担心这种格式的binlog占用太多的硬盘空间,MySQL 5.6之后GTID模式都推荐使用row-based format了,而且通常我们都会把控SQL语句质量,不允许一次性更改过多行数据的。需要同步的table最好是innodb引擎,这样mysqldump的时候才不会阻碍写操作。需要同步的table一定要有主键,好吧,如果一个table没有主键,笔者真心会怀疑设计这个table的同学编程水平了。多列主键也是不推荐的,笔者现阶段不打算支持。一定别动态更改需要同步的table结构,Elasticsearch只能支持动态增加field,并不支持动态删除和更改field。通常来说,如果涉及到alter table,很多时候已经证明前期设计的不合理以及对于未来扩展的预估不足了。更详细的说明,等到笔者完成了go-mysql-elasticsearch的开发,并通过生产环境中测试了,再进行补充。总结最近一周,笔者花了不少时间在Elasticsearch上面,现在算是基本入门了。其实笔者觉得,对于一门不懂的技术,找一份靠谱的资料(官方文档或者入门书籍),蛋疼的对着资料敲一遍代码,不懂的再问google,最后在将其用到实际项目,这门技术就算是初步掌握了,当然精通还得在下点功夫。现在笔者只是觉得Elasticsearch很美好,上线之后铁定会有坑的,那时候只能慢慢填了。话说,笔者是不是要学习下java了,省的到时候看不懂代码就惨了。:-)

kibana配置elasticsearchurl选项 怎么才能配置灵活

Kibana是一个为ElasticSearch提供的数据分析的Web接口。可使用它对日志进行高效的搜索、可视化、分析等各种操作。Kibana目前最新的版本5.0.2,回顾一下Kibana3和Kibana4的界面。

elasticsearch索引主要实现方式

Elasticsearch是什么?Elasticsearch是位于ElasticStack核心的分布式搜索和分析引擎。Logstash和Beats有助于收集、聚合和丰富您的数据并将其存储在Elasticsearch中。Kibana使您能够以交互方式探索、可视化和分享对数据的见解,并管理。Elasticsearch是一个分布式文档存储。Elasticsearch存储的是序列化为JSON文档的复杂数据结构,而不是以列行数据的形式存储信息。当集群中有多个Elasticsearch节点时,存储的文档分布在整个集群中,可以立即从任何节点访问。Elasticsearch是由ShayBanon发起的一个开源搜索服务器项目,2010年2月发布。迄今,该项目已发展成为搜索和数据分析解决方案领域的主要一员,广泛应用于声名卓著或鲜为人知的搜索应用程序。Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎。它可以在很短的时间内存储,搜索和分析大量的数据。它通常作为具有复杂搜索场景情况下的核心发动机。搜索引擎,不支持join表等操作。主要用于全文检索。不适合做数据库。如何选择合适的数据库解决方案?1、如果有强大的技术团队,关系型和非关系型数据库都可选择。一般来讲,非关系型数据库需要更多管理维护的时间。2、如果你要储存会话信息,用户配置信息,购物车数据,建议使用NoSQL数据库;不过90%的企业或个人,首选数据库都是MySQL数据库。3、(一)、Access(二)SQLServer(三)MySQL,Access是一种桌面数据库,只适合数据量少的应用,在处理少量数据和单机访问的数据库时是很好的,效率也很高。但是它的同时访问客户端不能多于4个。4、虽然把上面的架构全部组合在一起可以形成一个强大的高可用,高负载的数据库系统,但是架构选择合适才是最重要的。混合架构虽然能够解决所有的场景的问题,但是也会面临更多的挑战,你以为的完美架构,背后其实有着更多的坑。5、例如,如果你需要的是数据分析仓库,关系数据库可能不是一个适合的选择;如果你处理事务的应用要求严格的数据完整性和一致性,就不要考虑NoSQL了。不要重新发明轮子在过去的数十年,开源数据库技术迅速发展壮大。6、本文首先讨论了基于第三范式的数据库表的基本设计,着重论述了建立主键和索引的策略和方案,然后从数据库表的扩展设计和库表对象的放置等角度概述了数据库管理系统的优化方案。ElasticSearch倒排索引及其原理1、倒排索引采用ImmutableDesign,一旦生成,不可更改。Segment写入磁盘的过程相对耗时,所以借助文件系统缓存,Refresh时,先将Segment写入文件缓存中,以开放查询。2、之前我们已经了解过,Elasticsearch是一个基于Lucene实现的分布式全文检索引擎,其实Elasticsearch倒排索引就是Lucene的倒排索引。3、所谓的倒排索引,就是把你的数据内容先分词,每句话分成一个一个的关键词,然后记录好每一个关键词对应出现在了哪些id标识的数据。4、可以将对es的操作记录下来,来确保当出现故障的时候,已经落地到磁盘的数据不会丢失,并在重启的时候可以从操作记录中将数据恢复过来。5、Elasticsearch中使用一种称为倒排索引的结构,适用于快速的全文搜索。一个倒排索引由文档中所有不能重复词的列表构成,对于其中每个词,有一个包含它的文档列表。elasticsearch-倒排索引原理1、倒排索引采用ImmutableDesign,一旦生成,不可更改。Segment写入磁盘的过程相对耗时,所以借助文件系统缓存,Refresh时,先将Segment写入文件缓存中,以开放查询。2、Elasticsearch中使用一种称为倒排索引的结构,适用于快速的全文搜索。一个倒排索引由文档中所有不能重复词的列表构成,对于其中每个词,有一个包含它的文档列表。3、elasticsearch提供了translog来记录这些操作,结合oscachedsegments数据定时落盘来实现数据可靠性保证(flush)。文档被添加到buffer同时追加到translog:进行refresh操作,清空buffer,文档可被搜索但尚未flush到磁盘。4、如果Elasticsearch密钥库受密码保护,则必须先输入密钥库密码,然后才能为内置用户设置密码。为弹性用户设置密码后,引导密码不再有效,无法使用该命令。在某些情况下,分片副本的Lucene索引或事务日志可能会损坏。5、Elasticsearch的查询原理是将查询的关键词与倒排索引中的词条进行匹配,查询的关键词与倒排索引中的词条必须完全相同视为匹配,否则不匹配。这意味着在插入文档时是否进行分析和查询时是否进行分析将产生非常不同的结果。6、财务平台亿级数据量毫秒级查询优化之elasticsearch原理解析_wang123459的博客-CSDN博客_elasticsearch查询优化mysql底层B-tree支持矮胖,高胖的时候就很难受,说白了就是数据量多会增加IO操作。ES底层倒排索引。Elasticsearch一般情况下如果es服务正常启动,可以通过接口的方式获取elasticsearch版本信息:curlhttp://10.1:9200上述命令可以得到elasticsearch的服务状态和其他信息包括版本号。Elasticsearch是位于ElasticStack核心的分布式搜索和分析引擎。Logstash和Beats有助于收集、聚合和丰富您的数据并将其存储在Elasticsearch中。ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulweb接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。Elasticsearch架构简单介绍如下。索引索引(index)是Elasticsearch对逻辑数据的逻辑存储,所以它可以分为更小的部分。你可以把索引看成关系型数据库的表。然而,索引的结构是为快速有效的全文索引准备的,特别是它不存储原始值。如何用elasticsearch5.2实现全文索引1、安装ik分词器到elasticsearch很简单,它有个插件目录analysis-ik,和一个配置目录ik,分别拷贝到plugins和conf目录就可以了。2、ES使用倒序索引来加速全文索引。一个倒序索引由两部分组成:如果我们想要搜索quickbrown,我们仅仅只需要找每一个term出现的文档即可。如下图:每一个文档都匹配到了,但是第一个比第二个要匹配的多。3、每次将文本类型数据插入Elasticsearch索引时,都会对其进行分析,然后存储在反向索引中。根据分析器的配置方式,这会影响您的搜索功能,因为分析器也适用于全文搜索。

Elasticsearch中Text和Keyword类型的区别

很多刚开始学习 Elasticsearch 的人经常会混淆Text 和Keyword数据类型。 它们之间的区别很简单,但非常关键。 它们之间的本质区别在于:对于 Text 类型,将文本存储到倒排索引之前,会使用分析器对其进行分析,而 Keyword 类型则不会分析。文档是否被分析过会影响其查询的结果。关于倒排索引和分析器的内容可以参考: https://www.jianshu.com/p/04d29098851a 如果将包含字符串的文档添加到 Elasticsearch,而之前没有定义字段的映射关系,那么 Elasticsearch 会自动创建一个包含 Text 和 Keyword 类型的动态映射。 即使它适用于动态映射,也建议在文档添加之前定义索引的映射关系,以节省空间并提高写入速度。 如:未定义mapping,直接添加文档内容,发现"message”的数据类型是 text ,“message.keyword"的数据类型是 keyword 。 返回mapping的结果 现在新建一个索引 text-vs-keyword ,并设置其mapping, keyword_field 字段设置为 keyword 类型, text_field 字段设置为 text 类型, text_and_keyword_mapping 为多字段类型,其本身为 text 类型,而 text_and_keyword_mapping.keyword 字段为 keyword 类型。 这两种字段类型在倒排索引中的存储方式不同,索引过程中的差异会影响Elasticsearch 进行查询的时间。 首先添加一条文档 添加后,索引中便会有一条文档 对于 keyword 类型,由于Elasticsearch不会使用分析器对其进行分析,所以你输入什么文本,索引就会按照原样进行保存。下图为文本在倒排索引中存储的样子。对于 text 类型,Elasticsearch会先使用分析器对文本进行分析,再存储到倒排索引中。Elasticsearch默认使用标准分析器(standard analyzer),先对文本分词再转化为小写。关于标准分析器可以参考先前文章: https://www.jianshu.com/p/04d29098851a 标准分析器对文本进行分析后的结果 根据分析后的结果,下图为分词存储在倒排索引中的样子。 现在已经知道了 Text 和 Keyword 存储在倒排索引中的区别,接下来学习他们在查询中的区别。 查询分为两种查询 Match Query 和 Term Query 的区别与 Text 和 Keyword 的区别类似, Match Query 在查询时会对输入的关键词进行分析,而 Term Query 不会。 Elasticsearch 的查询原理是将查询的关键词与倒排索引中的词条进行匹配,查询的关键词与倒排索引中的词条必须完全相同视为匹配,否则不匹配。 这意味着在插入文档时是否进行分析和查询时是否进行分析将产生非常不同的结果。 不同的字段和不同的查询一共可以产生4种情况:以X代表不分析,O代表分析,左侧代表插入文档时是否分析,右侧代表查询时是否分析,则OX代表插入时分析,查询时不分析。 由于插入文档的 keyword 字段和 Term Query 查询时都不会进行分析,因此只有当文本完全匹配才会返回结果。 如果尝试文档中的一些词,由于不能与整篇文档相匹配,也不会返回结果。 这里有个疑问,查询关键词分析后的各个分词与倒排索引中的“The quick brown fox jumps over the lazy dog”不完全匹配,但为什么会产生结果呢? 这是因为我们在 Match Query 查询时使用的分析器不是标准分析器,Elasticsearch使用了关键词分析器(Keyword Analyzer),因此 Elasticsearch 在查询中没有任何改变。更多分析器可以参考: https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-analyzers.html 查看Keyword Analyzer分析后的结果,发现并没有对搜索关键词进行分词。 当选择标准分词器时进行 Match Query 查询时将不会得到任何结果。 text 字段在文档插入时会对文本进行分析,得到若干个分词。 尝试两条查询语句,一条查询关键词为完整的句子,另一条只有一个单词。 两条语句都返回空结果: 将查询单词转换为小写试下,由于查询关键字"the"与倒排索引中的"the"正好匹配,所以会返回该条记录。 text 字段和Match Query查询都会进行分析。 下面尝试两条查询语句 这两条查询语句都返回了结果: 以下情况推荐使用 keyword 类型: 掌握 text 和 keyword 数据类型的工作原理是学习Elasticsearch的内容之一,这两者的区别似乎很简单,但非常重要。如果需要两种数据类型,则可以在创建映射时使用多字段功能。 https://codecurated.com/blog/elasticsearch-text-vs-keyword/

ElasticSearch性能优化实践(JVM调优+ES调优)

近一年内对公司的 ELK 日志系统做过性能优化,也对 SkyWalking 使用的 ES 存储进行过性能优化,在此做一些总结。本篇主要是讲 ES 在 ELK 架构中作为日志存储时的性能优化方案。 随着接入ELK的应用越来越多, 每日新增索引约 230 个,新增 document 约 3000万到 5000万 。 每日上午和下午是日志上传高峰期,在 Kibana 上查看日志,发现问题: (1) 日志会有 5-40 分钟的延迟 (2) 有很多日志丢失,无法查到 数据先是存放在 ES 的内存 buffer,然后执行 refresh 操作写入到操作系统的内存缓存 os cache,此后数据就可以被搜索到。 所以,日志延迟可能是我们的数据积压在 buffer 中没有进入 os cache 。 查看日志发现很多 write 拒绝执行的情况 从日志中可以看出 ES 的 write 线程池已经满负荷,执行任务的线程已经达到最大16个线程,而200容量的队列也已经放不下新的task。 查看线程池的情况也可以看出 write 线程池有很多写入的任务 所以我们需要优化 ES 的 write 的性能。 ES 的优化分为很多方面,我们要根据使用场景考虑对 ES 的要求。 根据个人实践经验,列举三种不同场景下的特点 : 这三类场景的特点如下: 关于实时性 可以从三方面进行优化:JVM性能调优、ES性能调优、控制数据来源 可以从三方面进行优化:JVM 性能调优、ES 性能调优、控制数据来源 第一步是 JVM 调优。 因为 ES 是依赖于 JVM 运行,没有合理的设置 JVM 参数,将浪费资源,甚至导致 ES 很容易 OOM 而崩溃。 (1) 查看 GC 日志 (2) 使用 jstat 看下每秒的 GC 情况 用下面几种方式都可查看新、老年代内存大小 (1) 使用 jstat -gc pid 查看 Eden 区、老年代空间大小 (2) 使用 jmap -heap pid 查看 Eden 区、老年代空间大小 (3) 查看 GC 日志中的 GC 明细 上面的几种方式都查询出,新生代总内存约1081M,即1G左右;老年代总内存为19864000K,约19G。新、老比例约1:19,出乎意料。 这真是一个容易踩坑的地方。 如果没有显示设置新生代大小,JVM 在使用 CMS 收集器时会自动调参,新生代的大小在没有设置的情况下是通过计算得出的,其大小可能与 NewRatio 的默认配置没什么关系而与 ParallelGCThreads 的配置有一定的关系。 所以: 新生代大小有不确定性,最好配置 JVM 参数 -XX:NewSize、-XX:MaxNewSize 或者 -xmn ,免得遇到一些奇怪的 GC,让人措手不及。 新生代过小,老年代过大的影响 32G 的内存,分配 20G 给堆内存是不妥当的,所以调整为总内存的50%,即16G。 修改 elasticsearch 的 jvm.options 文件 设置要求: 因为指定新生代空间大小,导致 JVM 自动调参只分配了 1G 内存给新生代。 修改 elasticsearch 的 jvm.options 文件,加上 老年代则自动分配 16G-8G=8G 内存,新生代老年代的比例为 1:1。修改后每次 Young GC 频率更低,且每次 GC 后只有少数数据会进入老年代。 ES默认使用的垃圾回收器是:老年代(CMS)+ 新生代(ParNew)。如果是JDK1.9,ES 默认使用G1垃圾回收器。 因为使用的是 JDK1.8,所以并未切换垃圾回收器。后续如果再有性能问题再切换G1垃圾回收器,测试是否有更好的性能。 优化前 每秒打印一次 GC 数据。可以看出,年轻代增长速度很快,几秒钟年轻代就满了,导致 Young GC 触发很频繁,几秒钟就会触发一次。而每次 Young GC 很大可能有存活对象进入老年代,而且,存活对象多的时候(看上图中第一个红框中的old gc数据),有(51.44-51.08)/100 * 19000M = 约68M。每次进入老年代的对象较多,加上频繁的 Young GC,会导致新老年代的分代模式失去了作用,相当于老年代取代了新生代来存放近期内生成的对象。当老年代满了,触发 Full GC,存活的对象也会很多,因为这些对象很可能还是近期加入的,还存活着,所以一次 Full GC 回收对象不多。而这会恶性循环,老年代很快又满了,又 Full GC,又残留一大部分存活的,又很容易满了,所以导致一直频繁 Full GC。 优化后 每秒打印一次 GC 数据。可以看出,新生代增长速度慢了许多,至少要60秒才会满,如上图红框中数据,进入老年代的对象约(15.68-15.60)/100 * 10000 = 8M,非常的少。所以要很久才会触发一次 Full GC 。而且等到 Full GC 时,老年代里很多对象都是存活了很久的,一般都是不会被引用,所以很大一部分会被回收掉,留一个比较干净的老年代空间,可以继续放很多对象。 ES 启动后,运行14个小时 优化前 Young GC 每次的时间是不长的,从上面监控数据中可以看出每次GC时长 1467.995/27276 约等于 0.05秒。那一秒钟有多少时间实在处理Young GC ? 计算公式:1467秒/ (60秒×60分 14小时)= 约0.028秒,也就是100秒中就有2.8秒在Young GC,也就是有2.8S的停顿,这对性能还是有很大消耗的。同时也可以算出多久一次Young GC, 方程是: 60秒×60分*14小时/ 27276次 = 1次/X秒,计算得出X = 0.54,也就是0.54秒就会有一次Young GC,可见 Young GC 频率非常频繁。 优化后 Young GC 次数只有修改前的十分之一,Young GC 时间也是约八分之一。Full GC 的次数也是只有原来的八分之一,GC 时间大约是四分之一。 GC 对系统的影响大大降低,性能已经得到很大的提升。 上面已经分析过ES作为日志存储时的特性是:高并发写、读少、接受30秒内的延时、可容忍部分日志数据丢失。 下面我们针对这些特性对ES进行调优。 本人整理了一下数据写入的底层原理 refresh ES 接收数据请求时先存入 ES 的内存中,默认每隔一秒会从内存 buffer 中将数据写入操作系统缓存 os cache,这个过程叫做 refresh; 到了 os cache 数据就能被搜索到(所以我们才说 ES 是近实时的,因为1s 的延迟后执行 refresh 便可让数据被搜索到) fsync translog 会每隔5秒或者在一个变更请求完成之后执行一次 fsync 操作,将 translog 从缓存刷入磁盘,这个操作比较耗时,如果对数据一致性要求不是跟高时建议将索引改为异步,如果节点宕机时会有5秒数据丢失; flush ES 默认每隔30分钟会将 os cache 中的数据刷入磁盘同时清空 translog 日志文件,这个过程叫做 flush。 merge ES 的一个 index 由多个 shard 组成,而一个 shard 其实就是一个 Lucene 的 index ,它又由多个 segment 组成,且 Lucene 会不断地把一些小的 segment 合并成一个大的 segment ,这个过程被称为 段merge 。执行索引操作时, ES会先生成小的segment ,ES 有离线的逻辑对小的 segment 进行合并,优化查询性能。但是合并过程中会消耗较多磁盘 IO,会影响查询性能。 为了保证不丢失数据,就要保护 translog 文件的安全: 该方式提高数据安全性的同时, 降低了一点性能. ==> 频繁地执行 fsync 操作, 可能会产生阻塞导致部分操作耗时较久. 如果允许部分数据丢失, 可设置异步刷新 translog 来提高效率,还有降低 flush 的阀值,优化如下: 写入 Lucene 的数据,并不是实时可搜索的,ES 必须通过 refresh 的过程把内存中的数据转换成 Lucene 的完整 segment 后,才可以被搜索。 默认1秒后,写入的数据可以很快被查询到,但势必会产生大量的 segment,检索性能会受到影响。所以,加大时长可以降低系统开销。对于日志搜索来说,实时性要求不是那么高,设置为5秒或者10s;对于SkyWalking,实时性要求更低一些,我们可以设置为30s。 设置如下: index.merge.scheduler.max_thread_count 控制并发的 merge 线程数,如果存储是并发性能较好的 SSD,可以用系统默认的 max(1, min(4, availableProcessors / 2)),当节点配置的 cpu 核数较高时,merge 占用的资源可能会偏高,影响集群的性能,普通磁盘的话设为1,发生磁盘 IO 堵塞。设置max_thread_count 后,会有 max_thread_count + 2 个线程同时进行磁盘操作,也就是设置为 1 允许3个线程。 设置如下: 该方式可对已经生成的索引做修改,但是对于后续新建的索引不生效,所以我们可以制作 ES 模板,新建的索引按模板创建索引。 因为我们的业务日志是按天维度创建索引,索引名称示例:user-service-prod-2020.12.12,所以用通配符 202 ..*匹配对应要创建的业务日志索引。 前文已经提到过,write 线程池满负荷,导致拒绝任务,而有的数据无法写入。 而经过上面的优化后,拒绝的情况少了很多,但是还是有拒绝任务的情况。 所以我们还需要优化write线程池。 从 prometheus 监控中可以看到线程池的情况: 为了更直观看到ES线程池的运行情况,我们安装了 elasticsearch_exporter 收集 ES 的指标数据到 prometheus,再通过 grafana 进行查看。 经过上面的各种优化,拒绝的数据量少了很多,但是还是存在拒绝的情况,如下图: write 线程池如何设置: 参考: ElasticSearch线程池 write 线程池采用 fixed 类型的线程池,也就是核心线程数与最大线程数值相同。线程数默认等于 cpu 核数,可设置的最大值只能是 cpu 核数加1,也就是16核CPU,能设置的线程数最大值为17。 优化的方案: config/elasticsearch.yml文件增加配置 优化后效果 Swap 交换分区 : 参考: ElasticSearch官方解释为什么要禁用交换内存 有三种方式可以实现 ES 不使用Swap分区 执行命令 可以临时禁用 Swap 内存,但是操作系统重启后失效 执行下列命令 正常情况下不会使用 Swap,除非紧急情况下才会 Swap。 config/elasticsearch.yml 文件增加配置 分片 索引的大小取决于分片与段的大小,分片过小,可能导致段过小,进而导致开销增加;分片过大可能导致分片频繁 Merge,产生大量 IO 操作,影响写入性能。 因为我们每个索引的大小在15G以下,而默认是5个分片,没有必要这么多,所以调整为3个。 分片的设置我们也可以配置在索引模板。 副本数 减少集群副本分片数,过多副本会导致 ES 内部写扩大。副本数默认为1,如果某索引所在的1个节点宕机,拥有副本的另一台机器拥有索引备份数据,可以让索引数据正常使用。但是数据写入副本会影响写入性能。对于日志数据,有1个副本即可。对于大数据量的索引,可以设置副本数为0,减少对性能的影响。 分片的设置我们也可以配置在索引模板。 有的应用1天生成10G日志,而一般的应用只有几百到1G。一天生成10G日志一般是因为部分应用日志使用不当,很多大数量的日志可以不打,比如大数据量的列表查询接口、报表数据、debug 级别日志等数据是不用上传到日志服务器,这些 即影响日志存储的性能,更影响应用自身性能 。 优化后的两周内ELK性能良好,没有使用上的问题: 参考

如何用elasticsearch5.2实现全文索引

一、ElasticSearch是什么?ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。能够达到实时搜索,稳定,可靠,快速,安装使用方便,零配置和完全免费。我们先说说ES的基本概念。1、索引(Index)ES将数据存储于一个或多个索引中,索引是具有类似特性的文档的集合。类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库,或者一个数据存储方案(schema)。索引由其名称(必须为全小写字符)进行标识,并通过引用此名称完成文档的创建、搜索、更新及删除操作。一个ES集群中可以按需创建任意数目的索引。2、类型(Type)类型是索引内部的逻辑分区(category/partition),然而其意义完全取决于用户需求。因此,一个索引内部可定义一个或多个类型(type)。一般来说,类型就是为那些拥有相同的域的文档做的预定义。例如,在索引中,可以定义一个用于存储用户数据的类型,一个存储日志数据的类型,以及一个存储评论数据的类型。类比传统的关系型数据库领域来说,类型相当于“表”。3、文档(Document)文档是Lucene索引和搜索的原子单位,它是包含了一个或多个域的容器,基于JSON格式进行表示。文档由一个或多个域组成,每个域拥有一个名字及一个或多个值,有多个值的域通常称为“多值域”。每个文档可以存储不同的域集,但同一类型下的文档至应该有某种程度上的相似之处。4、映射(Mapping)ES中,所有的文档在存储之前都要首先进行分析。用户可根据需要定义如何将文本分割成token、哪些token应该被过滤掉,以及哪些文本需要进行额外处理等。另外,ES还提供了额外功能,例如将域中的内容按需排序。事实上,ES也能自动根据其值确定域的类型。5、集群(Cluster)ES集群是一个或多个节点的集合,它们共同存储了整个数据集,并提供了联合索引以及可跨所有节点的搜索能力。多节点组成的集群拥有冗余能力,它可以在一个或几个节点出现故障时保证服务的整体可用性。集群靠其独有的名称进行标识,默认名称为“elasticsearch”。节点靠其集群名称来决定加入哪个ES集群,一个节点只能属一个集群。如果不考虑冗余能力等特性,仅有一个节点的ES集群一样可以实现所有的存储及搜索功能。6、节点(Node)运行了单个实例的ES主机称为节点,它是集群的一个成员,可以存储数据、参与集群索引及搜索操作。类似于集群,节点靠其名称进行标识,默认为启动时自动生成的随机Marvel字符名称。用户可以按需要自定义任何希望使用的名称,但出于管理的目的,此名称应该尽可能有较好的识别性。节点通过为其配置的ES集群名称确定其所要加入的集群。7、分片(Shard)和副本(Replica)ES的“分片(shard)”机制可将一个索引内部的数据分布地存储于多个节点,它通过将一个索引切分为多个底层物理的Lucene索引完成索引数据的分割存储功能,这每一个物理的Lucene索引称为一个分片(shard)。每个分片其内部都是一个全功能且独立的索引,因此可由集群中的任何主机存储。创建索引时,用户可指定其分片的数量,默认数量为5个。ES集群可由多个节点组成,各Shard分布式地存储于这些节点上。ES可自动在节点间按需要移动shard,例如增加节点或节点故障时。简而言之,分片实现了集群的分布式存储,而副本实现了其分布式处理及冗余功能。OK,上面把ES相关的基本概念及原理大致说明了下,那么ES到底是怎么实现全文检索的呢?Elasticsearch实现全文检索,首先要确定分词器,ES默认有很多分词器,可参考官方文档。了解分词器主要是怎么实现的。一般中文分词器使用第三方的ik分词器、mmsegf分词器和paoding分词器,最初可能构建于lucene,后来移植于ES。目前我们在最新版的ES中,使用的是IK分词。安装ik分词器到elasticsearch很简单,它有个插件目录analysis-ik,和一个配置目录ik, 分别拷贝到plugins和conf目录就可以了。当你有大量的文本数据时,ES均会将其进行分词并将这些词语保存在索引中,当输入关键词进行查询时,索引就会起到作用,查找对应的相同的查询词,从而实现全文检索。当然这个过程是很吃内存的哦。

全文搜索之MySQL与ElasticSearch搜索引擎

MySQL支持全文索引和搜索功能。在MySQL中可以在CHAR、VARCHAR或TEXT列使用FULLTETXT来创建全文索引。 FULLTEXT索引主要用MATCH()...AGAINST语法来实现搜索: MySQL的全文搜索存在以下局限: 通常来说MySQL自带的全文搜索使用起来局限性比较大,性能和功能都不太成熟,主要适用于小项目,大项目还是建议使用elasticsearch来做全文搜索。 ElasticSearch是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据,以下简称ES。 Elasticsearch 在 Apache Lucene 的基础上开发而成,Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件。Elastic Stack 是适用于数据采集、充实、存储、分析和可视化的一组开源工具。 Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据中心,再通过分词控制器去将对应的数据分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。 由于ES是基于RESTfull Web接口的,因此我们直接按照惯例传递JSON参数调用接口即可实现增删改查,并且不需要我们做额外的管理操作就可以直接索引文档,ES已经内置了所有的缺省操作,可以自动帮我们定义类型。 再次执行PUT,会对库中已有的id为1的数据进行覆盖,每修改一次_version字段的版本号就会加1。 默认搜索会返回前10个结果: 返回的几个关键词: 查询字符串搜索,可以像传递URL参数一样传递查询语句。 精确查询: 全文搜索: 以上两种方法都需要考虑数据更改后如何与ES进行同步。

ElasticSearch存储

使用ElasticSearch快一年了,自认为相关API使用的还比较6,产品提的一些搜索需求实现起来都从心应手;但是前几天同事的一个问题直接将我打回到小白,同事问了句:“ ElasticSearch的索引是怎么存储的?删除文档和更新文档是怎么实现的? ”,当时我就懵逼了,说了句得查一下,好尴尬...... 回想起来发现自己从来都没有深入了解过这些细节,于是便觉得非常有必要对ElasticSearch的文档存储做一次深入的了解,知其然不知其所以然对于我们来说是远远不够的,在ElasticSearch中,文档( Document )存储的介质分为内存和硬盘两种: 同时,ElasticSearch进程自身的运行也需要内存空间,必须保证ElasticSearch进程有充足的运行时内存。为了使ElasticSearch引擎达到最佳性能,必须合理分配有限的内存和硬盘资源。 ElasticSearch引擎把文档数据写入到倒排索引( Inverted Index )的数据结构中,倒排索引建立的是分词( Term )和文档( Document )之间的映射关系,在倒排索引中,数据是面向词( Term )而不是面向文档( Document )的。 举个栗子,假设我们有两个文档,每个文档的content域包含如下内容: 1. The quick brown fox jumped over the lazy dog 2. Quick brown foxes leap over lazy dogs in summer 文档和词之间的关系如下图: 字段值被分析之后,存储在倒排索引中,倒排索引存储的是分词( Term )和文档( Doc )之间的关系,简化版的倒排索引如下图: 从图中可以看出,倒排索引有一个词条的列表,每个分词在列表中是唯一的,记录着词条出现的次数,以及包含词条的文档。实际中ElasticSearch引擎创建的倒排索引比这个复杂得多。 段是倒排索引的组成部分,倒排索引是由段( Segment )组成的,段存储在硬盘( Disk )文件中。 索引段不是实时更新的,这意味着,段在写入硬盘之后,就不再被更新。在删除文档时,ElasticSearch引擎把已删除的文档的信息存储在一个单独的文件中,在搜索数据时,ElasticSearch引擎首先从段中执行查询,再从查询结果中过滤被删除的文档 。这意味着,段中存储着被删除的文档,这使得段中含有”正常文档“的密度降低。 多个段可以通过段合并(Segment Merge)操作把“已删除”的文档将从段中物理删除,把未删除的文档合并到一个新段中,新段中没有”已删除文档“,因此,段合并操作能够提高索引的查找速度 ;但是,段合并是IO密集型操作,需要消耗大量的硬盘IO。 在ElasticSearch中,大多数查询都需要从硬盘文件(索引的段数据存储在硬盘文件中)中获取数据;因此, 在全局配置文件elasticsearch.yml 中,把结点的路径(Path)配置为性能较高的硬盘,能够提高查询性能 。默认情况下,ElasticSearch使用基于安装目录的相对路径来配置结点的路径,安装目录由属性path.home显示,在home path下,ElasticSearch自动创建config,data,logs和plugins目录,一般情况下不需要对结点路径单独配置。结点的文件路径配置项: path.data:设置ElasticSearch结点的索引数据保存的目录,多个数据文件使用逗号隔开。 例如,path.data: /path/to/data1,/path/to/data2 ; path.work:设置ElasticSearch的临时文件保存的目录; 映射参数index决定ElasticSearch引擎是否对文本字段执行分析操作,也就是说分析操作把文本分割成一个一个的分词,也就是标记流( Token Stream ),把分词编入索引,使分词能够被搜索到: 1) 当index为analyzed时,该字段是分析字段,ElasticSearch引擎对该字段执行分析操作,把文本分割成分词流,存储在倒排索引中,使其支持全文搜索。 2)当index为not_analyzed时,该字段不会被分析,ElasticSearch引擎把原始文本作为单个分词存储在倒排索引中,不支持全文搜索,但是支持词条级别的搜索;也就是说,字段的原始文本不经过分析而存储在倒排索引中,把原始文本编入索引,在搜索的过程中,查询条件必须全部匹配整个原始文本。 3)当index为no时,该字段不会被存储到倒排索引中,不会被搜索到。 字段的原始值是否被存储到倒排索引,是由映射参数store决定的,默认值是false,也就是,原始值不存储到倒排索引中。 映射参数index和store的区别在于: store用于获取(Retrieve)字段的原始值,不支持查询,可以使用投影参数fields,对stroe属性为true的字段进行过滤,只获取(Retrieve)特定的字段,减少网络负载; index用于查询(Search)字段,当index为analyzed时,对字段的分词执行全文查询;当index为not_analyzed时,字段的原始值作为一个分词,只能对字段的原始文本执行词条查询; 如果设置字段的index属性为not_analyzed,原始文本将作为单个分词,其最大长度跟UTF8 编码有关,默认的最大长度是32766Bytes(约32KB),如果字段的文本超过该限制,那么ElasticSearch将跳过( Skip )该文档,并在Response中抛出异常消息: operation[607]: index returned 400 _index: ebrite _type: events _id: 76860 _version: 0 error: Type: illegal_argument_exception Reason: "Document contains at least one immense term in field="event_raw" (whose UTF8 encoding is longer than the max length 32766), all of which were skipped. Please correct the analyzer to not produce such terms. The prefix of the first immense term is: "[112, 114,... 115]...", original message: bytes can be at most 32766 in length; got 35100" CausedBy:Type: max_bytes_length_exceeded_exception Reason: "bytes can be at most 32766 in length; got 35100" 可以在字段中设置ignore_above属性,该属性值指的是字符数量,而不是字节数量;由于一个UTF8字符最多占用3个字节,因此,可以设置 “ignore_above”:10000 这样,超过30000字节之后的字符将会被分析器忽略,单个分词( Term )的最大长度是30000Bytes。 The value for ignore_above is the character count, but Lucene counts bytes. If you use UTF-8 text with many non-ASCII characters, you may want to set the limit to 32766 / 3 = 10922 since UTF-8 characters may occupy at most 3 bytes. 默认情况下,大多数字段被索引之后,能够被搜索到。 倒排索引是由一个有序的词条列表构成的,每一个词条在列表中都是唯一存在的,通过这种数据存储模式,你可以很快查找到包含某一个词条的文档列表 。 但是,排序和聚合操作采用相反的数据访问模式,这两种操作不是查找词条以发现文档,而是查找文档,以发现字段中包含的词条。ElasticSearch使用列式存储实现排序和聚合查询。 文档值( doc_values )是存储在硬盘上的数据结构,在索引时( index time )根据文档的原始值创建,文档值是一个列式存储风格的数据结构,非常适合执行存储和聚合操作,除了字符类型的分析字段之外,其他字段类型都支持文档值存储。默认情况下,字段的文档值存储是启用的,除了字符类型的分析字段之外。如果不需要对字段执行排序或聚合操作,可以禁用字段的文档值,以节省硬盘空间。 字符类型的分析字段,不支持文档值(doc_values),但支持fielddata数据结构。fielddata数据结构存储在JVM的堆内存中。相比文档值(数据存储在硬盘上),fielddata字段(数据存储在内存中)的查询性能更高。默认情况下,ElasticSearch引擎在第一次对字段执行聚合或排序查询时(query-time),创建fielddata数据结构;在后续的查询请求中,ElasticSearch引擎使用fielddata数据结构以提高聚合和排序的查询性能。 在ElasticSearch中,倒排索引的各个段( segment )的数据存储在硬盘文件上,从整个倒排索引的段中读取字段数据之后,ElasticSearch引擎首先反转词条和文档之间的关系,创建文档和词条之间的关系,即创建顺排索引,然后把顺排索引存储在JVM的堆内存中。把倒排索引加载到fielddata结构是一个非常消耗硬盘IO资源的过程。因此,数据一旦被加载到内存,最好保持在内存中,直到索引段( segment )的生命周期结束。 默认情况下,倒排索引的每个段( segment ),都会创建相应的fielddata结构,以存储字符类型的分析字段值,但是,需要注意的是,分配的JVM堆内存是有限的,Fileddata把数据存储在内存中,会占用过多的JVM堆内存,甚至耗尽JVM赖以正常运行的内存空间,反而会降低ElasticSearch引擎的查询性能。 fielddata会消耗大量的JVM内存,因此,尽量为JVM设置大的内存,不要为不必要的字段启用fielddata存储。通过format参数控制是否启用字段的fielddata特性,字符类型的分析字段,fielddata的默认值是paged_bytes,这就意味着,默认情况下,字符类型的分析字段启用fielddata存储。一旦禁用fielddata存储,那么字符类型的分析字段将不再支持排序和聚合查询。 loading属性控制fielddata加载到内存的时机,可能的值是lazy,eager和eager_global_ordinals,默认值是lazy。 lazy:fielddata只在需要时加载到内存,默认情况下,在第一次搜索时,fielddata被加载到内存中;但是,如果查询一个非常大的索引段(Segment),lazy加载方式会产生较大的时间延迟。 eager:在倒排索引的段可用之前,其数据就被加载到内存,eager加载方式能够减少查询的时间延迟,但是,有些数据可能非常冷,以至于没有请求来查询这些数据,但是冷数据依然被加载到内存中,占用紧缺的内存资源。 eager_global_ordinals:按照global ordinals积极把fielddata加载到内存。 ElasticSearch使用 JAVA_OPTS 环境变量( Environment Variable )启动JVM进程,在 JAVA_OPTS 中,最重要的配置是: -Xmx参数控制分配给JVM进程的最大内存,-Xms参数控制分配给JVM进程的最小内存 。(在ElasticSearch启动命令后面可以通过参数方式配置,如: /usr/local/elasticsearch/bin/elasticsearch -d --Xmx=10g --Xms=10g )通常情况下,使用默认的配置就能满足工程需要。 ES_HEAP_SIZE 环境变量控制分配给JVM进程的堆内存( Heap Memory )大小,顺排索引( fielddata )的数据存储在堆内存( Heap Memory )中。 大多数应用程序尝试使用尽可能多的内存,并尽可能把未使用的内存换出,但是,内存换出会影响ElasticSearch引擎的查询性能,推荐启用内存锁定,禁用ElasticSearch内存的换进换出。 在全局配置文档 elasticsearch.yml 中,设置 bootstrap.memory_lock 为ture,这将锁定ElasticSearch进程的内存地址空间,阻止ElasticSearch内存被OS换出( Swap out )。 通过学习,算是对ElasticSearch索引存储及更新有了一个较深的了解,至少能让我从容去面对同事的提问,但与此同时给我敲响了警钟,在使用一门技术的同时,更应该去了解它具体的原理,而不仅仅是停留在使用级别;在学习的路上,我们仍需要更加努力......

Elasticsearch数据迁移与集群容灾

本文讨论如何跨集群迁移ES数据以及如何实现ES的同城跨机房容灾和异地容灾。 在ES的生产实践中,往往会遇到以下问题: 根据业务需求,存在以下场景: 如果是第一种场景,数据迁移过程中可以停止写入,可以采用诸如elasticsearch-dump、logstash、reindex、snapshot等方式进行数据迁移。实际上这几种工具大体上可以分为两类: 如果是第二种场景,数据迁移过程中旧集群不能停止写入,需要根据实际的业务场景解决数据一致性的问题: 下面介绍一下在旧集群可以停止写入的情况下进行数据迁移的几种工具的用法。 elasticsearch-dump是一款开源的ES数据迁移工具,github地址: https://github.com/taskrabbit/elasticsearch-dump 以下操作通过elasticdump命令将集群x.x.x.1中的companydatabase索引迁移至集群x.x.x.2。注意第一条命令先将索引的settings先迁移,如果直接迁移mapping或者data将失去原有集群中索引的配置信息如分片数量和副本数量等,当然也可以直接在目标集群中将索引创建完毕后再同步mapping与data logstash支持从一个ES集群中读取数据然后写入到另一个ES集群,因此可以使用logstash进行数据迁移,具体的配置文件如下: 上述配置文件将源ES集群的所有索引同步到目标集群中,当然可以设置只同步指定的索引,logstash的更多功能可查阅logstash官方文档 logstash 官方文档 . reindex是Elasticsearch提供的一个api接口,可以把数据从一个集群迁移到另外一个集群。 snapshot api是Elasticsearch用于对数据进行备份和恢复的一组api接口,可以通过snapshot api进行跨集群的数据迁移,原理就是从源ES集群创建数据快照,然后在目标ES集群中进行恢复。需要注意ES的版本问题: 如果旧集群不能停止写入,此时进行在线数据迁移,需要保证新旧集群的数据一致性。目前看来,除了官方提供的CCR功能,没有成熟的可以严格保证数据一致性的在线数据迁移方法。此时可以从业务场景出发,根据业务写入数据的特点选择合适的数据迁移方案。 一般来说,业务写入数据的特点有以下几种: 下面来具体分析不同的写入数据的特点下,该如何选择合适的数据迁移方式。 在日志或者APM的场景中,数据都是时序数据,一般索引也都是按天创建的,当天的数据只会写入当前的索引中。此时,可以先把存量的不再写入的索引数据一次性同步到新集群中,然后使用logstash或者其它工具增量同步当天的索引,待数据追平后,把业务对ES的访问切换到新集群中。 具体的实现方案为: add only的数据写入方式,可以按照数据写入的顺序(根据_doc进行排序,如果有时间戳字段也可以根据时间戳排序)批量从旧集群中拉取数据,然后再批量写入新集群中;可以通过写程序,使用用scroll api 或者search_after参数批量拉取增量数据,再使用bulk api批量写入。 使用scroll拉取增量数据: 上述操作可以每分钟执行一次,拉起前一分钟新产生的数据,所以数据在旧集群和新集群的同步延迟为一分钟。 使用search_after批量拉取增量数据: 上述操作可以根据需要自定义事件间隔执行,每次执行时修改search_after参数的值,获取指定值之后的多条数据;search_after实际上相当于一个游标,每执行一次向前推进,从而获取到最新的数据。 使用scroll和search_after的区别是: 另外,如果不想通过写程序迁移旧集群的增量数据到新集群的话,可以使用logstash结合scroll进行增量数据的迁移,可参考的配置文件如下: 使用过程中可以根据实际业务的需求调整定时任务参数schedule以及scroll相关的参数。 业务场景如果是写入ES时既有追加,又有存量数据的更新,此时比较重要的是怎么解决update操作的数据同步问题。对于新增的数据,可以采用上述介绍的增量迁移热索引的方式同步到新集群中。对于更新的数据,此时如果索引有类似于updateTime的字段用于标记数据更新的时间,则可以通过写程序或者logstash,使用scroll api根据updateTime字段批量拉取更新的增量数据,然后再写入到新的集群中。 可参考的logstash配置文件如下: 实际应用各种,同步新增(add)的数据和更新(update)的数据可以同时进行。但是如果索引中没有类似updateTime之类的字段可以标识出哪些数据是更新过的,目前看来并没有较好的同步方式,可以采用CCR来保证旧集群和新集群的数据一致性。 如果业务写入ES时既有新增(add)数据,又有更新(update)和删除(delete)数据,可以采用6.5之后商业版X-pack插件中的CCR功能进行数据迁移。但是使用CCR有一些限制,必须要注意: 具体的使用方式如下: 如果业务是通过中间件如kafka把数据写入到ES, 则可以使用如下图中的方式,使用logstash消费kafka的数据到新集群中,在旧集群和新集群数据完全追平之后,可以切换到新集群进行业务的查询,之后再对旧的集群下线处理。 使用中间件进行同步双写的优点是: 当然,双写也可以使用其他的方式解决,比如自建proxy,业务写入时向proxy写入,proxy把请求转发到一个或者多个集群中,但是这种方式存在以下问题: 随着业务规模的增长,业务侧对使用的ES集群的数据可靠性、集群稳定性等方面的要求越来越高,所以要比较好的集群容灾方案支持业务侧的需求。 如果是公司在自建IDC机房内,通过物理机自己搭建的ES集群,在解决跨机房容灾的时候,往往会在两个机房 部署两个ES集群,一主一备,然后解决解决数据同步的问题;数据同步一般有两种方式,一种方式双写,由业务侧实现双写保证数据一致性,但是双写对业务侧是一个挑战,需要保证数据在两个集群都写成功才能算成功。另外一种方式是异步复制,业务侧只写主集群,后台再把数据同步到备集群中去,但是比较难以保证数据一致性。第三种方式是通过专线打通两个机房,实现跨机房部署,但是成本较高。 因为数据同步的复杂性,云厂商在实现ES集群跨机房容灾的时候,往往都是通过只部署一个集群解决,利用ES自身的能力同步数据。国外某云厂商实现跨机房部署ES集群的特点1是不强制使用专用主节点,如上图中的一个集群,只有两个节点,既作为数据节点也作为候选主节点;主分片和副本分片分布在两个可用区中,因为有副本分片的存在,可用区1挂掉之后集群仍然可用,但是如果两个可用区之间网络中断时,会出现脑裂的问题。如下图中使用三个专用主节点,就不会存在脑裂的问题了。 但是如果一个地域没有三个可用区怎么办呢,那就只能在其中一个可用区中放置两个专用主节点了,如国内某云厂商的解决方案: 但是重建节点的过程还是存在问题的,如上图中,集群本身的quorum应该为2,可用区1挂掉后,集群中只剩一个专用主节点,需要把quorum参数(discovery.zen.minimum_master_nodes)调整为1后集群才能够正常进行选主,等挂掉的两个专用主节点恢复之后,需要再把quorum参数(discovery.zen.minimum_master_nodes)调整为2,以避免脑裂的发生。 当然还是有可以把无法选主和脑裂这两个可能发生的问题规避掉的解决方案,如下图中国内某云厂商的解决思路: 创建双可用区集群时,必须选择3个或者5个专用主节点,后台会在一个隐藏的可用区中只部署专用主节点;方案的优点1是如果一个可用区挂掉,集群仍然能够正常选主,避免了因为不满足quorum法定票数而无法选主的情况;2是因为必须要选择三个或5个专用主节点,也避免了脑裂。 想比较一主一备两个集群进行跨机房容灾的方式,云厂商通过跨机房部署集群把原本比较复杂的主备数据同步问题解决了,但是,比较让人担心的是,机房或者可用区之间的网络延迟是否会造成集群性能下降。这里针对腾讯云的双可用区集群,使用标准的benchmark工具对两个同规格的单可用区和双可用区集群进行了压测,压测结果如下图所示: 从压测结果的查询延时和写入延时指标来看,两种类型的集群并没有明显的差异,这主要得益与云上底层网络基础设施的完善,可用区之间的网络延迟很低。 类似于同城跨机房容灾,异地容灾一般的解决思路是在异地两个机房部署一主一备两个集群。业务写入时只写主集群,再异步地把数据同步到备集群中,但是实现起来会比较复杂,因为要解决主备集群数据一致性的问题,并且跨地域的话,网络延迟会比较高;还有就是,当主集群挂掉之后,这时候切换到备集群,可能两边数据还没有追平,出现不一致,导致业务受损。当然,可以借助于kafka等中间件实现双写,但是数据链路增加了,写入延迟也增加了,并且kafka出现问题,故障可能就是灾难性的了。 一种比较常见的异步复制方法是,使用snapshot备份功能,定期比如每个小时在主集群中执行一次备份,然后在备集群中进行恢复,但是主备集群会有一个小时的数据延迟。以腾讯云为例,腾讯云的ES集群支持把数据备份到对象存储COS中,因为可以用来实现主备集群的数据同步,具体的操作步骤可以参考 https://cloud.tencent.com/document/product/845/19549 。 在6.5版本官方推出了CCR功能之后,集群间数据同步的难题就迎刃而解了。可以利用CCR来实现ES集群的异地容灾: CCR是类似于数据订阅的方式,主集群为Leader, 备集群为Follower, 备集群以pull的方式从主集群拉取数据和写请求;在定义好Follwer Index时,Follwer Index会进行初始化,从Leader中以snapshot的方式把底层的segment文件全量同步过来,初始化完成之后,再拉取写请求,拉取完写请求后,Follwer侧进行重放,完成数据的同步。CCR的优点当然是因为可以同步UPDATE/DELETE操作,数据一致性问题解决了,同步延时也减小了。 另外,基于CCR可以和前面提到的跨机房容灾的集群结合,实现两地多中心的ES集群。在上海地域,部署有多可用区集群实现跨机房的高可用,同时在北京地域部署备集群作为Follwer利用CCR同步数据,从而在集群可用性上又向前走了一步,既实现了同城跨机房容灾,又实现了跨地域容灾。 但是在出现故障时需要把集群的访问从上海切换到北京时,会有一些限制,因为CCR中的Follwer Index是只读的,不能写入,需要切换为正常的索引才能进行写入,过程也是不可逆的。不过在业务侧进行规避,比如写入时使用新的正常的索引,业务使用别名进行查询,当上海地域恢复时,再反向的把数据同步回去。 现在问题就是保证上海地域集群数据的完整性,在上海地域恢复后,可以在上海地域新建一个Follower Index,以北京地域正在进行写的索引为Leader同步数据,待数据完全追平后,再切换到上海地域进行读写,注意切换到需要新建Leader索引写入数据。 数据同步过程如下所示: 1.上海主集群正常提供服务,北京备集群从主集群Follow数据 2.上海主集群故障,业务切换到北京备集群进行读写,上海主集群恢复后从北京集群Follow数据

Elasticsearch解决问题之道——请亮出你的DSL

0、引言 在业务开发中,我们往往会陷入开发的细枝末节之中,而忽略了事物的本源。 经常有同学问到: 等等等等….. 以上的看似复杂的问题,如果转换成DSL,清楚的写出来,梳理清楚问题的来龙去脉,问题就自然解决了一大半。 所以,请亮出你的dsl,不论什么语言的检索,转换到es查询都是sql查询,在es中对应dsl语法,es再拆解比如:分词match_phrase拆解成各term组合,最终传给lucene处理。 亮出你的dsl,确保编程里的实现和你的kibana或者head插件一致是非常重要、很容易被忽视的工作。 如果对dsl拆解不理解,那就再 加上 profile:true或者explain:true拆解结果一目了然。 维基百科定义:领域特定语言(英语:domain-specific language、DSL)指的是专注于某个应用程序领域的计算机语言。又译作领域专用语言。 Elasticsearch提供基于JSON的完整查询DSL来定义查询。 将Query DSL视为查询的AST(抽象语法树),由两种类型的子句组成: 1、叶子查询子句 叶查询子句查找特定字段中的特定值,例如匹配,术语或范围查询。 这些查询可以单独使用。 2、复合查询子句 复合查询子句可以组合其他叶子或复合查询,用于以逻辑方式组合多个查询(例如bool或dis_max查询),或更改其行为(例如constant_score查询)。 给个例子,一看就明白。 看到这里,可能会有人着急了:“我X,这不是官网定义吗?再写一遍有意思吗?” 引用一句鸡汤话,“再显而易见的道理,在中国,至少有一亿人不知道”。同样的,再显而易见的问题,在Elasticsearch技术社区也会有N多人提问。 基础认知不怕重复,可怕的是对基础的专研、打磨、夯实。 Elasticsearch相关的核心操作,广义上可做如下解读,不一定涵盖全,仅抛砖引玉,说明DSL的重要性。 从大到小。 集群的管理,一般我们会使用Kibana或者第三方工具Head插件、cerebro工具、elastic-hq工具。 基本上硬件的(磁盘、cpu、内存)使用率、集群的 健康 状态都能一目了然。 但基础的DSL会更便捷,便于细粒度分析问题。 如:集群状态查询: 如:节点热点线程查看: 如:集群分片分配情况查看: 索引生命周期是一直强调的概念,主要指索引的“生、老、病、死”的全过程链条的管理。 创建索引我们优先使用较单纯index更灵活的template模板。 创建索引类似Mysql的创建表的操作,提前设计好表结构对应ES是提前设计好M app ing非常重要。 两个维度: 举例: 如:索引清理缓存。 如:某原因导致分片重新分配,_recovery查看分片分配状态。 高版本的索引生命周期管理推荐使用:ILM功能。 这个是大家再熟悉不过的了。 举例: 删除数据包括:指定id删除 delete和批量删除delete_by_query(满足给定条件)。 更新操作。包括:指定id的update/upsert或者批量更新update_by_query。 这是ES的重头戏。包含但不限于: 1、支持精确匹配查询的:term、range、exists、wildcard、prefix、fuzzy等。 2、支持全文检索的:match、match_phrase、query_string、multi_match等 1、Bucketing分桶聚合 举例:最常用的terms就类似Mysql group by功能。2、Metric计算聚合 举例:类比Mysql中的: MIN, MAX, SUM 操作。3、Pipeline针对聚合结果聚合 举例:bucket_script实现类似Mysql的group by 后having的操作。 留给大家 结合 业务场景思考添加。 这里把开头提到的几个问题逐一解答一下。 实际Mysql业务中,我们一般是先验证sql没有问题,再写业务代码。 实际ES业务中,也一样,先DSL确认没有问题,再写业务代码。 写完java或者python后,打印DSL,核对是否完全一致。 不一致的地方基本就是结果和预期不一致的原因所在。 第一步:借助analyzer API分析查询语句和待查询document分词结果。 这个API的重要性,再怎么强调都不为过。 第二步:可以借助profile:true查看细节。第三步:核对match_phrase词序的原理。 6.3版本后已经支持sql,如果不会写,可以借助translate 如下API翻译一下。 不够精确,但足够参考用了,需要根据业务细节微调。 当然,还是 建议 ,从业务出发,自己写DSL。 从大往小,逐步细化排解 END 公众号 ( zhisheng )里回复 面经、ES、Flink、 Spring、Java、Kafka、监控 等关键字可以查看更多关键字对应的文章 1、《从0到1学习Flink》—— Apache Flink 介绍 2、《从0到1学习Flink》—— Mac 上搭建 Flink 1.6.0 环境并构建运行简单程序入门 3、《从0到1学习Flink》—— Flink 配置文件详解 4、《从0到1学习Flink》—— Data Source 介绍 5、《从0到1学习Flink》—— 如何自定义 Data Source ? 6、《从0到1学习Flink》—— Data Sink 介绍 7、《从0到1学习Flink》—— 如何自定义 Data Sink ? 8、《从0到1学习Flink》—— Flink Data transformation(转换) 9、《从0到1学习Flink》—— 介绍 Flink 中的 Stream Windows 10、《从0到1学习Flink》—— Flink 中的几种 Time 详解 11、《从0到1学习Flink》—— Flink 读取 Kafka 数据写入到 ElasticSearch 12、《从0到1学习Flink》—— Flink 项目如何运行? 13、《从0到1学习Flink》—— Flink 读取 Kafka 数据写入到 Kafka 14、《从0到1学习Flink》—— Flink JobManager 高可用性配置 15、《从0到1学习Flink》—— Flink parallelism 和 Slot 介绍 16、《从0到1学习Flink》—— Flink 读取 Kafka 数据批量写入到 MySQL 17、《从0到1学习Flink》—— Flink 读取 Kafka 数据写入到 RabbitMQ 18、《从0到1学习Flink》—— 你上传的 jar 包藏到哪里去了 19、大数据“重磅炸弹”——实时计算框架 Flink 20、《Flink 源码解析》—— 源码编译运行 21、为什么说流处理即未来? 22、OPPO数据中台之基石:基于Flink SQL构建实数据仓库 23、流计算框架 Flink 与 Storm 的性能对比 24、Flink状态管理和容错机制介绍 25、原理解析 | Apache Flink 结合 Kafka 构建端到端的 Exactly-Once 处理 26、Apache Flink 是如何管理好内存的? 27、《从0到1学习Flink》——Flink 中这样管理配置,你知道? 28、《从0到1学习Flink》——Flink 不可以连续 Split(分流)? 29、Flink 从0到1学习—— 分享四本 Flink 的书和二十多篇 Paper 论文 30 、360深度实践:Flink与Storm协议级对比 31、Apache Flink 1.9 重大特性提前解读 32、如何基于Flink+TensorFlow打造实时智能异常检测平台?只看这一篇就够了 33、美团点评基于 Flink 的实时数仓建设实践 34、Flink 灵魂两百问,这谁顶得住? 35、一文搞懂 Flink 的 Exactly Once 和 At Least Once 36、你公司到底需不需要引入实时计算引擎?

京东面试题:ElasticSearch深度分页解决方案

Elasticsearch 是一个实时的分布式搜索与分析引擎,在使用过程中,有一些典型的使用场景,比如分页、遍历等。 在使用关系型数据库中,我们被告知要注意甚至被明确禁止使用深度分页,同理,在 Elasticsearch 中,也应该尽量避免使用深度分页。 这篇文章主要介绍 Elasticsearch 中分页相关内容! 在ES中,分页查询默认返回最顶端的10条匹配hits。 如果需要分页,需要使用from和size参数。 一个基本的ES查询语句是这样的: 上面的查询表示从搜索结果中取第100条开始的10条数据。 「那么,这个查询语句在ES集群内部是怎么执行的呢?」 在ES中,搜索一般包括两个阶段,query 和 fetch 阶段,可以简单的理解,query 阶段确定要取哪些doc,fetch 阶段取出具体的 doc。 如上图所示,描述了一次搜索请求的 query 阶段:· 在上面的例子中,coordinating node 拿到 (from + size) * 6 条数据,然后合并并排序后选择前面的 from + size 条数据存到优先级队列,以便 fetch 阶段使用。 另外,各个分片返回给 coordinating node 的数据用于选出前 from + size 条数据,所以,只需要返回唯一标记 doc 的 _id 以及用于排序的 _score 即可,这样也可以保证返回的数据量足够小。 coordinating node 计算好自己的优先级队列后,query 阶段结束,进入 fetch 阶段。 query 阶段知道了要取哪些数据,但是并没有取具体的数据,这就是 fetch 阶段要做的。 上图展示了 fetch 过程: coordinating node 的优先级队列里有 from + size 个 _doc _id ,但是,在 fetch 阶段,并不需要取回所有数据,在上面的例子中,前100条数据是不需要取的,只需要取优先级队列里的第101到110条数据即可。 需要取的数据可能在不同分片,也可能在同一分片,coordinating node 使用 「multi-get」 来避免多次去同一分片取数据,从而提高性能。 「这种方式请求深度分页是有问题的:」 我们可以假设在一个有 5 个主分片的索引中搜索。当我们请求结果的第一页(结果从 1 到 10 ),每一个分片产生前 10 的结果,并且返回给 协调节点 ,协调节点对 50 个结果排序得到全部结果的前 10 个。 现在假设我们请求第 1000 页—结果从 10001 到 10010 。所有都以相同的方式工作除了每个分片不得不产生前10010个结果以外。然后协调节点对全部 50050 个结果排序最后丢弃掉这些结果中的 50040 个结果。 「对结果排序的成本随分页的深度成指数上升。」 「注意1:」 size的大小不能超过 index.max_result_window 这个参数的设置,默认为10000。 如果搜索size大于10000,需要设置 index.max_result_window 参数 「注意2:」 _doc 将在未来的版本移除,详见: Elasticsearch 的From/Size方式提供了分页的功能,同时,也有相应的限制。 举个例子,一个索引,有10亿数据,分10个 shards,然后,一个搜索请求,from=1000000,size=100,这时候,会带来严重的性能问题:CPU,内存,IO,网络带宽。 在 query 阶段,每个shards需要返回 1000100 条数据给 coordinating node,而 coordinating node 需要接收 10 * 1000 ,100 条数据,即使每条数据只有 _doc _id 和 _score ,这数据量也很大了? 「在另一方面,我们意识到,这种深度分页的请求并不合理,因为我们是很少人为的看很后面的请求的,在很多的业务场景中,都直接限制分页,比如只能看前100页。」 比如,有1千万粉丝的微信大V,要给所有粉丝群发消息,或者给某省粉丝群发,这时候就需要取得所有符合条件的粉丝,而最容易想到的就是利用 from + size 来实现,不过,这个是不现实的,这时,可以采用 Elasticsearch 提供的其他方式来实现遍历。 深度分页问题大致可以分为两类: 「下面介绍几个官方提供的深度分页方法」 我们可以把scroll理解为关系型数据库里的cursor,因此,scroll并不适合用来做实时搜索,而更适合用于后台批处理任务,比如群发。 这个分页的用法, 「不是为了实时查询数据」 ,而是为了 「一次性查询大量的数据(甚至是全部的数据」 )。 因为这个scroll相当于维护了一份当前索引段的快照信息,这个快照信息是你执行这个scroll查询时的快照。在这个查询后的任何新索引进来的数据,都不会在这个快照中查询到。 但是它相对于from和size,不是查询所有数据然后剔除不要的部分,而是记录一个读取的位置,保证下一次快速继续读取。 不考虑排序的时候,可以结合 SearchType.SCAN 使用。 scroll可以分为初始化和遍历两部,初始化时将 「所有符合搜索条件的搜索结果缓存起来(注意,这里只是缓存的doc_id,而并不是真的缓存了所有的文档数据,取数据是在fetch阶段完成的)」 ,可以想象成快照。 在遍历时,从这个快照里取数据,也就是说,在初始化后,对索引插入、删除、更新数据都不会影响遍历结果。 「基本使用」 初始化指明 index 和 type,然后,加上参数 scroll,表示暂存搜索结果的时间,其它就像一个普通的search请求一样。 会返回一个 _scroll_id , _scroll_id 用来下次取数据用。 「遍历」 这里的 scroll_id 即 上一次遍历取回的 _scroll_id 或者是初始化返回的 _scroll_id ,同样的,需要带 scroll 参数。 重复这一步骤,直到返回的数据为空,即遍历完成。 「注意,每次都要传参数 scroll,刷新搜索结果的缓存时间」 。另外, 「不需要指定 index 和 type」 。 设置scroll的时候,需要使搜索结果缓存到下一次遍历完成, 「同时,也不能太长,毕竟空间有限。」 「优缺点」 缺点: 「优点:」 适用于非实时处理大量数据的情况,比如要进行数据迁移或者索引变更之类的。 ES提供了scroll scan方式进一步提高遍历性能,但是scroll scan不支持排序,因此scroll scan适合不需要排序的场景 「基本使用」 Scroll Scan 的遍历与普通 Scroll 一样,初始化存在一点差别。 需要指明参数: 「Scroll Scan与Scroll的区别」 如果你数据量很大,用Scroll遍历数据那确实是接受不了,现在Scroll接口可以并发来进行数据遍历了。 每个Scroll请求,可以分成多个Slice请求,可以理解为切片,各Slice独立并行,比用Scroll遍历要快很多倍。 上边的示例可以单独请求两块数据,最终五块数据合并的结果与直接scroll scan相同。 其中max是分块数,id是第几块。 Search_after 是 ES 5 新引入的一种分页查询机制,其原理几乎就是和scroll一样,因此代码也几乎是一样的。 「基本使用:」 第一步: 返回出的结果信息 : 上面的请求会为每一个文档返回一个包含sort排序值的数组。 这些sort排序值可以被用于 search_after 参数里以便抓取下一页的数据。 比如,我们可以使用最后的一个文档的sort排序值,将它传递给 search_after 参数: 若我们想接着上次读取的结果进行读取下一页数据,第二次查询在第一次查询时的语句基础上添加 search_after ,并指明从哪个数据后开始读取。 「基本原理」 es维护一个实时游标,它以上一次查询的最后一条记录为游标,方便对下一页的查询,它是一个无状态的查询,因此每次查询的都是最新的数据。 由于它采用记录作为游标,因此 「SearchAfter要求doc中至少有一条全局唯一变量(每个文档具有一个唯一值的字段应该用作排序规范)」 「优缺点」 「优点:」 「缺点:」 SEARCH_AFTER 不是自由跳转到任意页面的解决方案,而是并行滚动多个查询的解决方案。 分页方式性能优点缺点场景 from + size低灵活性好,实现简单深度分页问题数据量比较小,能容忍深度分页问题 scroll中解决了深度分页问题无法反应数据的实时性(快照版本)维护成本高,需要维护一个 scroll_id海量数据的导出需要查询海量结果集的数据 search_after高性能最好不存在深度分页问题能够反映数据的实时变更实现复杂,需要有一个全局唯一的字段连续分页的实现会比较复杂,因为每一次查询都需要上次查询的结果,它不适用于大幅度跳页查询海量数据的分页 参照:https://www.elastic.co/guide/en/elasticsearch/reference/master/paginate-search-results.html#scroll-search-results 在 7.* 版本中,ES官方不再推荐使用Scroll方法来进行深分页,而是推荐使用带PIT的 search_after 来进行查询; 从 7.* 版本开始,您可以使用 SEARCH_AFTER 参数通过上一页中的一组排序值检索下一页命中。 使用 SEARCH_AFTER 需要多个具有相同查询和排序值的搜索请求。 如果这些请求之间发生刷新,则结果的顺序可能会更改,从而导致页面之间的结果不一致。 为防止出现这种情况,您可以创建一个时间点(PIT)来在搜索过程中保留当前索引状态。 在搜索请求中指定PIT: 分别分页获取 1 - 10 , 49000 - 49010 , 99000 - 99010 范围各10条数据(前提10w条),性能大致是这样: 对于向前翻页,ES中没有相应API,但是根据官方说法(https://github.com/elastic/elasticsearch/issues/29449),ES中的向前翻页问题可以通过翻转排序方式来实现即: Scroll和 search_after 原理基本相同,他们都采用了游标的方式来进行深分页。 这种方式虽然能够一定程度上解决深分页问题。但是,它们并不是深分页问题的终极解决方案,深分页问题 「必须避免!!」 。 对于Scroll,无可避免的要维护 scroll_id 和 历史 快照,并且,还必须保证 scroll_id 的存活时间,这对服务器是一个巨大的负荷。 对于 Search_After ,如果允许用户大幅度跳转页面,会导致短时间内频繁的搜索动作,这样的效率非常低下,这也会增加服务器的负荷,同时,在查询过程中,索引的增删改会导致查询数据不一致或者排序变化,造成结果不准确。 Search_After 本身就是一种业务折中方案,它不允许指定跳转到页面,而只提供下一页的功能。 Scroll默认你会在后续将所有符合条件的数据都取出来,所以,它只是搜索到了所有的符合条件的 doc_id (这也是为什么官方推荐用 doc_id 进行排序,因为本身缓存的就是 doc_id ,如果用其他字段排序会增加查询量),并将它们排序后保存在协调节点(coordinate node),但是并没有将所有数据进行fetch,而是每次scroll,读取size个文档,并返回此次读取的最后一个文档以及上下文状态,用以告知下一次需要从哪个shard的哪个文档之后开始读取。 这也是为什么官方不推荐scroll用来给用户进行实时的分页查询,而是适合于大批量的拉取数据,因为它从设计上就不是为了实时读取数据而设计的。

ElasticSearch查询流程详解

前面已经介绍了ElasticSearch的写入流程,了解了ElasticSearch写入时的分布式特性的相关原理。ElasticSearch作为一款具有强大搜索功能的存储引擎,它的读取是什么样的呢?读取相比写入简单的多,但是在使用过程中有哪些需要我们注意的呢?本篇文章会进行详细的分析。 在前面的文章我们已经知道ElasticSearch的读取分为两种GET和SEARCH。这两种操作是有一定的差异的,下面我们先对这两种核心的数据读取方式进行一一分析。 (图片来自官网) 以下是从主分片或者副本分片检索文档的步骤顺序: 注意: 在协调节点有个http_server_worker线程池。收到读请求后它的具体过程为: 数据节点上有一个get线程池。收到了请求后,处理过程为: 注意: get过程会加读锁。处理realtime选项,如果为true,则先判断是否有数据可以刷盘,然后调用Searcher进行读取。Searcher是对IndexSearcher的封装在早期realtime为true则会从tranlog中读取,后面只会从index的lucene读取了。即实时的数据只在lucene之中。 对于Search类请求,ElasticSearch请求是查询lucene的Segment,前面的写入详情流程也分析了,新增的文档会定时的refresh到磁盘中,所以搜索是属于近实时的。而且因为没有文档id,你不知道你要检索的文档在哪个分配上,需要将索引的所有的分片都去搜索下,然后汇总。ElasticSearch的search一般有两个搜索类型 所有的搜索系统一般都是两阶段查询: 第一阶段查询到匹配的docID,第二阶段再查询DocID对应的完整文档。这种在ElasticSearch中称为query_then_fetch,另一种就是一阶段查询的时候就返回完整Doc,在ElasticSearch中叫query_and_fetch,一般第二种适用于只需要查询一个Shard的请求。因为这种一次请求就能将数据请求到,减少交互次数,二阶段的原因是需要多个分片聚合汇总,如果数据量太大那么会影响网络传输效率,所以第一阶段会先返回id。 除了上述的这两种查询外,还有一种三阶段查询的情况。 搜索里面有一种算分逻辑是根据TF和DF来计算score的,而在普通的查询中,第一阶段去每个Shard中独立查询时携带条件算分都是独立的,即Shard中的TF和DF也是独立的。虽然从统计学的基础上数据量多的情况下,每一个分片的TF和DF在整体上会趋向于准确。但是总会有情况导致局部的TF和DF不准的情况出现。 ElasticSearch为了解决这个问题引入了DFS查询。 比如DFS_query_then_fetch,它在每次查询时会先收集所有Shard中的TF和DF值,然后将这些值带入请求中,再次执行query_then_fetch,这样算分的时候TF和DF就是准确的,类似的有DFS_query_and_fetch。这种查询的优势是算分更加精准,但是效率会变差。 另一种选择是用BM25代替TF/DF模型。 在ElasticSearch7.x,用户没法指定以下两种方式: DFS_query_and_fetch 和 query_and_fetch 。 注:这两种算分的算法模型在《ElasticSearch实战篇》有介绍: 这里query_then_fetch具体的搜索的流程图如下: (图片来自官网) 查询阶段包含以下四个步骤: 以上就是ElasticSearch的search的详细流程,下面会对每一步进行进一步的说明。 协调节点处理query请求的线程池为: http_server_work 负责该解析功能的类为: org.elasticsearch.rest.action.search.RestSearchAction 主要将restquest的参数封装成SearchRequest 这样SearchRequest请求发送给TransportSearchAction处理 将索引涉及到的shard列表或者有跨集群访问相关的shard列表合并 如果有多个分片位于同一个节点,仍然会发送多次请求 shardsIts为搜索涉及的所有分片,而shardRoutings.nextOrNull()会从分片的所有副本分片选出一个分片来请求。 onShardSuccess对收集到的结果进行合并,这里需要检查所有的请求是否都已经有了回复。 然后才会判断要不要进行executeNextPhase 当返回结果的分片数等于预期的总分片数时,协调节点会进入当前Phase的结束处理,启动下一个阶段Fetch Phase的执行。onPhaseDone()会executeNextPhase来执行下一个阶段。 当触发了executeNextPhase方法将触发fetch阶段 上一步的executeNextPhase方法触发Fetch阶段,Fetch阶段的起点为FetchSearchPhase#innerRun函数,从查询阶段的shard列表中遍历,跳过查询结果为空的 shard。其中也会封装一些分页信息的数据。 使用了countDown多线程工具,fetchResults存储某个分片的结果,每收到一个shard的数据就countDoun一下,当都完毕后,触发finishPhase。接着会进行下一步: CountedCollector: finishPhase: 执行字段折叠功能,有兴趣可以研究下。即ExpandSearchPhase模块。ES 5.3版本以后支持的Field Collapsing查询。通过该类查询可以轻松实现按Field值进行分类,每个分类获取排名前N的文档。如在菜单行为日志中按菜单名称(用户管理、角色管理等)分类,获取每个菜单排名点击数前十的员工。用户也可以按Field进行Aggregation实现类似功能,但Field Collapsing会更易用、高效。 ExpandSearchPhase执行完了,就返回给客户端结果了。 处理数据节点请求的线程池为:search 根据前面的两个阶段,数据节点主要处理协调节点的两类请求:query和fetch 这里响应的请求就是第一阶段的query请求 executeQueryPhase: executeQueryPhase会执行loadOrExecuteQueryPhase方法 这里判断是否从缓存查询,默认启用缓存,缓存的算法默认为LRU,即删除最近最少使用的数据。如果不启用缓存则会执行queryPhase.execute(context);底层调用lucene进行检索,并且进行聚合。 关键点: ElasticSearch查询分为两类,一类为GET,另一类为SEARCH。它们使用场景不同。 本文主要分析了ElasticSearch分布式查询主体流程,并未对lucene部分进行分析,有兴趣的可以自行查找相关资料。
 首页 上一页  1 2 3 4 5 6 7 8 9  下一页  尾页