`
zha_zi
  • 浏览: 584626 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

solr第一弹 autocomplete(自动补全)

阅读更多

 

         百度和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();
  • 大小: 13.7 KB
分享到:
评论
4 楼 panghaoyu 2017-03-15  
实现一个智能提示功能需要ajax、数据库、jsp/php、算法等很多知识,
如果数据量大,还需要特殊优化
一个小功能,花费太大精力很不划算
我使用了92find.c-o-m的搜索框智能提示功能托管服务,
只要一行javascript代码就可以实现百度、淘宝搜索框提示的全部功能
比如:汉字拼音匹配、拼音前缀匹配、模糊搜索、智能容错,还可以自定义提示词汇及其排序权重
花五分钟我的网站就可以部署同百度、淘宝一样强大好用的输入提示功能
同时兼容IE、Firefox、Safari、Chrome、Opera各种浏览器
兼容ios、Android、Windows
3 楼 飞天奔月 2012-11-20  
ak121077313 写道
额 其实我想知道是怎么抓取页面的。

jsoup 你也可以尝试下
2 楼 zha_zi 2011-04-08  
数据采集不是我负责的,但是我知道是用heritrix-1.14.3.zip这个东西搞得
1 楼 ak121077313 2011-04-08  
额 其实我想知道是怎么抓取页面的。

相关推荐

Global site tag (gtag.js) - Google Analytics