电商搜索中要实现这么一块功能,当输入文字时候。下拉框提示。类似于百度搜索

在师出名门的基于lucene的solr搜索引擎中。提供了 拼写检查和智能提示这块功能。

  拼写检查就是用来检查用户输入的检索内容是否存在,假设不存在则,给它提示出相近,或相似的内容。

  而检索建议则是用户输入某个检索条件后。会立马友好的给出一系列提示内容,并推荐首个出现的相似的词,作为推荐词。

也就是说 拼写检查是能够作为一个单独功能使用,但suggest一般引用拼写检查组件

实现过程。配置solrconfig.xml

  <searchComponent name="suggest" class="solr.SpellCheckComponent">
<!-- <str name="queryAnalyzerFieldType">text_general</str> -->
<lst name="spellchecker">
<str name="name">suggest</str>
<str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
<str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>
<str name="field">article</str>
<float name="threshold">0.0001</float>
<!-- 使用自己定义suggest词库词能够将例如以下两行的凝视取消
<str name="sourceLocation">suggest.txt</str>
<str name="spellcheckIndexDir">spellchecker</str>
-->
<str name="comparatorClass">freq</str>
<str name="buildOnOptimize">true</str>
<str name="buildOnCommit">true</str>
</lst>
</searchComponent>
<requestHandler name="/suggest" class="solr.SearchHandler">
<lst name="defaults">
<str name="spellcheck">true</str>
<str name="spellcheck.dictionary">suggest</str>
<str name="spellcheck.count">11</str>
<str name="spellcheck.onlyMorePopular">true</str>
<str name="spellcheck.extendedResults">false</str>
<str name="spellcheck.collate">true</str>
<!--<str name="spellcheck.build">true</str> -->
</lst>
<arr name="components">
<str>suggest</str>
</arr>
</requestHandler>

重新启动solr服务。运行solrjclient代码

	/**
* @method: spellcheck
* @Description: 智能提示 Solr里叫做Suggest模块
*/
public static List<Map<String, String>> suggest(String word,String corename) {
SolrServer server=Indexer.getHttpSolrServer(corename);
List<Map<String, String>> wordList = new ArrayList<Map<String, String>>();
try {
SolrQuery query = new SolrQuery();
query.set("q", word);// 查询的词
query.set("qt", "/suggest");// 请求到suggest中
// query.set("spellcheck.count", "");// 返回数量
QueryResponse rsp = server.query(query); // 上面取结果的代码
SpellCheckResponse re = rsp.getSpellCheckResponse();// 获取拼写检查的结果集
if (re != null) {
for (Suggestion s : re.getSuggestions()) {
List<String> list = s.getAlternatives();// 获取全部 的检索词
for (String spellWord : list) {
Map<String, String> map = new HashMap<String, String>();
map.put("code", spellWord);
wordList.add(map);
}
}
// String t = re.getFirstSuggestion(word);// 获取第一个推荐词
}
} catch (Exception e) {
e.printStackTrace();
}
return wordList;
}

前端简单效果图:

最新文章

  1. python windows时间同步工具
  2. C++_static与非static成员(函数)
  3. OpenCV相机标定和姿态更新
  4. Openstack的用户登录流程
  5. laravel的安装
  6. js addEventListener attachEvent
  7. 【Oracle学习笔记-4】内连接和外连接的区别
  8. Codeforces Round #261 (Div. 2) D 树状数组应用
  9. Shell脚本——DHCP自动部署
  10. Amazon MWS 上传数据 (一) 设置服务
  11. useradd新建用户和权限分配
  12. sybase数据库和oracle数据库中字段中含有换行符的解决办法
  13. Activiti-03-query api
  14. tp路由+伪静态+去掉index.php
  15. Python类变量和实例变量
  16. 碰到了通过Movie显示gif图片,有部分图片的duration为0导致gif只显示第一帧
  17. ldap 导出、导入ldif数据
  18. 10 种机器学习算法的要点(附 Python 和 R 代码)
  19. Zookeeper的集群安装
  20. JAVA设计模式-设计原则

热门文章

  1. 我在16ASPX下了一个系统是ACCESS和VS2005做的我想把那个连接数据库的&#39;DB_16aspx&#39;的名字改了进不了了可是?
  2. 【转】2017PHP程序员的进阶之路
  3. (29)C#多线程
  4. Spring项目搭建
  5. 用Xcode6的Leaks检测内存泄漏
  6. Ubuntu 16.04通过网络配置工具NetworkManager设置IP、网关、DNS和查看IP、网关、DNS
  7. 打包工具 使用帮助 inno setup
  8. JAVA常见算法题(八)
  9. C++ 如何得到当前进程所占用的内存呢?【转】
  10. ISP模块之RAW DATA去噪(一)