【阿里云产品公测】大数据下精确快速搜索OpenSearch
2019獨角獸企業重金招聘Python工程師標準>>>
【阿里云產品公測】大數據下精確快速搜索OpenSearch
作者:阿里云用戶小柒2012
? ? ? 相信做過一兩個項目的人都會遇到上級要求做一個類似百度或者谷歌的站內搜索功能。傳統的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半天報錯
復制代碼
十月 10, 2014 8:43:48 上午 org.apache.http.impl.client.DefaultRequestDirector tryExecute
信息: I/O exception (java.net.SocketException) caught when processing request: Connection reset by peer: socket write error
十月 10, 2014 8:43:48 上午 org.apache.http.impl.client.DefaultRequestDirector tryExecute
信息: Retrying request
感覺應該是阿里云服務端做了限制、一次性push 10000條記錄就會中斷、選擇每1000條數據push一次、?測試插入10000條數據:71940ms。
本地測試插入?五萬條數據?一次push 1000條數據花費時間:210267ms
本地測試插入?十萬條數據?一次push 1000條數據?到6萬的時候中斷、不清楚是否阿里云服務端限制、如果后臺定時任務一次性構建百萬或者千萬條數據是否還有影響。
具體一次性push多少數據、我沒有詳細的測試、應該是越多越好、以上是測試數據僅供參考、并不是十分準確。
至此一共插入124147條數據?也算是10萬級別的了。
2、查詢數據
以上為查詢關鍵詞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));
????}
}
?
javaWeb測試系統稍后放出?
?
評測總結:?
優點:
????1:?? 省去了配置以及維護solr運營成本、數據直接扔給opensearch、用戶不用再去關心宕機、集群的問題。
????2:阿里后臺有清晰的應用結構、錯誤日志、基本信息、配額管理以及數據統計、界面化管理一目了然。
????3:應用自定義結構、相比于solr的配置schema.xml要耐看的多。
????4:支持復雜查詢、排序表達式、可聚合、可過濾以及多次查詢等特點、基本滿足了項目的需求。
????5:還有很多自己摸索、、、、
?
缺點:?
? ? 1:推送數據、每秒推送次數5次?每個包大小編碼前2M、這些限制肯定有它的道理、服務開銷或者技術瓶頸什么的、按說阿里不會有神馬技術瓶頸吧。問題是如果數據丟失或者重構索引我應該一次push多少在表結構不是很確定的情況下。?
---數據推送可以批量發送,按照目前的設置每秒可以推送10M數據,基本可以滿足用戶需求,這個主要是從節省系統資源、提高效率來考慮的,當然如果有更多需求可以跟我們聯系。另外,索引重建不需要重新推送數據。
????2:查看API?搜索返回的格式?有xml,?json和protobuf?這三種、是否可以像solr一樣導入@FILE?直接轉化為試題類的API、這樣其實包括add或者search?都會變得相對簡單一些吧。?
---我們正在規劃Lucene、Solr、ElasticSearch等通用開源產品的適配接口,方便開源用戶無縫對接,敬請期待。
???3:是否能做的像CNZZ統計一樣就更高達上了。?
---統計方面后續也會推出很多衍生產品,比如topquery、熱詞、相關文章、下拉提示等等,敬請期待。
???4:貌似后臺索引只能單個刪除、能否一鍵刪除或者個性化刪除。雖然這些功能API都可以做到、但是還是希望阿里能搞定它。?
---刪除功能目前僅支持doc級別,后續會推出應用清空功能,如果還有其他需求可以反饋給我們。
???5:價格問題?你懂我懂大家都懂。?
---預計12月會啟動商業化流程。
?
Opensearch整合小項目:目前只是實現了?分頁飄紅效果?后續API所有功能將補充完畢。?
?
Constants.java 存放常量:?
復制代碼
public class Constants {
????//應用名稱
????public static final String??INDEXNAME = "52itstyle";
????//分頁條數
????public static final int PAGESIZE = 10;
}
?
OpenSearchUtil.java 獲取服務:?
復制代碼
public class OpenSearchUtil {
????private static final String??ACCESSKEY = "xxx";
????private static final String??SECRET??= "xxx";
????private static final String??URL = "http://opensearch.aliyuncs.com";
????private static CloudsearchClient client;
????private static Object lock = new Object();
????public static CloudsearchClient getInstance() throws MalformedURLException {
????????if (client == null) {
????????????synchronized (lock) {
????????????????if (client == null) {
?????????????????? Map<String, Object> opts = new HashMap<String, Object>();
???????????????????? opts.put("host", URL);
???????????????????? client = new CloudsearchClient(ACCESSKEY, SECRET , opts,KeyTypeEnum.ALIYUN);
????????????????}
????????????}
????????}
????????return client;
????}
}
?
OpenSearch.java 操作類 增刪查改:?
復制代碼
public class OpenSearch extends BaseAction {
????private Integer pageNo;
????private String content;
????public void queryOpenSearch() throws Exception{
????????CloudsearchSearch search = new CloudsearchSearch(OpenSearchUtil.getInstance());
????????// 添加指定搜索的應用:
????????search.addIndex(Constants.INDEXNAME);????
????????// 索引字段名稱是您在您的數據結構中的“索引到”字段。
????????search.setQueryString(content);
????????//參數一 要飄紅的字段 、參數二 數據截取字數100、參數三 多余部分...顯示、參數四飄紅顯示幾段 、參數五六為html標簽可以自定義
????????search.addSummary("content", 200, "......", 3, "<font color='red'>", "</font>");
????????//分頁查詢
????????search.setStartHit((pageNo-1)*Constants.PAGESIZE > 0 ? (pageNo-1)*Constants.PAGESIZE : 0);
????????//每頁顯示10條
????????search.setHits(Constants.PAGESIZE);
????????//指定搜索返回的格式為json
????????search.setFormat("json");
????????//返回搜索結果。
????????printMsgToClient(search.search());
????}
????public Integer getPageNo() {
????????return pageNo;
????}
????public void setPageNo(Integer pageNo) {
????????this.pageNo = pageNo;
????}
????public String getContent() {
????????return content;
????}
????public void setContent(String content) {
????????this.content = content;
????}
}
?
search.html 頁面展示:?
復制代碼
function openSearch(pageNo){
????var content = $("#content").val()=="阿里云搜索"?"": $("#content").val();
???? $.ajax({
????????????url:'openSearch_queryOpenSearch.action',
??????????????async:false,
??????????????type:'post',
??????????????dataType:"json",
??????????????data:{'time':(new Date()).toString(),'pageNo':pageNo,'content':content},
????????????success:function(result){
????????????????//alert(result.status);//返回狀態
????????????????//alert(result.result.searchtime);//查詢時間
????????????????//alert(result.result.total);//數據總數
????????????????//alert(result.result.num);//展示個數
????????????????//alert(result.result.viewtotal);//最多展示個數
????????????????//alert(result.result.items)//實體數據
????????????????var searchtime ="找到相關結果"+result.result.total+"條 (用時"+result.result.searchtime+"秒)";
????????????????gotoPagePrev(pageNo,result.result.total,"perPagination","endPagination","openSearch",10,"master","條");
????????????????$("#searchtime").html(searchtime);
????????????????var array = eval(result.result.items);
????????????????var str ='';
????????????????for(var i=0;i<array.length;i++){
????????????????????str +='';
????????????????????str +='<div class="ttlist_box">';
????????????????????str +='??<div class="ttlist_tle jb_tit">';
????????????????????str +='<div class="ttlist_tle1 clearfix">';
????????????????????str +='<div class="tst_nm2 fl ">';
????????????????????str +=' <span>文章編號:<i class="c_gray">'+array[i].id+'</i></span>';
????????????????????str +='??????</div>';
????????????????????str +='???????? <div class="tst_wuse fl ">';
????????????????????str +='???????? </div>';
????????????????????str +='???????? <div class="tst_dft fl">';
????????????????????str +='???????? </div>';
????????????????????str +='???????? <div class="tst_tjq fl ">';
????????????????????str +='???????? </div>';
????????????????????str +='???????? <div class="tst_tjd fl">';
????????????????????str +='???????? </div>';
????????????????????str +='???????? <div class="fr">';
????????????????????str +='???????? </div>';
????????????????????str +='??????</div>';
????????????????????str +='??????<div class="ttlist_tle2 clearfix">';
????????????????????str +='??????????<div class="tst_kng fl clearfix">';
????????????????????str +='?????????? </div>';
????????????????????str +='????????????<div class="tst_skl fl clearfix">';
????????????????????str +='????????????</div>';
????????????????????str +='??????????<div class="tst_enj fl">';
????????????????????str +='?????????? </div>';
????????????????????str +='?????? </div>';
????????????????????str +='?? </div>';
????????????????????str +='??<div class="ttlist_cont clearfix">';
????????????????????str +='??????<div class="st_ctg">'+array[i].content+'</div>';
????????????????????str +='?? </div>';
????????????????????str +='</div>';
????????????????}
????????????????$("#master").html(str);
????????????},
????????});
}
?
?項目演示地址:http://121.42.26.72:8080/opensearch??
?
原文地址:http://bbs.aliyun.com/read/179042.html???
微博互動:http://weibo.com/1644971875/BrxCRmYbD?mod=weibotime#_rnd1413282678532?
參加活動:http://promotion.aliyun.com/act/aliyun/freebeta/?
轉載于:https://my.oschina.net/u/1464083/blog/330621
總結
以上是生活随笔為你收集整理的【阿里云产品公测】大数据下精确快速搜索OpenSearch的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字信封理解
- 下一篇: php和mvc的认识