solr第一弹 autocomplete(自动补全)

来源:互联网 发布:wpsh5是什么软件 编辑:程序博客网 时间:2024/05/01 06:46

 

         百度和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=searchTexttry {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 exceptione.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=searchTexttry {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 exceptione.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();
原创粉丝点击