大数据下精确快速搜索OpenSearch

相信做过一两个项目的人都会遇到上级要求做一个类似百度或者谷歌的站内搜索功能。传统的sql查询只能使用like 或者FIND_IN_SET来实现、后者性能稍微好点但是必须要逗号分隔才可以实现匹配、甚至多条件的话还可能用到OR这是极影响系统性能的。

最近公司项目需要、主要是系统查询缓慢、并且查询精度不敢恭维。一开始想到的是Lucene 毕竟是一个开放源代码的全文检索引擎工具包 并且官方还在持续更新中。当时闲暇时间大概搞了将近一个星期的时间、索引的增删查改以及中文分词IKAnalyzer。但是数据量大了 问题就来了、Lucene是不支持集群的。谷歌了半天找到一个叫solr的东西、它是基于Lucene的全文搜索 服务器并且支持集群。然后就是各种搭环境 配置中文分词、搭建zookeeper服务器、搭建solr服务器、然后是服务器之间的各种整合。期间出现的问题可谓是数不胜数、只能用2个字来形容”繁琐”。说了那么多顺便说说solr的安全性问题、SolrJ没有提供访问控制接口,也就是说只要知道solr服务器信息,任何人都可以连接solr服务器来进行索引增加、修改、删除 操作。虽然有多种方式可以限制、但总觉得心里不踏实、但是 阿里云的Opensearch就不一样了(见后面代码)。

趁着 阿里云搞活动、也是公司业务需要于是申请了Opensearch内侧资格。

一:创建应用

1、创建应用名以及描述。

2、选择结构类型、因为是测试所以选择 自定义结构。输入表明以及字段点击继续即可。

3、继续后会看到一个静态展示的表结构这时点击下一步即可。

4、因为没有 购买阿里云的OSS和ODPS所以这里选择手动上传。

5、应用结构展示。

6、创建后还要激活应用。

7、这里你可以自定义配额、以后也可以自行修改(很人性化的功能)。

8、同第四步没有OSS和ODPS这里直接选择完成即可、至此整个应用配置完毕。

9、因为本人是做javaWeb开发的所以这里选择java的SDK下载。

二:创建demo

1插入数据

本地测试插入1000条数据、push以后花费时间为4565ms

本地测试插入10000条数据、push以前花费时间106ms、push半天报错

  1. 十月 10, 2014 8:43:48 上午 org.apache.http.impl.client.DefaultRequestDirector tryExecute
  2. 信息: I/O exception (java.net.SocketException) caught when processing request: Connection reset by peer: socket write error
  3. 十月 10, 2014 8:43:48 上午 org.apache.http.impl.client.DefaultRequestDirector tryExecute
  4. 信息: Retrying request

感觉应该是阿里 云服务端做了限制、一次性push 10000条记录就会中断、选择每1000条数据push一次、测试插入10000条数据:71940ms。

本地测试插入五万条数据一次push 1000条数据花费时间:210267ms

本地测试插入十万条数据一次push 1000条数据到6万的时候中断、不清楚是否阿里云服务端限制、如果后台定时任务一次性构建百万或者千万条数据是否还有影响。

具体一次性push多少数据、我没有详细的测试、应该是越多越好、以上是测试数据仅供参考、并不是十分准确。

至此一共插入124147条数据也算是10万级别的了。

2、查询数据

ht

以上为查询关键词VPS分页查询10条数据查询时间为0.009275秒几乎可以忽略不计了。

三:系统测试

1、目前系统测试

系统为单核非集群、服务器为tomcat、数据库数据为5000条。

页面数据包括基础查询条件以及表数据展示、单表字段为47个。

并发100人,页面搜索反应时间为0.73秒

应用服务器:30%<CPU<50%左右,内存使用较小

数据库服务器:CPU<10%,内存使用较小

并发120人,页面搜索反应时间为1.18秒

应用服务器:30%<CPU<50%左右,内存使用较小

数据库服务器:CPU<10%,内存使用较小

并发150人,页面搜索反应时间为5.08秒

应用服务器:CPU<50%左右,内存使用较小

数据库服务器:CPU<10%,内存使用较小

根据以上12万数据的查询大体可以得出结论并发150应该会控制到ms级别。

最后附上测试代码:

package openSearch;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.http.client.ClientProtocolException;
import org.json.JSONException;
import org.junit.Before;
import org.junit.Test;
import com.opensearch.javasdk.CloudsearchClient;
import com.opensearch.javasdk.CloudsearchDoc;
import com.opensearch.javasdk.CloudsearchSearch;
import com.opensearch.javasdk.object.KeyTypeEnum;
public class OpenSearch {
    /**
     * 阿里云OpenSearch采用Access Key 连接方式、相比solr安全系数不止提高了一个档次。
     */
    private static final String  ACCESSKEY = "xxx";
    private static final String  SECRET  = "xxx";
    private static final String  INDEXNAME = "52itstyle";
    private static final String  URL = "http://opensearch.aliyuncs.com";
    private CloudsearchClient client;
    @Before
    public void init() {
       Map<String, Object> opts = new HashMap<String, Object>();
       opts.put("host", URL);
       client = new CloudsearchClient(ACCESSKEY, SECRET , opts,KeyTypeEnum.ALIYUN);
    }
    @Test
    /**
     * 测试数据插入
     * @throws JSONException
     * @throws ClientProtocolException
     * @throws IOException
     */
    public void addTest() throws JSONException, ClientProtocolException, IOException{
        CloudsearchDoc doc = new CloudsearchDoc(INDEXNAME, client);
        Map<String, Object> ques = new HashMap<String, Object>();
        //开始时间
        Long beginDate = System.currentTimeMillis();
        //插入50000条数据测试
        for(int i=0;i<=50000;i++){
            ques.put("id", "200003"+i);//ID主键
            ques.put("title", "搞网站运营已有6年时间了)");
            ques.put("content", "搞网站运营已有6年时间了,期间运营过大大小的网站10多个,空间、VPS国内国外都使用过。国内最普遍的环境就是不稳定,隔三差五不是被攻击就是线路调整。一直困惑不已。  ");
            doc.add(ques);
            //每加入1000条数据结束之后push一下
            if(i%1000==0){
                doc.push("article");
            }
        }
        //结束时间
        Long endDate = System.currentTimeMillis();
        System.out.print("插入50000条数据:"+(endDate-beginDate));
    }
}

http://www.yuefengqing.com/index.php?c=info&a=detail&id=222

评测总结:  &#4;

优点:

1:   省去了配置以及维护solr运营成本、数据直接扔给opensearch、用户不用再去关心宕机、集群的问题。

2:阿里后台有清晰的应用结构、错误日志、基本信息、配额管理以及数据统计、界面化管理一目了然。

3:应用自定义结构、相比于solr的配置schema.xml要耐看的多。

4:支持复杂查询、排序表达式、可聚合、可过滤以及多次查询等特点、基本满足了项目的需求。

5:还有很多自己摸索、、、、

缺点:

1:推送数据、每秒推送次数5次 每个包大小    编码前2M、这些限制肯定有它的道理、服务开销或者技术瓶颈什么的、按说阿里不会有神马技术瓶颈吧。问题是如果数据丢失或者重构索引我应该一次push多少在表结构不是很确定的情况下。

2:查看API 搜索返回的格式 有xml, json和protobuf 这三种、是否可以像solr一样导入 @FILE 直接转化为试题类的API、这样其实包括add或者search
都会变得相对简单一些吧。

3:是否能做的像CNZZ统计一样就更高达上了。  $Lj ]&#6;N&#27;tO

4:貌似后台索引只能单个删除、能否一键删除或者个性化删除。虽然这些功能API都可以做到、但是还是希望阿里能搞定它。

http://www.yuefengqing.com/index.php?c=info&a=detail&id=223

时间: 2025-01-05 04:10:56

大数据下精确快速搜索OpenSearch的相关文章

【阿里云产品公测】大数据下精确快速搜索OpenSearch

[阿里云产品公测]大数据下精确快速搜索OpenSearch 作者:阿里云用户小柒2012 相信做过一两个项目的人都会遇到上级要求做一个类似百度或者谷歌的站内搜索功能.传统的sql查询只能使用like 或者FIND_IN_SET来实现.后者性能稍微好点但是必须要逗号分隔才可以实现匹配.甚至多条件的话还可能用到OR这是极影响系统性能的. 最近公司项目需要.主要是系统查询缓慢.并且查询精度不敢恭维.一开始想到的是Lucene 毕竟是一个开放源代码的全文检索引擎工具包 并且官方还在持续更新中.当时闲暇时

大数据下的数据分析平台架构zz

转自http://www.cnblogs.com/end/archive/2012/02/05/2339152.html 随着互联网.移动互联网和物联网的发展,谁也无法否认,我们已经切实地迎来了一个海量数据的时代,数据调查公司IDC预计2011年的数据总量将达到1.8万亿GB,对这些海量数据的分析已经成为一个非常重要且紧迫的需求. 作为一家互联网数据分析公司,我们在海量数据的分析领域那真是被“逼上梁山”.多年来在严苛的业务需求和数据压力下,我们几乎尝试了所有可能的大数据分析方法,最终落地于Had

大数据下的数据分析平台架构

时间:2011-08-15 14:59 作者:谢超 随着互联网.移动互联网和物联网的发展,谁也无法否认,我们已经切实地迎来了一个海量数据的时代,数据调查公司IDC预计2011年的数据总量将达到1.8万亿GB,对这些海量数据的分析已经成为一个非常重要且紧迫的需求. 谢超 Admaster数据挖掘总监,云计算实践者,10年数据仓库和数据挖掘咨询经验,现专注于分布式平台上的海量数据挖掘和机器学习. 作为一家互联网数据分析公司,我们在海量数据的分析领域那真是被“逼上梁山”.多年来在严苛的业务需求和数据压

大数据下,24小时精准医疗或将在2020年实现?

日前,在2016英特尔生命科学信息技术论坛上,一款名为GTX One的生物计算加速平台现身,引发了业内对于精准医疗行业新的看法.这款GTX One加速系统,通过算法创新充分释放FPGA的计算能力,相当于将一台超级计算机压缩到一个小盒子里:一张FPGA加速卡就能达到60台高性能至强Xeon CPU服务器的计算性能,极大地缩短了生物信息数据的计算时间.事实上,通过生物数据与医疗行业结合,生物医疗行业正在经历高速发展.此次英特尔在京推出的“英特尔精准医疗伙伴计划(Intel BioIT Partner

【CSWS2014 Summer School】大数据下的游戏营销模式革新-邓大付

大数据下的游戏营销模式革新 邓大付博士腾讯专家工程师 Bio:毕业于华中科技大学,现任腾讯IEG运营部数据中心技术副总监,负责腾讯游戏的数据挖掘相关工作,包括有用户画像,推荐系统,基础算法研究等.主要感兴趣的领域包括有分布式计算平台系统架构,机器学习算法等. =================================================== 这个讲座时间比较短,内容也比较少,不过还是让我开拓了眼界,比如TX游戏数据的规模.游戏服务器的规模以及游戏中一些算法.模型的应用. ==

MySQL大数据下Limit使用

对于一直用Oracle的我,今天可是非常诧异,MySQL中同一个函数在不同数量级上的性能居然差距如此之大. 先看表ibmng(id,title,info)  唯一  id key 索引title 先看看两条语句: select * from ibmng limit 1000000,10 select * from ibmng limit 10,10 很多人都会认为不会有多大差别,但是他们都错了,差别太大了,(可能机器不同有点差距,但绝对10倍以上)具体执行时间留给好奇的同学. 这是为什么呢,都是

大数据下Limit使用(MySQL)

对于一直用Oracle的我,今天可是非常诧异,MySQL中同一个函数在不同数量级上的性能居然差距如此之大. 先看表ibmng(id,title,info)  唯一  id key 索引title 先看看两条语句: select * from ibmng limit 1000000,10 select * from ibmng limit 10,10 很多人都会认为不会有多大差别,但是他们都错了,差别太大了,(可能机器不同有点差距,但绝对10倍以上)具体执行时间留给好奇的同学. 这是为什么呢,都是

大数据下一站:智慧医疗?

基于大数据技术,有朝一日,机器的诊疗准确率甚至可能超过人类历史上最有名的名医. 日前,美国最大的医疗保险公司 Wellpoint已经开始通过运用IBM的超级计算机“Watson”帮助医生来针对病人的病情进行诊断,服务7000万人.在癌症治疗领域,目前需要 一个月或更长时间才能制定出针对性的药物治疗方案,未来利用Watson的认知计算技术可以将周期缩短至一天,极大提高癌症患者的治愈率. “Watson在医疗.医药行业可以帮助肿瘤中心做几个复杂癌症疾病的诊断和数据分析:还能够帮助分析疾病风险,保证理

大数据下的“商业学习实验” 能否改变超市业?

浓缩观点 消费动力不足.利润下滑.电商侵蚀,大型超市的突围之路在哪里?掌握以大数据分析为基础的“商业实验学习”的5个方向,将给零售企业带来数以亿计的经济效益. 零售企业可能每天都会产生令人兴奋但有些风险的创意,这些点子要不要做?效果又会如何? 大数据下的“商业学习实验” 台湾的全家便利店,在台湾拥有2000多家门店.它们在调查中发现,消费者对现煮咖啡有显著需求.对全家而言,是贸然在所有门店都提供现煮咖啡,还是将这些咖啡机将优先添置在某些店铺?现煮咖啡大卖的同时,是否会挤占店里其他咖啡及饮料产品的