阿里云
阿里云多端小程序中小企业获客首选
发表主题 回复主题
  • 40518阅读
  • 45回复

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

级别: 论坛版主
发帖
3414
云币
8980

         相信做过一两个项目的人都会遇到上级要求做一个类似百度或者谷歌的站内搜索功能。传统的sql查询只能使用like 或者FIND_IN_SET来实现、后者性能稍微好点但是必须要逗号分隔才可以实现匹配、甚至多条件的话还可能用到OR这是极影响系统性能的。
       最近公司项目需要、主要是系统查询缓慢、并且查询精度不敢恭维。一开始想到的是Lucene 毕竟是一个开放源代码的全文检索引擎工具包 并且官方还在持续更新中。当时闲暇时间大概搞了将近一个星期的时间、索引的增删查改以及中文分词IKAnalyzer。但是数据量大了问题就来了、Lucene是不支持集群的。谷歌了半天找到一个叫solr的东西、它是基于Lucene的全文搜索服务器并且支持集群。然后就是各种搭环境配置中文分词、搭建zookeeper服务器、搭建solr服务器、然后是服务器之间的各种整合。期间出现的问题可谓是数不胜数、只能用2个字来形容”繁琐”。说了那么多顺便说说solr的安全性问题、SolrJ没有提供访问控制接口,也就是说只要知道solr服务器信息,任何人都可以连接solr服务器来进行索引增加、修改、删除操作。虽然有多种方式可以限制、但总觉得心里不踏实、但是阿里的Opensearch就不一样了(见后面代码)。
      趁着阿里云搞活动、也是公司业务需要于是申请了Opensearch内测资格。
一:创建应用
1、创建应用名以及描述。
SMaC{RPQ  
2、选择结构类型、因为是测试所以选择定义结构。输入表明以及字段点击继续即可。
`rC9i5:  
3、继续后会看到一个静态展示的表结构这时点击下一步即可。
1TfK"\  
4、因为没有购买阿里云的OSSODPS所以这里选择手动上传。
L)VEA8}  
5、应用结构展示。
0U]wEz*b  
6、创建后还要激活应用。
U9IP`)z_5t  
7、这里你可以自定义配额、以后也可以自行修改(很人性化的功能)
693J?Yah[  
8、同第四步没有OSSODPS 这里直接选择完成即可、至此整个应用配置完毕。
$rDeI-)S  
9、因为本人是做javaWeb开发的所以这里选择javaSDK下载。
:(?joLA  
二:创建demo
1插入数据
本地测试插入1000条数据、push以后花费时间为4565ms
本地测试插入10000条数据、push以前花费时间106mspush半天报错
  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、查询数据
i]*W t8~!  
以上为查询关键词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级别。
DW@PPvfs  
最后附上测试代码:
  1. package openSearch;
  2. import java.io.IOException;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import org.apache.http.client.ClientProtocolException;
  6. import org.json.JSONException;
  7. import org.junit.Before;
  8. import org.junit.Test;
  9. import com.opensearch.javasdk.CloudsearchClient;
  10. import com.opensearch.javasdk.CloudsearchDoc;
  11. import com.opensearch.javasdk.CloudsearchSearch;
  12. import com.opensearch.javasdk.object.KeyTypeEnum;
  13. public class OpenSearch {
  14.     /**
  15.      * 阿里云OpenSearch采用Access Key 连接方式、相比solr安全系数不止提高了一个档次。
  16.      */
  17.     private static final String  ACCESSKEY = "xxx";
  18.     private static final String  SECRET  = "xxx";
  19.     private static final String  INDEXNAME = "52itstyle";
  20.     private static final String  URL = "http://opensearch.aliyuncs.com";
  21.     private CloudsearchClient client;
  22.     @Before
  23.     public void init() {
  24.        Map<String, Object> opts = new HashMap<String, Object>();
  25.        opts.put("host", URL);
  26.        client = new CloudsearchClient(ACCESSKEY, SECRET , opts,KeyTypeEnum.ALIYUN);
  27.     }
  28.     @Test
  29.     /**
  30.      * 测试数据插入
  31.      * @throws JSONException
  32.      * @throws ClientProtocolException
  33.      * @throws IOException
  34.      */
  35.     public void addTest() throws JSONException, ClientProtocolException, IOException{
  36.         CloudsearchDoc doc = new CloudsearchDoc(INDEXNAME, client);
  37.         Map<String, Object> ques = new HashMap<String, Object>();
  38.         //开始时间
  39.         Long beginDate = System.currentTimeMillis();
  40.         //插入50000条数据测试
  41.         for(int i=0;i<=50000;i++){
  42.             ques.put("id", "200003"+i);//ID主键
  43.             ques.put("title", "搞网站运营已有6年时间了)");
  44.             ques.put("content", "搞网站运营已有6年时间了,期间运营过大大小的网站10多个,空间、VPS国内国外都使用过。国内最普遍的环境就是不稳定,隔三差五不是被攻击就是线路调整。一直困惑不已。  ");
  45.             doc.add(ques);
  46.             //每加入1000条数据结束之后push一下
  47.             if(i%1000==0){
  48.                 doc.push("article");
  49.             }
  50.         }
  51.         //结束时间
  52.         Long endDate = System.currentTimeMillis();
  53.         System.out.print("插入50000条数据:"+(endDate-beginDate));
  54.     }
  55. }
ys:1%D,,_  
javaWeb测试系统稍后放出 9@Yk8  
Mjq1qEi"B  
图片被论坛压缩的都看不清了 附件下载 阿里云搜索服务.zip (1503 K) 下载次数:421 QJp _>K  
STs~GOm-  
CJk$o K{Q  
评测总结: ,"  
优点:
    1:   省去了配置以及维护solr运营成本、数据直接扔给opensearch、用户不用再去关心宕机、集群的问题。
    2:阿里后台有清晰的应用结构、错误日志、基本信息、配额管理以及数据统计、界面化管理一目了然。
    3:应用自定义结构、相比于solr的配置schema.xml要耐看的多。
    4:支持复杂查询、排序表达式、可聚合、可过滤以及多次查询等特点、基本满足了项目的需求。
    5:还有很多自己摸索、、、、
Ol:&cX3G  
功能改进: 4)+MvKxjS  
    1:推送数据、每秒推送次数5次 每个包大小    编码前2M、这些限制肯定有它的道理、服务开销或者技术瓶颈什么的、按说阿里不会有神马技术瓶颈吧。问题是如果数据丢失或者重构索引我应该一次push多少在表结构不是很确定的情况下。 Gvv~P3Dm  
    2:查看API 搜索返回的格式 有xml, json和protobuf 这三种、是否可以像solr一样导入@FILE 直接转化为试题类的API、这样其实包括add或者search 都会变得相对简单一些吧。 y%k\=:m  
   3:是否能做的像CNZZ统计一样就更高达上了。 r#*kx#"  
   4:貌似后台索引只能单个删除、能否一键删除或者个性化删除。虽然这些功能API都可以做到、但是还是希望阿里能搞定它。 /ZZo`   
   5:价格问题 你懂我懂大家都懂。 S*],18z?  
cu(2BDfiL  
`w6\II)aB  
如果感觉该评测对您有所帮助, 欢迎投票给本文: U .hV1  
投票标题:  阿里云产品公测】大数据下精确快速搜索OpenSearch;作者:小柒2012   5Fm.] /  
投票地址: http://bbs.aliyun.com/read/178799.html WM NcPHcj  
pj&vnX6O^  
  
D4<nS<8  
Opensearch整合小项目:目前只是实现了 分页飘红效果 后续API所有功能将补充完毕。 }rsD$  
Z; Xg5  
:}TT1@  
Constants.java 存放常量: Jf@M>BT^A  
  1. public class Constants {
  2.     //应用名称
  3.     public static final String  INDEXNAME = "52itstyle";
  4.     //分页条数
  5.     public static final int PAGESIZE = 10;
  6. }
y7dnXO!g9-  
OpenSearchUtil.java 获取服务: u_s  
  1. public class OpenSearchUtil {
  2.     private static final String  ACCESSKEY = "xxx";
  3.     private static final String  SECRET  = "xxx";
  4.     private static final String  URL = "http://opensearch.aliyuncs.com";
  5.     private static CloudsearchClient client;
  6.     private static Object lock = new Object();
  7.     public static CloudsearchClient getInstance() throws MalformedURLException {
  8.         if (client == null) {
  9.             synchronized (lock) {
  10.                 if (client == null) {
  11.                    Map<String, Object> opts = new HashMap<String, Object>();
  12.                      opts.put("host", URL);
  13.                      client = new CloudsearchClient(ACCESSKEY, SECRET , opts,KeyTypeEnum.ALIYUN);
  14.                 }
  15.             }
  16.         }
  17.         return client;
  18.     }
  19. }
{M U>5\  
OpenSearch.java 操作类 增删查改: LGKkT?fcSC  
  1. public class OpenSearch extends BaseAction {
  2.     private Integer pageNo;
  3.     private String content;
  4.     public void queryOpenSearch() throws Exception{
  5.         CloudsearchSearch search = new CloudsearchSearch(OpenSearchUtil.getInstance());
  6.         // 添加指定搜索的应用:
  7.         search.addIndex(Constants.INDEXNAME);    
  8.         // 索引字段名称是您在您的数据结构中的“索引到”字段。
  9.         search.setQueryString(content);
  10.         //参数一 要飘红的字段 、参数二 数据截取字数100、参数三 多余部分...显示、参数四飘红显示几段 、参数五六为html标签可以自定义
  11.         search.addSummary("content", 200, "......", 3, "<font color='red'>", "</font>");
  12.         //分页查询
  13.         search.setStartHit((pageNo-1)*Constants.PAGESIZE > 0 ? (pageNo-1)*Constants.PAGESIZE : 0);
  14.         //每页显示10条
  15.         search.setHits(Constants.PAGESIZE);
  16.         //指定搜索返回的格式为json
  17.         search.setFormat("json");
  18.         //返回搜索结果。
  19.         printMsgToClient(search.search());
  20.     }
  21.     public Integer getPageNo() {
  22.         return pageNo;
  23.     }
  24.     public void setPageNo(Integer pageNo) {
  25.         this.pageNo = pageNo;
  26.     }
  27.     public String getContent() {
  28.         return content;
  29.     }
  30.     public void setContent(String content) {
  31.         this.content = content;
  32.     }
  33. }
G`PSb<h\oc  
?JDZDPVJ)  
search.html 页面展示: JLm0[1Lzd  
  1. function openSearch(pageNo){
  2.     var content = $("#content").val()=="阿里云搜索"?"": $("#content").val();
  3.      $.ajax({
  4.             url:'openSearch_queryOpenSearch.action',
  5.               async:false,
  6.               type:'post',
  7.               dataType:"json",
  8.               data:{'time':(new Date()).toString(),'pageNo':pageNo,'content':content},
  9.             success:function(result){
  10.                 //alert(result.status);//返回状态
  11.                 //alert(result.result.searchtime);//查询时间
  12.                 //alert(result.result.total);//数据总数
  13.                 //alert(result.result.num);//展示个数
  14.                 //alert(result.result.viewtotal);//最多展示个数
  15.                 //alert(result.result.items)//实体数据
  16.                 var searchtime ="找到相关结果"+result.result.total+"条 (用时"+result.result.searchtime+"秒)";
  17.                 gotoPagePrev(pageNo,result.result.total,"perPagination","endPagination","openSearch",10,"master","条");
  18.                 $("#searchtime").html(searchtime);
  19.                 var array = eval(result.result.items);
  20.                 var str ='';
  21.                 for(var i=0;i<array.length;i++){
  22.                     str +='';
  23.                     str +='<div class="ttlist_box">';
  24.                     str +='  <div class="ttlist_tle jb_tit">';
  25.                     str +='<div class="ttlist_tle1 clearfix">';
  26.                     str +='<div class="tst_nm2 fl ">';
  27.                     str +=' <span>文章编号:<i class="c_gray">'+array[i].id+'</i></span>';
  28.                     str +='      </div>';
  29.                     str +='         <div class="tst_wuse fl ">';
  30.                     str +='         </div>';
  31.                     str +='         <div class="tst_dft fl">';
  32.                     str +='         </div>';
  33.                     str +='         <div class="tst_tjq fl ">';
  34.                     str +='         </div>';
  35.                     str +='         <div class="tst_tjd fl">';
  36.                     str +='         </div>';
  37.                     str +='         <div class="fr">';
  38.                     str +='         </div>';
  39.                     str +='      </div>';
  40.                     str +='      <div class="ttlist_tle2 clearfix">';
  41.                     str +='          <div class="tst_kng fl clearfix">';
  42.                     str +='           </div>';
  43.                     str +='            <div class="tst_skl fl clearfix">';
  44.                     str +='            </div>';
  45.                     str +='          <div class="tst_enj fl">';
  46.                     str +='           </div>';
  47.                     str +='       </div>';
  48.                     str +='   </div>';
  49.                     str +='  <div class="ttlist_cont clearfix">';
  50.                     str +='      <div class="st_ctg">'+array[i].content+'</div>';
  51.                     str +='   </div>';
  52.                     str +='</div>';
  53.                 }
  54.                 $("#master").html(str);
  55.             },
  56.         });
  57. }
$-YS\R\9x  
!OekN,6  
项目演示地址:http://121.42.26.72:8080/opensearch o0&jel1a  
P!'Sx;C^f  
N,V %/O{Y  
~Y@(  
[ 此帖被小柒2012在2014-10-18 20:49重新编辑 ]
本帖最近评分记录: 9 条评分 云币 +32
ali8800844 云币 +1 - 2014-12-25
johnguru 云币 +1 你是我偶像 2014-12-03
平淡似水 云币 +1 优秀文章-欢迎进行技术分享,感谢你的支持! 2014-10-15
迷途老马 云币 +1 MARK! 最近正好做搜索,多谢楼主分享! 2014-10-15
啊里新人 云币 +5 你懂的! 2014-10-11
阿狸小狐 云币 +1 您的无私奉献精神值得我们学习!向您致敬! 2014-10-10
yunfeifan 云币 +1 你懂的! 2014-10-10
qiujin2012 云币 +20 支持他,就给他投票,猛戳: http://bbs.aliyun.com/read/178799.html 2014-10-10
我很无奈 云币 +1 LZ 威武 2014-10-10
级别: 研究猿
发帖
3357
云币
4596

只看该作者 沙发  发表于: 2014-10-10
不错,顶一下
本帖最近评分记录: 1 条评分 云币 +1
小柒2012 云币 +1 你是我偶像 2014-10-10
级别: 论坛版主
发帖
3414
云币
8980

只看该作者 板凳  发表于: 2014-10-10
你是我偶像
本帖最近评分记录: 2 条评分 云币 +6
啊里新人 云币 +5 - 2014-10-11
我很无奈 云币 +1 看着还行 2014-10-10
级别: 小白
发帖
2
云币
2
只看该作者 地板  发表于: 2014-10-10
LZ 威武
发帖
994
云币
1363
只看该作者 4楼 发表于: 2014-10-10
一大早写评测的哥们,V5
〉〉论坛经验-《阿里云服务器从入门到精通》精华汇总
http://bbs.aliyun.com/read/135619.html?amp;displayMode=1#tpc
发帖
994
云币
1363
只看该作者 5楼 发表于: 2014-10-10
支持他,就给他投票,猛戳: }e}J6 [wP  
http://bbs.aliyun.com/read/178799.html
〉〉论坛经验-《阿里云服务器从入门到精通》精华汇总
http://bbs.aliyun.com/read/135619.html?amp;displayMode=1#tpc
级别: 小白
发帖
13
云币
22
只看该作者 6楼 发表于: 2014-10-10
Re【阿里云产品公测】大数据下精确快速搜索OpenSearch
支持!!!
级别: 小白
发帖
2
云币
2
只看该作者 7楼 发表于: 2014-10-10
Re【阿里云产品公测】大数据下精确快速搜索OpenSearch
看着像那么回事
级别: 小白
发帖
1
云币
1
只看该作者 8楼 发表于: 2014-10-10
Re【阿里云产品公测】大数据下精确快速搜索OpenSearch
支持~
发帖
131
云币
176
只看该作者 9楼 发表于: 2014-10-10
Re【阿里云产品公测】大数据下精确快速搜索OpenSearch
引用
引用楼主小柒2012于2014-10-10 10:44发表的 【阿里云产品公测】大数据下精确快速搜索OpenSearch : SBNeN]  
       相信做过一两个项目的人都会遇到上级要求做一个类似百度或者谷歌的站内搜索功能。传统的sql查询只能使用like 或者FIND_IN_SET来实现、后者性能稍微好点但是必须要逗号分隔才可以实现匹配、甚至多条件的话还可能用到OR这是极影响系统性能的。
       最近公司项目需要、主要是系统查询缓慢、并且查询精度不敢恭维。一开始想到的是Lucene 毕竟是一个开放源代码的全文检索引擎工具包 并且官方还在持续更新中。当时闲暇时间大概搞了将近一个星期的时间、索引的增删查改以及中文分词IKAnalyzer。但是数据量大了问题就来了、Lucene是不支持集群的。谷歌了半天找到一个叫solr的东西、它是基于Lucene的全文搜索服务器并且支持集群。然后就是各种搭环境配置中文分词、搭建zookeeper服务器、搭建solr服务器、然后是服务器之间的各种整合。期间出现的问题可谓是数不胜数、只能用2个字来形容”繁琐”。说了那么多顺便说说solr的安全性问题、SolrJ没有提供访问控制接口,也就是说只要知道solr服务器信息,任何人都可以连接solr服务器来进行索引增加、修改、删除操作。虽然有多种方式可以限制、但总觉得心里不踏实、但是阿里云的Opensearch就不一样了、这个后面将会提到。
      趁着阿里云搞活动、也是公司业务需要于是申请了Opensearch内侧资格。
一:创建应用
1、创建应用名以及描述。
[attachment=62109] HF\|mL  
2、选择结构类型、因为是测试所以选择自定义结构。输入表明以及字段点击继续即可。
[attachment=62110] 5Lo\[K >j  
3、继续后会看到一个静态展示的表结构这时点击下一步即可。
[attachment=62111] aJmSagr69C  
4、因为没有购买阿里云的OSSODPS所以这里选择手动上传。
[attachment=62112] :|P[u+v  
5、应用结构展示。
[attachment=62113] x)h|!T=B~  
....... X:c k  
Kpx(x0^2  
太专业的帖子了,楼主很牛 n*Q~<`T  
有两个地方需要解释一下: AxbQN.E  
1)push doc 是有限制的,每次不能大于2m,每秒不能大于5次,只要在这个范围之内的话应该就没有问题。 *G6Py,- !f  
2)search 我看并发150就已经很慢了,这个应该不在预期范围内,你是用的java 的sdk .jar包吗?如果是的话可以解压然后重新编译一下jar包,解压之后修改连接池的大小(我怀疑是java开的连接池太小的缘故),修改src/main/java/com/opensearch/javasdk/util/HttpClientFactory.java 第50行,修改如下: oQ=v:P]  
    private static final int DEFAULT_MAX_CONNECTIONS_PER_ROUTE = 5; +Ui @3Q  
改为 _3_kvs  
    private static final int DEFAULT_MAX_CONNECTIONS_PER_ROUTE = 50; bJ$6[H-:  
?$>#FKrt  
5Wyo!pRi  
然后在测试一下,150并发在api层面不是瓶颈所以怀疑是sdk的连接池太小导致的。你可以测试一下然后结果在发出来看看。 de&*#O5  
bGO[P<<  
HoTg7/iK  
另外我们的联系群:1318169830 有问题可以随时在里边沟通。
级别: 新人
发帖
16
云币
30
只看该作者 10楼 发表于: 2014-10-10
Re【阿里云产品公测】大数据下精确快速搜索OpenSearch
Lucene  什么的弱爆了
级别: 小白
发帖
21
云币
41
只看该作者 11楼 发表于: 2014-10-10
Re【阿里云产品公测】大数据下精确快速搜索OpenSearch
评测很详细。感谢!
级别: 论坛版主
发帖
3414
云币
8980

只看该作者 12楼 发表于: 2014-10-11
回 9楼(yunfeifan) 的帖子
第一个问题 如果我一次性 重建索引的话、push的度还得自己把握就是了、这东西没有配额嘛? w`N|e0G@  
第二个问题 150 并发是当前没采用OpenSearch 的 哈哈、不好意思表述不清。采用后还没有测试、应该极快。通过那个10万级测试应该能够得出结论。
发帖
329
云币
404
只看该作者 13楼 发表于: 2014-10-12
近期会有一次上线,届时push doc后索引生效速度将会在10s左右
[ 此帖被辉天在2014-10-12 22:23重新编辑 ]
级别: 论坛版主
发帖
3414
云币
8980

只看该作者 14楼 发表于: 2014-10-13
回 13楼(辉天) 的帖子
弱弱的问下push多少doc 控制在10s以内 yJMHm8OB7  
发表主题 回复主题
« 返回列表
«1234»
共4页
上一主题下一主题

限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
验证问题: 阿里云官网域名是什么? 正确答案:www.aliyun.com
上一个 下一个
      ×
      全新阿里云开发者社区, 去探索开发者的新世界吧!
      一站式的体验,更多的精彩!
      通过下面领域大门,一起探索新的技术世界吧~ (点击图标进入)