需求:实现一种类似于京东的自动提示功能。
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()); } } } } } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-10 06:36:46