索引創(chuàng)建和搜索過(guò)程
1.創(chuàng)建索引
舉例子:
文檔一:solr是基于Lucene開(kāi)發(fā)的企業(yè)級(jí)搜索引擎技術(shù)
文檔二:Solr是一個(gè)獨(dú)立的企業(yè)級(jí)搜索應(yīng)用服務(wù)器,Solr是一個(gè)高性能,基于Lucene的全文搜索服務(wù)器
首先經(jīng)過(guò)分詞器分詞,solr會(huì)為分詞后的結(jié)果(詞典)創(chuàng)建索引,然后將索引和文檔id列表對(duì)應(yīng)起來(lái),如下圖所示:
比如:solr在文檔1和文檔2中都有出現(xiàn),所以對(duì)應(yīng)的文檔ID列表中既包含文檔1的ID也包含文檔2的ID,文檔ID列表對(duì)應(yīng)到具體的文檔,并體現(xiàn)該詞典在該文檔中出現(xiàn)的頻次,頻次越多說(shuō)明權(quán)重越大,權(quán)重越大搜索的結(jié)果就會(huì)排在前面。
solr內(nèi)部會(huì)對(duì)分詞的結(jié)果做如下處理:
1.去除停詞和標(biāo)點(diǎn)符號(hào),例如英文的this,that等, 中文的“的”,“一”等沒(méi)有特殊含義的詞
2.會(huì)將所有的大寫英文字母轉(zhuǎn)換成小寫,方便統(tǒng)一創(chuàng)建索引和搜索索引
3.將復(fù)數(shù)形式轉(zhuǎn)為單數(shù)形式,比如students轉(zhuǎn)為student,也是方便統(tǒng)一創(chuàng)建索引和搜索索引
2.索引搜索過(guò)程
知道了創(chuàng)建索引的過(guò)程,那么根據(jù)索引進(jìn)行搜索就變得簡(jiǎn)單了。
1.用戶輸入搜索條件
2.對(duì)搜索條件進(jìn)行分詞處理
3.根據(jù)分詞的結(jié)果查找索引
4.根據(jù)索引找到文檔ID列表
5.根據(jù)文檔ID列表找到具體的文檔,根據(jù)出現(xiàn)的頻次等計(jì)算權(quán)重,最后將文檔列表按照權(quán)重排序返回
使用SolrJ管理索引庫(kù)
使用SolrJ可以實(shí)現(xiàn)索引庫(kù)的增刪改查操作。
3.1 添加文檔
第一步:把solrJ的jar包添加到工程中。
第二步:創(chuàng)建一個(gè)SolrServer,使用HttpSolrServer創(chuàng)建對(duì)象。
第三步:創(chuàng)建一個(gè)文檔對(duì)象SolrInputDocument對(duì)象。
第四步:向文檔中添加域。必須有id域,域的名稱必須在schema.xml中定義。
第五步:把文檔添加到索引庫(kù)中。
第六步:提交。
3.2 刪除文檔
3.2.1 根據(jù)id刪除
第一步:創(chuàng)建一個(gè)SolrServer對(duì)象。
第二步:調(diào)用SolrServer對(duì)象的根據(jù)id刪除的方法。
第三步:提交。
3.2.2 根據(jù)查詢刪除
3.3 查詢索引庫(kù)
第一步:創(chuàng)建一個(gè)SolrServer對(duì)象
第二步:創(chuàng)建一個(gè)SolrQuery對(duì)象。
3 向SolrQuery中添加查詢條件、過(guò)濾條件。。。
第四步:執(zhí)行查詢。得到一個(gè)Response對(duì)象。
5 取查詢結(jié)果。
第六步:遍歷結(jié)果并打印。
3.3.1 簡(jiǎn)單查詢
3.3.2 帶高亮顯示
@Test
public void searchDocumet() throws Exception {
// 創(chuàng)建一個(gè)SolrServer對(duì)象
SolrServer solrServer = new HttpSolrServer(“http://101.132.69.111:8080/solr/collection1”);
// 創(chuàng)建一個(gè)SolrQuery對(duì)象
SolrQuery query = new SolrQuery();
// 設(shè)置查詢條件、過(guò)濾條件、分頁(yè)條件、排序條件、高亮
// query.set(“q”, “*:*”);
query.setQuery(“手機(jī)”);
// 分頁(yè)條件
query.setStart(0);
query.setRows(30);
// 設(shè)置默認(rèn)搜索域
query.set(“df”, “item_keywords”);
// 設(shè)置高亮
query.setHighlight(true);
// 高亮顯示的域
query.addHighlightField(“item_title”);
query.setHighlightSimplePre(“《div》”);
query.setHighlightSimplePost(“《/div》”);
// 執(zhí)行查詢,得到一個(gè)Response對(duì)象
QueryResponse response = solrServer.query(query);
// 取查詢結(jié)果
SolrDocumentList solrDocumentList = response.getResults();
// 取查詢結(jié)果總記錄數(shù)
System.out.println(“查詢結(jié)果總記錄數(shù):” + solrDocumentList.getNumFound());
for (SolrDocument solrDocument : solrDocumentList) {
System.out.println(solrDocument.get(“id”));
// 取高亮顯示
Map《String, Map《String, List《String》》》 highlighting = response.getHighlighting();
List《String》 list = highlighting.get(solrDocument.get(“id”)).get(“item_title”);
String itemTitle = “”;
if (list != null && list.size() 》 0) {
itemTitle = list.get(0);
} else {
itemTitle = (String) solrDocument.get(“item_title”);
}
System.out.println(itemTitle);
System.out.println(solrDocument.get(“item_sell_point”));
System.out.println(solrDocument.get(“item_price”));
System.out.println(solrDocument.get(“item_image”));
System.out.println(solrDocument.get(“item_category_name”));
System.out.println(“=============================================”);
}
}
4. Solr服務(wù)器中的后臺(tái)數(shù)據(jù)處理
這個(gè)其實(shí)是通過(guò)圖形界面操作,只需手動(dòng)填寫查詢條件,不需要進(jìn)行代碼處理。但是實(shí)際項(xiàng)目開(kāi)發(fā)中,還是需要進(jìn)行代碼編寫的。
6
4.1 solr的基礎(chǔ)語(yǔ)法
q 查詢的關(guān)鍵字,此參數(shù)最為重要,例如,q=id:1,默認(rèn)為q=*:*,
fq (filter query)過(guò)慮查詢,提供一個(gè)可選的篩選器查詢。
返回在q查詢符合結(jié)果中同時(shí)符合的fq條件的查詢結(jié)果
sort 排序方式,例如id desc 表示按照 “id” 降序
start 返回結(jié)果的第幾條記錄開(kāi)始,一般分頁(yè)用,默認(rèn)0開(kāi)始
rows 指定返回結(jié)果最多有多少條記錄,默認(rèn)值為 10,配合start實(shí)現(xiàn)分頁(yè)
fl 指定返回哪些字段,用逗號(hào)或空格分隔,注意:字段區(qū)分大小寫,例如,fl= id,title,sort
df 默認(rèn)的查詢字段,一般默認(rèn)指定
wt (writer type)指定輸出格式,有 xml, json, php等
indent 返回的結(jié)果是否縮進(jìn),默認(rèn)關(guān)閉
hl 高亮
hl.fl 設(shè)定高亮顯示的字段
hl.requireFieldMatch 如果置為true,除非用hl.fl指定了該字段,查詢結(jié)果才會(huì)被高亮。它的默認(rèn)值是false。
hl.usePhraseHighlighter 如果一個(gè)查詢中含有短語(yǔ)(引號(hào)框起來(lái)的)那么會(huì)保證一定要完全匹配短語(yǔ)的才會(huì)被高亮。
hl.highlightMultiTerm如果使用通配符和模糊搜索,那么會(huì)確保與通配符匹配的term會(huì)高亮。默認(rèn)為false,同時(shí)hl.usePhraseHighlighter要為true。
hl.fragsize 返回的最大字符數(shù)。默認(rèn)是100.如果為0,那么該字段不會(huì)被fragmented且整個(gè)字段的值會(huì)被返回。
評(píng)論
查看更多