solr的日常搜索大家都比较熟悉,稍微提升点的搜索就涉及到了自动补全。下面就亲身测试,说一下自动补全,使用的为solr 6.5版本。


在原有的solr搜索基础上增加自动补全,首先修改solrconfig.xml
searchComponent 为官方wiki的代码,无改动。

<searchComponent class="solr.SpellCheckComponent" name="suggest">  <str name="queryAnalyzerFieldType">text_spell</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">suggestion</str>  <!-- the indexed field to derive suggestions from -->  <float name="threshold">0.0001</float>  <str name="spellcheckIndexDir">spellchecker</str>  <str name="comparatorClass">freq</str>  <str name="buildOnOptimize">true</str>  <!--<str name="buildOnCommit">true</str>-->  </lst>  </searchComponent>  <requestHandler class="org.apache.solr.handler.component.SearchHandler"  name="/suggest">  <lst name="defaults">  <str name="spellcheck">true</str>  <str name="spellcheck.dictionary">suggest</str>  <str name="spellcheck.onlyMorePopular">true</str>  <str name="spellcheck.extendedResults">false</str>  <str name="spellcheck.count">10</str>  <str name="spellcheck.collate">true</str>  </lst>  <arr name="components">  <str>suggest</str>  </arr>  </requestHandler>  <queryConverter name="phraseQueryConverter" class="org.apache.solr.spelling.SpellingQueryConverter"/>
名称 含义
queryAnalyzerFieldType schema.xml中的fieldType类型,如果加了这个选项,拼写检查时会调用这个fieldType的分词器,如果没有加,solr会取field属性上面filetype的分词器,这个时候还找不到,solr会创建一个按空格进行分词(SpellCheckComponent需要一个分词器才能运行),在这们项目中,我们现希望Analyzer不对查询做任何的改变,因此选择string。(网上也建议不要对他定义复杂的分词,如果指定的Analyzer很复杂的话,会导致suggest返回的结果不符合预期)
name 就是取个名字,江湖中的人士都是让他等于suggest
classname org.apache.solr.spelling.suggest.Suggester(不要改动)
lookupImpl org.apache.solr.spelling.suggest.tst.TSTLookup(不要改动)
field 说明只在这个字段上面做拼写检查
threshold 限制一些不常用的词出现,值越大过滤词就越多,取值范围【0~1】官网默认是0.005
comparatorClass ellchecker组件中的comparatorClass参数可配置Suggest返回结果的排序,目前有如下几种可选方案:1.Empty – in which case the default is used. 默认就是这个;2.score – explicitly choose the default case ;3.freq – Sort by frequency first, then score. 通过频率的第一排序,然后得分 (开发时用这个);4.A fully qualified class name – Provide a custom comparator that implements Comparator
buildOnCommit 取值true或者flase当commit的时候,对拼写检查索引进行构建。(只有构建后,拼写检查才有效果)
buildOnOptimize 当optimize的时候,对拼写检查索引进行构建。(只有构建后,拼写检查才有效果)

requestHandler参数含义:

代码 含义
spellcheck 开启检查建议
spellcheck.dictionary 必须与searchComponent中spellchecker标签下suggest配置对应
spellcheck.count 配置拼写检查提示结果的个数(可以根据需要适当加大)
spellcheck.onlyMorePopular 等于true,可以根据权重排序,开发时我一般让他等于true
spellcheck.collate 提供一个查询并与第一个匹配的建议,
components handler拥有的 components,first-components,last-components这三个属性的剖析Solr的handler都是同过这三个属性来取他所依赖的components(组件)备注:handler在运行时,会加载5个默认的组件1.如果配置了components,则SOlr不会运行默认的5个组件。而且你配置的first-components,last-components两个都是无效的。2.如果配置了first-components,SOlr会给handler添加5个默认的组件时,同时会添加first-components配置的组件,而且这个组件最先工作。3.同上,只不过放在最后工作

managed-schema修改

<!-- 单词补全建议--><fieldType name="text_spell" class="solr.TextField">  <analyzer type="index">  <tokenizer class="solr.StandardTokenizerFactory"/>  <filter class="solr.LowerCaseFilterFactory"/>  </analyzer>  <analyzer type="query">  <tokenizer class="solr.StandardTokenizerFactory"/>  <filter class="solr.LowerCaseFilterFactory"/>  </analyzer>  </fieldType><!-- 完整词组建议  --> <fieldType class="solr.TextField" name="text_auto_phrase"><analyzer><tokenizer class="solr.KeywordTokenizerFactory"/><filter class="solr.LowerCaseFilterFactory"/></analyzer></fieldType><field name="suggestion"      type="text_auto_phrase"      indexed="true"      stored="true"      termVectors="true" multiValued="true" /><copyField source="keyword"   dest="suggestion" />

到这配置就完成了。

配置好后,重启solr,导入数据

然后输入suggest

输入单个字符或单个汉字无结果显示解决

查村时加上字段名就可以支持单个字符了

程序调用

/**** 自动建议* @param keyword 格式为:key:value* @return* @author john* @version 2019年2月26日*/protected JSONObject suggest(String keyword) {QueryResponse resp;Map<String,List<String>> map=new LinkedHashMap<>();String collatedResult="";try {//获得solr连接客户端的代码请自查百度HttpSolrClient httpSolrClient = getHttpSolrClient();SolrQuery query = new SolrQuery(keyword);resp = httpSolrClient.query(query);SpellCheckResponse spellCheckResponse = resp.getSpellCheckResponse();Map<String, SpellCheckResponse.Suggestion> suggestionMap = spellCheckResponse.getSuggestionMap();for (String key:suggestionMap.keySet()){SpellCheckResponse.Suggestion suggestion = suggestionMap.get(key);map.put(key,suggestion.getAlternatives());}collatedResult = spellCheckResponse.getCollatedResult();if (StringUtils.isNotBlank(collatedResult)&&collatedResult.indexOf(":")>-1){collatedResult=collatedResult.substring(collatedResult.indexOf(":")+1);}} catch (Exception e) {e.printStackTrace();LogUtils.writeErrLog("SolrBaseSupport", e.getClass().getSimpleName(), "queryCount", e.toString());}JSONObject object=new JSONObject();object.put("suggestions",map);object.put("recommend",collatedResult);return object;}

字段说明参考:https://blog.csdn.net/dandan2zhuzhu/article/details/52025656

solr 6.5 suggest 自动补全(解决单个字符无结果问题)相关推荐

  1. 命令中Tab键无法自动补全解决办法

    文章目录 一:问题详情 二:解决办法 一:问题详情 CRT中命令无法使用Tab键自动补全 二:解决办法

  2. Linux CentOS中按tab键不能自动补全解决办法

    场景: 在CentOS中,理想情况是按下tab键就应该自动补全,但有时会遇到无法补全的服务器 解决: 一.安装 bash-completion 包 yum install -y bash-comple ...

  3. sublime text3解决Gosublime无法自动补全代码

    sublime text3解决Gosublime无法自动补全代码 文章目录 sublime text3解决Gosublime无法自动补全代码 版本 安装Gosublime 自动补全解决方法 Gosub ...

  4. apt-get 自动补全包名

    转自:http://blog.csdn.net/seasonkky/article/details/6321150 现象: bash的一般命令补全正常,apt-get install 的包名无法自动补 ...

  5. intellij IDEA中 introduce local variable 快捷键自动补全

    intellij IDEA中 introduce local variable 快捷键自动补全 解决:Alt+Enter 就会弹出如下界面 选择后 便可以自动补全

  6. pycharm逗号后面补空格_pycharm 取消空格,逗号 等符号的自动补全

    在PyCharm编辑HTML文件时输入Django模板语言时,发现录入 {% 不能自动补全. 找了一下,发现 setting 里可以设置 Python Template Languages,选择自己使 ...

  7. php solr 智能提示,solr 自动补全(智能提示)原理与实现

    自动补全,英文叫autocomplete,好像也叫智能提示,就是用户在输入框敲一个字符会弹出下拉列表提示候选词给用户,方便用户输入,提升用户体验. 网上多是JS如何实现,用ajax请求拿到数据就可以了 ...

  8. [解决]eclipse中android自动补全/提示卡机或假死

    这是Eclipse3.6版本的特有问题,想彻底解决此问题的话,还是建议换为3.5/3.4: 在保持版本不变的前提下,可以按如下方法优化下: 解决办法: 1. 找到你的JDK安装目录下的src.zip文 ...

  9. java不会自动提示_eclispe中打点不会提示的解决方法,以及自动补全

    Eclipse中打点无提示的解决办法 建了个JAVA工程,然后发现输入代码后,在输入.后面不会弹出来我所要的函数. alt+/      提示No Default Proposals 自己找了半天,终 ...

最新文章

  1. Robots.txt - 禁止爬虫(转)
  2. 为节约而生:从标准Attention到稀疏Attention
  3. centos 下载oracle_Linux镜像下载大全
  4. tcpdump - 数据包进行截获的包分析工具
  5. 供应商禁止供货后,这个城市行动了:社区团购不得低价倾销、排挤对手
  6. python新手入门总结_写给已有编程经验的 Python 初学者的总结
  7. 基于JAVA+Servlet+JSP+MYSQL的电影院购票系统
  8. poj 2870 Light Up(dfs+剪枝,写的稀烂)
  9. Michael Feathers希望消除错误能驱动设计
  10. 软件测试-缺陷报告(自己看)
  11. aes解密流程图_AES加密算法详解
  12. Git(3):git clone远程GitHub仓库代码出现“Permission Denied (publickey)”问题
  13. 求基于图像处理的身份证号码识别的程序
  14. 逃跑h5小游戏源码熊出没手机游戏
  15. 用 Python 画哆啦 A 梦
  16. MNIST数据集手写数字分类
  17. 【Zotero高效知识管理】(4)Zotero的文献管理、阅读及笔记知识管理
  18. SDWebImage详细解析
  19. java调用bert_NLP(十九)首次使用BERT的可视化指导
  20. 计算机word除法公式,word怎么用函数计算除法

热门文章

  1. Matlab信号处理常用函数
  2. IS-95A CDMA移动通信基站子系统(转)
  3. MATLAB层次聚类分析
  4. [FAQ10927][USB serial number客制化][系列6]:能否实现adb devices的序列号,usb serialnumber, cts device ID,SN一致?
  5. 前端 YUI3:Animation
  6. 06CookieSession-10. HttpSession实现原理分析
  7. Invalid component name: “XXX“. Component names should conform to valid custom element name in html5
  8. 匈牙利算法与KM算法的区别
  9. CenterOS部署Git私服详细过程
  10. 职称计算机考试输入破折号,电脑上破折号是哪个键