solr第一彈 autocomplete(自動補全)
阿新 • • 發佈:2019-02-14
百度和google中都有文字的自動補全功能,以前專案中也用過實現思路非常簡單一般就是extjs 或者jquery 的前臺外掛通過非同步載入資料然後顯示,
現在專案的資料來源是基於solr所以只有使用solr的autocomplete功能,搜尋了很多無數 百度上的 網頁根本沒有關於solr的自動補全的功能實現,就連關於solr應用性的文章也是比較少的,無奈只好在google上搞了,全都是英文的,嘗試了很多的方法都不能使用最後發現是solr api的問題國外的大部分資料都是用得這個寫法
private List<Term> query(String q, int limit) { List<Term> items = null; CommonsHttpSolrServer server = null; try { server = new CommonsHttpSolrServer("http://localhost:8983/solr"); } catch(Exception e) { e.printStackTrace(); } // escape special characters SolrQuery query = new SolrQuery(); query.addTermsField("spell"); query.setTerms(true); query.setTermsLimit(limit); query.setTermsLower(q); query.setTermsPrefix(q); query.setQueryType("/terms"); try { QueryResponse qr = server.query(query); TermsResponse resp = qr.getTermsResponse(); items = resp.getTerms("spell"); } catch (SolrServerException e) { items = null; } return items; }
但是不知道是人品問題還是怎麼的,我下載的solr1.4 SolrQuery類根本就沒有這個addTermsField 和setTermsPrefix 方法,
這是我的下載地址http://mirror.nus.edu.sg/apache//lucene/solr/1.4.1/
solr實現autocomplete功能其實非常簡單,僅僅需要下邊的這個url就可以實現
fl=id,name&rows=0&q=*:*&facet=true&facet.field=name_auto&facet.mincount=1&facet.prefix=input
我們所要做的就是用solrj的api拼裝成這個字串請求tomcat就ok了
下面是拼裝程式碼
CommonsHttpSolrServer service = new CommonsHttpSolrServer( "http://localhost:8080/solr/targetCore"); List<Term> list = new ArrayList<Term>(); QueryResponse queryResponse = new QueryResponse(); SolrQuery query = new SolrQuery(); // fl=id,name&rows=0&q=*:*&facet=true&facet.field=searchText&facet. // mincount=1&facet.prefix=sony //facet=true&rows=0&fl=id%2Cname&facet.prefix=sony&facet.field=searchText try { query.setFacet(true); query.setRows(0); query.setQuery("*:*"); query.setFacetPrefix("sony"); query.addFacetField("searchText"); System.out.println(query.toString()); queryResponse = service.query(query, METHOD.POST); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); }
返回的內容如下
searchText 中的以sony開頭的詞都是自動補全的結果,其實這些都是lucene中的term
下邊程式碼使用solrj的api解析文字的過程
CommonsHttpSolrServer service = new CommonsHttpSolrServer(
"http://localhost:8080/solr/targetCore");
List<Term> list = new ArrayList<Term>();
QueryResponse queryResponse = new QueryResponse();
SolrQuery query = new SolrQuery();
// fl=id,name&rows=0&q=*:*&facet=true&facet.field=searchText&facet.
// mincount=1&facet.prefix=sony
//facet=true&rows=0&fl=id%2Cname&facet.prefix=sony&facet.field=searchText
try {
query.setFacet(true);
query.setRows(0);
query.setQuery("*:*");
query.setFacetPrefix("索尼");
query.addFacetField("searchText");
System.out.println(query.toString());
queryResponse = service.query(query, METHOD.POST);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
NamedList<Object> nl = queryResponse.getResponse();
NamedList<Object> nl2 = (NamedList<Object>) nl.get("facet_counts");
NamedList<Object> nl3 = (NamedList<Object>) nl2.get("facet_fields");
NamedList<Object> nl4 = (NamedList<Object>) nl3.get("searchText");
System.out.println(nl4.size());
Iterator<Entry<String, Object>> it = nl4.iterator();
while (it.hasNext()) {
Entry<String, Object> entry = it.next();
System.out.println(entry.getKey() + "____" + entry.getValue());
}
SolrDocumentList results = queryResponse.getResults();
SolrResult solrResult = new SolrResult();