您的位置:首页 > 其它

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

2015-07-28 18:18 357 查看
需求:实现一种类似于京东的自动提示功能。



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());
}
}
}

}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: