关于全文检索系统设计我的思考

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/iteye_3459/article/details/81732248
全文搜索大体分为:数据采集,索引,搜索。

我认为最重要的是搜索效果,大体表现在准确性,搜索结果排序,稳定,速度。准确和分词相关,排序是如何让最适合的结果出现在最前面,稳定这里指索引和搜索时的稳定,速度指索引,搜索使用以及维护。
当然这一切加上硬件,人力综合成一个性价比,这个值决定了最终使用哪个搜索架构(像我这样的懒人通常会基于一些现有的东西,在上面堆砌来完成)

基本确定后,就会写更加细的测试代码,根据数据特性,业务特性进行优化,充分利用硬件发挥其特性。以lucene索引部分为例就是addDoc,updateDoc,deleteDoc,commit,optimize效率,分词速度,内存占用,硬盘占用等方面的细节数字。测试以真实数据为佳,切忌以别人的数据为准,因为他的情况不一定适用你。

有了上述测试数字,就能比较准确的设计适合自己业务的搜索系统,和业务设计的沟通贯彻整个过程,这里尤为重要。对其中涉及的难点,应该做一定测试,确保设计的系统是最适合的。这一过程中可能要借用其他第三方开源程序来补充时,那么就需要衡量使用它的收获和付出是否合算。

然后就是模型搭建,业务测试,压力测试。

最后上线,维护。

每个过程寻找瓶颈而不是提速,功能分离很重要,即便因此牺牲了部分性能和资源也值得。因为上线只是个开始,如何优化是接下来问题了,因为有了分离,测试优化就有了机会。
展开阅读全文

关于一道面试题的思考

11-19

有这么一道面试题:rnrn int a=2,b=3,c=1rn a+=--b+c;rn c-=b+a++;rn System.out.println("a="+a+",b="+b+",c="+c);rn rn请问输出结果如何?rnrn正确答案是:a=6,b=2,c=-6rnrn现在解析一下这段程序的具体运作流程rnrn执行javap -c Test得到这段程序的执行代码如下:rnrn0 iconst_2rn1 istore_1rn2 iconst_3rn3 istore_2rn4 iconst_1rn5 istore_3rnrn6 iload_1rn7 iinc 2,-1rn10 iload_2rn11 iload_3rn12 iaddrn13 iaddrn14 istore_1rnrn15 iload_3rn16 iload_2rn17 iload_1rn18 iinc 1,1rn21 iaddrn22 isubrn23 istore_3rnrnrn从0到5是第一条语句,初始化的部分rn首先iconst_2将一个整型常量2push到operand stackrn然后istore_1将operand stack里的2store到local variablernindex为1,此时变量a才算初始化完成,其它两个变量也类似,rn变量b和变量c的index分别为2和3,以下操作基本上使用其indexrnrn从第6句开始时第二条语句的操作rn实际上local variable里保存了最终变量的值,而operand stackrn里保存的是变量进行操作的值。iload_1将变量a从local variablern存入operand stack,第7句iinc 2,-1对local variable变量b执行rn增加-1的操作,在java里,-x实际上执行的是+(-x)这样的操作rn然后将变量b和c分别存入operand stack,此时在stack中a=2,b=2,c=1rniadd指令将operand stack中最上面的两个数pop stack,然后执行相加rn操作,并将操作结果pust stack,于是stack中剩下a=2和中间值3(b+c),rnb=2和c=1已经出栈了,然后又执行一次iadd,a出栈,栈中剩下中间值rn5(2+3),istore_1指令将operand stack中的值5存入变量a的local variablern此轮结束后a=5,b=2,c=1rnrn第15句开始时第三条语句的操作rn先依次将c,b,a三个local variable的值push到operand stackrn然后执行iinc 1,1对a的local variable加1,此时a=6rn然后执行iadd,将operand stack中最上面的两个(a=5,b=2)相加,rn此时,虽然local variable中的a已经为6,但是stack中的arn仍然为5,a和b被pop,operand stack中剩下c=1和中间值7,rn然后isub对stack中的两个值执行相减操作,stack中剩下值-6rnistore_3将stack中的-6存入c的local variablernrn最终结果a=6,b=2,c=-6rnrn总结:rn 在java里是严格实行操作符的优先级的,所以++和--这种高优先级的rn都最先计算,这里比较有意思的是进栈的次序问题,第一句里rn先对b的local variable执行减法才push到stack里,而第二句里rn则是先将a的值push到stack再执行加法。这涉及到java里对表达式rn的定义,按照JVM Spec,任何一个算术操作都是把最终的表达式的rn计算结果放到Operand Stack里。而对于--b是一整个表达式,rn所以先计算了--b的值才push stack,而对于a++,表达式的值rn实际是a,所以先将a的值push stack再执行a++。rnrn匆匆写成,不知道还有遗漏或者错误。 ^_^ rnrn 论坛

没有更多推荐了,返回首页