SOLR7實踐 四 查詢

2021-08-30 15:30:14 字數 3254 閱讀 2864

查詢@solr7實踐(四)

先說說客戶的要求

使用者只有乙個搜尋框,可以輸入多個關鍵字進行檢索;

搜尋範圍是公文系統包括檔案標題(title),檔案編號(markid),文種(form),正文(content)等字段,通訊錄包括名字(title),部門(orgname),手機號碼(mobile),郵件位址(email)等字段;

欄位的重要程度 標題》正文;

相關度相同時按時間倒序排列;

搜尋結果可以按照時間範圍進行過濾。

結合偽**說一下怎麼實現的(相信我,**一定跑不通的)

// 變數說明

// 使用者輸入搜尋關鍵字(如:i like beijing)

string keyword;

// keyword用空格拆分的陣列(如:[i, like, beijing])

string keywords;

// keywords用*連線的字串(如:*i*like*beijing*)

string keywordjoinstart;

// keyword加"包裹的字串(如:"i like beijing")

string keywordquot;

// keywords每個元素加"包裹(如:["i", "like", "beijing"])

string keywordsquot;

// 建立solr客戶端

// 建立solr查詢器

solrquery query = new solrquery();

// title,content,srchfld 字段型別為text_ik

// title_copy 拷貝自title,字段型別為string

// srchfld 拷貝自除title,content之外的查詢字段

// *用於模糊匹配可以用在string型別的字段,不能用在text_ik型別的字段

// 」用於精確匹配可以用在string型別也可以用在text_ik型別的字段

// 對title_copy欄位進行了正向的模糊匹配,這個開銷是非常大的,整個搜尋速度慢了10倍!!!

// 好在目前客戶對搜尋速度還可以接受。

// 調查過原因是單個的英數字在經過ik分詞器後被遺棄了,

// 更深層次的原因是 lowercasetokenize***ctory 會過濾掉單個英數字。

// 解決方法有文章提出用edgengramfilte***ctory 替換 lowercasetokenize***ctory ,但對英文本母的大小寫的支援會變差。

query.setparam("q","(title_copy:keywordjoinstart) or (title:keywordquot) or (content:keywordquot) or (srchfld:keywordquot) or (srchfld:keywordsquot[0] and ... and srchfld:keywordsquot[n])");

//設定返回字段列表 * 全部索引字段,score 索引的評分

query.setparam("fl", "*,score");

// 設定返回結果的開始記錄數(從0開始)和總記錄數,完成分頁功能

query.setparam("start", start);

query.setparam("rows", rows);

// 設定過濾字段,完成資料許可權過濾

// solr處理fq時是預設使用快取的,測試過query.addfilterquery(filterquery) 和 query.addfilterquery(filterqueries[i]) 等寫法,可能受限於測試環境和測試資料的原因,搜尋速度未有明顯提公升

query.setparam("fq",filterquery);

// 設定結果排序,先按評分排,再按時間排

query.addsort("score", order.desc);

query.addsort("createtime", order.desc);

// 高亮顯示

// 中文高亮顯示總是有問題,要麼漏詞,要麼只能標紅單字。沒有找到相關解決方法,使用了乙個變通的方案,自己編碼對搜尋結果再進行高亮設定。

query.setparam("hl", highlight);

// 設定高亮顯示的字段列表

query.setparam("hl.fl",flfieldlist);

// 設定高亮顯示的字首

query.setparam("hl.******.pre",fl******pre);

// 設定高亮顯示的字尾

query.setparam("hl.******.post",fl******post);

// 設定highlighted片段的最大數,預設值是1,不需要修改

query.setparam("hl.snippets",flsnippets);

// 設定高亮顯示的snippet返回的最大位元組數

query.setparam("hl.fragsize",flfragsize);

// 設定edismax模式

query.setparam("deftype", "edismax");

// 設定字段權重,影響結果排序

// 排序試了很多方法,記錄下目前的方案(仍有部分資料未能排在應該的位置)

// 只說一下可以影響排序的solr引數和方法

// 引數 q, sort, dismax中 qf,pf,bq,bf,edismax中qf,pf,bq,bf,boost

// 方法 對欄位公升壓,對搜尋關鍵字公升壓,自己建構函式生成權重值等

// 對q中使用到的字段,按照重要性設定不同的權重

query.setparam("pf",」title_copy^100 title^10 content^2 srchfld「);

// 執行查詢接收結果

queryresponse qresponse = new queryresponse();

qresponse = server.query(query);

server.close();

對於多個搜尋關鍵字分布在多個欄位中的排序問題的乙個解決思路,每個欄位用乙個搜尋框,每個欄位都使用精確匹配,設定匹配度為100%,不同字段設定不同的權重,最後結果按時間排序。這可能才是使用者的內心想要的。

Solr 7 配置中文分詞器

原文 cp usr local solr 7.2.1 contrib analysis extras lucene libs lucene analyzers smartcn 7.2 1找到solrhome conf managed schema 新增smartch中文分詞器配置 name text...

CentOS安裝Solr7問題解決

錯誤資訊 error error installing redis 4.0.2.gem redis requires ruby version 2.2.2.解決方案 1.檢視當前 ruby 版本 ruby v 或 ruby version 2.安裝 curl sudo yum install cur...

solr 最佳實踐

管理頁面的data import頁可以手動重建索引,configuration指定了資料來源,重建索引也可以通過http請求觸發 管理頁面的schema頁用來配置索引字段。每天晚上的定時全量重建索引是通過linux的crontab實現的。該目錄下的upsolr.sh是solr的啟動指令碼,配置了je...