`
BradyZhu
  • 浏览: 247587 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

智能提示(二)solr词频统计(TermsComponent)

 
阅读更多

需求:实现一种类似于京东的自动提示功能。


1:用solr 的suggest组件。

2:用TermsComponent

在传统数据库中,有一种模糊查询。。类似于 keyword like "京东%" ,然后统计数量,返回给前端。。但,这样有一个问题。如果该字段非词性的。精确性和效率性不高。

solr中TermsComponent组件完美的解决了这么一个方案,能够统计指定搜索域中 所有词的 信息。类似于lucene Term查询。

刚研究了会solrj的TermsComponent :http://wiki.apache.org/solr/TermsComponent

solrconfig配置如下:

  <searchComponent name="terms" class="solr.TermsComponent"/>
  <!-- A request handler for demonstrating the terms component -->
  <requestHandler name="/terms" class="solr.SearchHandler" startup="lazy">
    <lst name="defaults">
        <bool name="terms">true</bool>
        <bool name="distrib">false</bool>
    </lst>
    <arr name="components">
        <str>terms</str>
    </arr>
  </requestHandler>


返回结果:默认按词的count出现次数倒序排序。

solrj代码:

package com.lubanec.action;

import java.util.List;
import java.util.Map;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.client.solrj.response.TermsResponse;

import com.lubanec.index.service.Indexer;

public class Test {

	public static void main(String[] args) throws Exception {
		// 实例化solrserver,以获取与solrserver的通信
		SolrServer solrserver = Indexer.getHttpSolrServer("goods");
		// 创建查询参数以及设定的查询参数
		SolrQuery params = new SolrQuery();
		params.set("q", "*:*");
		params.set("qt", "/terms");

		// parameters settings for terms requesthandler
		// 参考(refer to)http://wiki.apache.org/solr/termscomponent
		params.set("terms", "true");
		params.set("terms.fl", "goods");
		
        //指定下限
//		params.set("terms.lower", ""); // term lower bounder开始的字符
//		params.set("terms.lower.incl", "true");
//		params.set("terms.mincount", "1");
//		params.set("terms.maxcount", "100");

//		 http://localhost:8983/solr/terms?terms.fl=text&terms.prefix=学 //
//		 using for auto-completing   //自动完成
//		params.set("terms.prefix", "联");
		 params.set("terms.regex", "学+.*");
		 params.set("terms.regex.flag", "case_insensitive");
//		
//		 params.set("terms.limit", "20");
//		 params.set("terms.upper", ""); //结束的字符
//		 params.set("terms.upper.incl", "false");
//		
//		 params.set("terms.raw", "true");

		params.set("terms.sort", "count");//terms.sort={count|index} -如果count,各种各样的条款术语的频率(最高计数第一)。 如果index,索引顺序返回条款。默认是count
		 

		// 查询并获取相应的结果!
		QueryResponse response = solrserver.query(params);
		// 获取相关的查询结果
		if (response != null) {
			TermsResponse termsResponse = response.getTermsResponse();
			if (termsResponse != null) {
				Map<String, List<TermsResponse.Term>> termsMap = termsResponse.getTermMap();
				for (Map.Entry<String, List<TermsResponse.Term>> termsEntry : termsMap.entrySet()) {
//					System.out.println("Field Name: " + termsEntry.getKey());
					List<TermsResponse.Term> termList = termsEntry.getValue();
					for (TermsResponse.Term term : termList) {
						System.out.println(term.getTerm() + " : "+ term.getFrequency());
					}
				}
			}

		}
	}

}







分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics