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