基於key-Value store indexer ,solrcloud建立Hbase二級索引 1.HBase表啓用replication 建立新表: create 'table',{NAME => 'cf', REPLICATION_SCOPE => '1'} #其中1表示開啓replication功能,0表示不開啓,默認爲0 或修改已經存在的表: disable 'table'
alter 'table',{NAME => 'cf', REPLICATION_SCOPE => '1'}
enable 'table'php
2.建立一個你須要索引的Solr Collection 2.1 生產實體配置文件: solrctl instancedir --generate $HOME/solr_conf #其中$HOME爲本身設置的一個放置生成實體配置文件的目錄,譬如我設置的爲/data1/bbdhadoop/luobenhua/install;solr_conf 爲生成的這個配置的目錄名稱 生成配置文件後會在solr_conf/conf這個目錄下產生不少配置文件,咱們能夠根據本身的須要修改schema.xml文件,將須要建立索引的列名添加到schema.xml中,例如:node
<field name="fname" type="string" indexed="true" stored="true"/> <field name="university" type="int" indexed="true" stored="true"/> <field name="address" type="string" indexed="true" stored="true" />web
須要說明的是,在schema.xml中uniqueKey必須爲rowkey,而rowkey使用'id'字段表示,因此<field>中必需要有id字段apache
注意:該配置文件的name字段的名字必定要與Morphlines.conf 配置文件中outputField 字段的名字一致 2.2建立 collection 實例並將配置文件上傳到 zookeeper: solrctl --zk c4node11:2181,c4node13:2181,c4node12:2181/solr instancedir --create user_index $HOME/solr_conf 說明:solr的安裝過程當中默認指定solr的工做目錄爲的zk節點爲/solr目錄,因此在上傳配置文件到zk時須要將/solr的根目錄加上,上傳成功後將在zk中的/solr/configs/ user _index下面查詢到上傳的各個配置文件。 附件管理命令: 查看實體: solrctl --zk c4node11:2181,c4node13:2181,c4node12:2181 instancedir --list 刪除實體: solrctl --zk c4node11:2181,c4node13:2181,c4node12:2181 instancedir --delete user_index 2.3 建立鏈接 上傳到 zookeeper 以後,其餘節點就能夠從上面下載配置文件。接下來建立 collection: solrctl --zk c4node11:2181,c4node13:2181,c4node12:2181 collection --create user_index -s 3 -r 2 -m 3 其中:-s表示設置Shard數爲3,-r表示設置的replica數爲2 -m表示設置最大shard數量json
重要說明:建立collection時,當該操做是在solr集羣機器上面執行,操做命令如上; 若是不在集羣內機器上面執行,者需加上 --solr http://c4node5:8983/solr 參數ruby
3.生成Lily HBase Indexer配置文件 在HBase-Solr的安裝目錄/opt/cloudera/parcels/CDH/lib/hbase-solr下,建立morphline-hbase-mapper.xml文件,文件內容以下: $ cat $HOME/morphline-hbase-mapper.xml服務器
<?xml version="1.0"?> app
<indexer table=" test_tab_index " mapper="com.ngdata.hbaseindexer.morphline.MorphlineResultToSolrMapper">ide
<!-- The relative or absolute path on the local file system to the morphline configuration file. --> oop
<!-- Use relative path "morphlines.conf" for morphlines managed by Cloudera Manager -->
<param name="morphlineFile" value="morphlines.conf"/> <!-- The optional morphlineId identifies a morphline if there are multiple morphlines in morphlines.conf --> <!-- <param name="morphlineId" value="morphline1"/> --> </indexer>
說明:其中table表示須要索引的HBase表名稱,上面爲record表;mapper表示用來實現和讀取指定的Morphline配置文件類,固定爲MorphlineResultToSolrMapper。param中的name參數用來指定當前配置爲morphlineFile文件,value用來指定morphlines.conf文件的路徑,絕對或者相對路徑用來指定本地路徑,若是是使用Cloudera Manager來管理morphlines.conf就直接寫入值「morphlines.conf」。注意:當使用絕對或者相對路徑來指定路徑時,集羣中的其它機器也要在配置路徑上有該文件,若是是經過Cloudera Manager管理的話只須要在CM中修改後便可,CM會自動分發給集羣
4.修改Morphlines配置文件 在CM管理界面: 具體操做爲:進入Key-Value Store Indexer面板->配置->服務範圍->Morphlines->Morphlines文件 morphlines : [
{
id : morphline1 importCommands : ["org.kitesdk.morphline.", "com.ngdata."]
commands : [
{
extractHBaseCells {
mappings : [
{
inputColumn : "cf:fname"
outputField : "fname"
type : string
source : value
}
{
inputColumn : "cf: university "
outputField : " university "
type : string
source : value
} {
inputColumn : "cf:address"
outputField : "address"
type : string
source : value
}
] } } { logTrace { format : "output record: {}", args : ["@{}"] } } ]
} ]
說明: id:表示當前morphlines文件的ID名稱。 importCommands:須要引入的命令包地址。 extractHBaseCells:該命令用來讀取HBase列數據並寫入到SolrInputDocument對象中,該命令必須包含零個或者多個mappings命令對象。 mappings:用來指定HBase列限定符的字段映射。 inputColumn:須要寫入到solr中的HBase列字段。值包含列族和列限定符,並用‘:’分開。其中列限定符也可使用通配符‘*’來表示,譬如可使用data:表示讀取只要列族爲data的全部hbase列數據,也能夠經過data:my來表示讀取列族爲data列限定符已my開頭的字段值。 outputField:用來表示morphline讀取的記錄須要輸出的數據字段名稱,該名稱必須和solr中的schema.xml文件的字段名稱保持一致,不然寫入不正確。 type:用來定義讀取HBase數據的數據類型,咱們知道HBase中的數據都是以byte[]的形式保存,可是全部的內容在Solr中索引爲text形式,因此須要一個方法來把byte[]類型轉換爲實際的數據類型。type參數的值就是用來作這件事情的。如今支持的數據類型有:byte,int,long,string,boolean,float,double,short和bigdecimal。固然你也能夠指定自定的數據類型,只須要實現com.ngdata.hbaseindexer.parse.ByteArrayValueMapper接口便可。 source:用來指定HBase的KeyValue那一部分做爲索引輸入數據,可選的有‘value’和'qualifier',當爲value的時候表示使用HBase的列值做爲索引輸入,當爲qualifier的時候表示使用HBase的列限定符做爲索引輸入。
5.註冊Lily HBase Indexer配置文件到Lily HBase Indexer Service服務 當前面的全部步驟完成以後,咱們須要把Lily HBase Indexer的配置文件註冊到Zookeeper中,使用以下命令: hbase-indexer add-indexer
--name userTestIndexer
--indexer-conf /data1/bbdhadoop/luobenhua/install/morphline-hbase-mapper.xml
--connection-param solr.zk=c4node11:2181,c4node13:2181,c4node12:2181/solr
--connection-param solr.collection=user_index
--zookeeper c4node11:2181,c4node13:2181,c4node12:2181
查看service服務: hbase-indexer list-indexers --zookeeper c4node11:2181,c4node13:2181,c4node12:2181 刪除service服務: hbase-indexer delete-indexer -n userTestIndexer --zookeeper c4node11:2181,c4node13:2181,c4node12:2181
6.HBase寫入數據 向HBase中配置的索引表寫入數據 當寫入數據後,稍過幾秒咱們能夠在相對於的solr中查詢到該插入的數據,代表配置已經成功。
7.JAVA API操做solr讀取數據 public void getHbaseDataFromSolr(){ String url = "http://118.123.9.95:8983/solr/test_index"; //鏈接solr的url,test_index爲上面建立的solr的鏈接實例名稱 SolrServer server = new HttpSolrServer(url); long startTime = System.currentTimeMillis(); SolrQuery query = new SolrQuery("fname:aaa_176 AND address:bejing_264 AND university:chuanda_352 "); //按列條件查詢語句,具體的查詢語法見目錄8 query.setStart(0); // 數據起始行,分頁用 query.setRows(10); // 返回記錄數,分頁用 QueryResponse response=null; try { response = server.query(query); } catch (SolrServerException e) { e.printStackTrace(); } SolrDocumentList docs = response.getResults(); System.out.println("文檔個數:" + docs.getNumFound()); // 數據總條數也可輕易獲取 System.out.println("查詢時間:" + response.getQTime()); for (SolrDocument doc : docs) { System.out.println((String) doc.getFieldValue("id") + "\t" + (String) doc.getFieldValue("fname") + "\t" + (String) doc.getFieldValue("address") + "\t" + (String) doc.getFieldValue("university")); } long endTime = System.currentTimeMillis(); System.out.println(endTime - startTime); }
小數據量查詢效率: 數據量20W的表,按照上面的條件對三個字段按照條件查詢,響應時間再毫秒級
更大數據量的效率還需進一步作詳細測試。 8. solr的經常使用查詢語法 8.1 solr web ui經常使用查詢參數說明
q - 查詢字符串,必須的。
fl - 指定返回那些字段內容,用逗號或空格分隔多個。
start - 返回第一條記錄在完整找到結果中的偏移位置,0開始,通常分頁用。
rows - 指定返回結果最多有多少條記錄,配合start來實現分頁。
sort - 排序,格式:sort=<field name>+<desc|asc>[,<field name>+<desc|asc>]… 。示例:(inStock desc, price asc)表示先 「inStock」 降序, 再 「price」 升序,默認是相關性降序。
wt - (writer type)指定輸出格式,能夠有 xml, json, php, phps, 後面 solr 1.3增長的,要用通知咱們,由於默認沒有打開。
fq - (filter query)過慮查詢,做用:在q查詢符合結果中同時是fq查詢符合的,例如:q=mm&fq=date_time:[20081001 TO 20091031],找關鍵字mm,而且date_time是20081001到20091031之間的。官方文檔:http://wiki.apache.org/solr/CommonQueryParameter
不經常使用 q.op - 覆蓋schema.xml的defaultOperator(有空格時用"AND"仍是用"OR"操做邏輯),通常默認指定 「OR」 df - 默認的查詢字段,通常默認指定 qt - (query type)指定那個類型來處理查詢請求,通常不用指定,默認是standard。 其它 indent - 返回的結果是否縮進,默認關閉,用 indent=true|on 開啓,通常調試json,php,phps,ruby輸出纔有必要用這個參數。 version - 查詢語法的版本,建議不使用它,由服務器指定默認值。 solrconfig.xml的配置實例
查詢配置(以上參數項均可以配置到該配置文件) <requestHandler name="/select" class="solr.SearchHandler"> <lst name="defaults"> <str name="echoParams">explicit</str> <int name="rows">10</int> <str name="defType">edismax</str> //使用的是solr 擴展的查詢解析器 <str name="q.alt">:</str> <str name="fq">sell_price:[1 TO *]</str> <str name="hl">true</str> <str name="hl.fl">room_name</str> <str name="bf">sum(product(termfreq(room_status,"dzz"),1.2),1)</str> //額外的評分字段,這個是能夠影響score的打分的 <str name="pf"> //要查詢的字段 room_name house_code room_code zr_house_code hire_commissioner_name broker_name rating_address resblock_name district_name subway_station_name subway_line_name </str> <str name="qf"> //各自段分配的權重 room_name^5 house_code room_code zr_house_code hire_commissioner_name broker_name rating_address resblock_name^2 district_name subway_station_name subway_line_name </str> </lst> </requestHandler>
另外schema.xml的defaultOperator參數是個很重要的參數,默認是「OR」,意思是要查詢的關鍵詞作完分詞後的詞作 「OR」鏈接,而後再作查詢,而「AND」呢,要至少全包含要搜索的關鍵詞才行。
8.2 Solr的檢索運算符 「:」 指定字段查指定值,如返回全部值*:² 「?」²表示單個任意字符的通配 「」 表示多個任意字符的通配(不能在檢索的項開始使用*或者?符號)² 「~」²表示模糊檢索,如檢索拼寫相似於」roam」的項這樣寫:roam~將找到形如foam和roams的單詞;roam~0.8,檢索返回類似度在0.8以上的記錄。 ²鄰近檢索,如檢索相隔10個單詞的」apache」和」jakarta」,」jakarta apache」~10 「^」²控制相關度檢索,如檢索jakarta apache,同時但願去讓」jakarta」的相關度更加好,那麼在其後加上」^」符號和增量值,即jakarta^4 apache 布爾操做符AND、||² 布爾操做符OR、²&& 布爾操做符NOT、!、-²(排除操做符不能單獨與項使用構成查詢) 「+」 存在操做符,要求符號」+」後的項必須在文檔相應的域中存在² ( ) 用於構成子查詢² ² [] 包含範圍檢索,如檢索某時間段記錄,包含頭尾,date:[200707 TO 200710] {}²不包含範圍檢索,如檢索某時間段記錄,不包含頭尾 date:{200707 TO 200710} " 轉義操做符,特殊字符包括+ -² && || ! ( ) { } [ ] ^ 」 ~ * ? : "
非空數據的查詢 好比:fq=fcode:['' TO *] 查詢fcode非空的數據 取反實例:fq=!fstate:1
8.3 facet查詢
分類統計 facet q=*:*&facet=true&facet.field=cat&facet.field=inStock //按cat inStock進行分類統計 q=ipod&facet=true&facet.query=price:[0 TO 100]&facet.query=price:[100 TO *] //區間統計 價格在0-100 和100-無窮大的 --solr的分組查詢(facet) http://IP:port/solr/room/select?rows=0&q=bizcircle_code:XXXXXX&facet=on&facet.field=resblock_id&facet.field=resblock_name&facet.limit=3 //同一個bizcircle_code下的 前三個resblock 各自的文檔數量