转载请出自出处:http://eksliang.iteye.com/blog/2097924
solr suggest检查建议
1.描述
Solr从1.4开始便提供了检查建议,检索建议目前是各大搜索的标配应用,主要作用是避免用户输入错误的搜索词,同时将用户引导到相应的关键词搜索上。Solr内置了检索建议功能,它在Solr里叫做Suggest模块.该模块可选择基于提示词文本做检索建议,还支持通过针对索引的某个字段建立索引词库做检索建议。在诸多文档中都推荐使用基于索引来做检索建议,当然在预研时我会将其全部弄出来。
2.应用场景
直接上图说得清楚,如下,当你在搜索框中输入spring时出现如下结果,这便是检察建议
3.针对索引的某个字段建立索引词库,做检索建议
其实suggest是一个Component组件类,而组件类有一个特点,那就是他是绑定handler类上面执行的,即在handler调用的时候,会触发handler上面组件类跟着一起执行。
在solrcong.xml加入如下代码:
<searchComponent name="suggest" class="solr.SpellCheckComponent">
<str name="queryAnalyzerFieldType">string</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">userName</str>
<float name="threshold">0.0001</float>
<str name="comparatorClass">freq</str>
<str name="buildOnOptimize">true</str>
<str name="buildOnCommit">true</str>
</lst>
</searchComponent>
<requestHandler name="/suggest" class="org.apache.solr.handler.component.SearchHandler">
<lst name="defaults">
<str name="spellcheck">true</str>
<str name="spellcheck.dictionary">suggest</str>
<str name="spellcheck.count">8</str>
<str name="spellcheck.onlyMorePopular">true</str>
<str name="spellcheck.collate">true</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
</requestHandler>
各个参数解释如下
SpellCheckComponent含义如下:蓝色部分不要管他,他的值就让他固定
名称 |
含义 |
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返回结果的排序,目前有如下几种可选方案:
- Empty – in which case the default is used. 默认就是这个
- score – explicitly choose the default case
- freq – Sort by frequency first, then score. 通过频率的第一排序,然后得分 (开发时用这个)
- A fully qualified class name – Provide a custom comparator that implements Comparator
|
buildOnCommit |
取值true或者flase
当commit的时候,对拼写检查索引进行构建。(只有构建后,拼写检查才有效果)
|
buildOnOptimize |
当optimize的时候,对拼写检查索引进行构建。(只有构建后,拼写检查才有效果)
|
requestHandler参数含义:
<str name="spellcheck">true</str>
|
开启检查建议 |
<str name="spellcheck.dictionary">suggest</str>
|
必须与searchComponent中spellchecker标签下<str name=”name”>suggest</str>配置对应。
|
<str name="spellcheck.count">8</str>
|
配置拼写检查提示结果的个数(可以根据需要适当加大)
|
<str name="spellcheck.onlyMorePopular">true</str>
|
等于true,可以根据权重排序,开发时我一般让他等于true
|
<str name="spellcheck.collate">true</str>
|
提供一个查询并与第一个匹配的建议,还是上图吧
|
<arr name="components">
<str>suggest</str>
</arr>
|
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.同上,只不过放在最后工作
|
配完后记得启动你的服务,添加数据后,当然你得记得commit或者optimize让索引重构一下,才能收到,刚开始我就是少了这步,硬是配不出来;
还是截个图吧!下面是测试结果
4.基于文本做索引词库
这个时候SpellCheckComponent应该这样配:
<searchComponent name="suggest" class="solr.SpellCheckComponent">
<str name="queryAnalyzerFieldType">string</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">userName</str>
<float name="threshold">0.0001</float>
<str name="sourceLocation">suggest_dict.txt</str>
<str name="spellcheckIndexDir">spellchecker</str>
<str name="comparatorClass">freq</str>
<str name="buildOnOptimize">true</str>
</lst>
</searchComponent>
其实就是在上面的那个“针对索引的某个字段建立索引词库”的xml上面加了两个参数
<str name="sourceLocation">suggest_dict.txt</str>
<str name="spellcheckIndexDir">spellchecker</str>
这两个参数的含义:
sourceLocation:就是你需要检查建议的文档内容,格式如下:
# This is a sample dictionary file. 注释
spring2.5.6
spring3.2.0
struts1.2
struts2.3
baidu.com
iteye.com
spellchekIndexDir:检查建议的索引文件目录, solr在启动时,会创建该文件夹,存放检查建议的索引在
该文件夹下,像我上面配的那么会在data目录下面生成改文件夹。
requestHandler配置如下:在上面的文档里面加个配置说明就可以了,也可以不加,不过你每次请求之前都要commit或者optimize下;
代码如下:
<requestHandler name="/suggest" class="org.apache.solr.handler.component.SearchHandler">
<lst name="defaults">
<str name="spellcheck">true</str>
<str name="spellcheck.dictionary">suggest</str>
<str name="spellcheck.count">8</str>
<str name="spellcheck.onlyMorePopular">true</str>
<str name="spellcheck.collate">true</str>
<str name="spellcheck.build">true</str>
</lst>
<arr name="components">
<str>suggest1</str>
</arr>
</requestHandler>
含义如下:就是你每次请求时,如果索引发生变化,都会来重构spellchecker的索引
5.solrj对suggest的支持
public class SuggestTest {
public static void main(String[] args) throws SolrServerException {
ServiceFacetory facet= ServiceFacetory.getInstance("userManager","http://192.168.238.132:8080//solr");
SolrSupport s= facet.getSolrSupport();
/**
* 我对solrj做过二次开发,你可以自己得到你的 HttpSolrService,这个相信不难
*/
HttpSolrServer service= s.getHttpSolrServer();
SolrQuery params = new SolrQuery();
params.set("qt", "/suggest");
params.setQuery("userName:spring");
QueryResponse response = null;
response = service.query(params);
SpellCheckResponse suggest = response.getSpellCheckResponse();
List<Suggestion> suggestionList = suggest.getSuggestions();
for (Suggestion suggestion : suggestionList) {
System.out.println("Suggestions NumFound: " + suggestion.getNumFound());
System.out.println("Token: " + suggestion.getToken());
System.out.print("Suggested: ");
List<String> suggestedWordList = suggestion.getAlternatives();
for (String word : suggestedWordList) {
System.out.println(word + ", ");
}
System.out.println();
}
}
执行结果如下:
Suggestions NumFound: 2
Token: spring
Suggested: spring2.5.6,
spring3.2.0,
- 大小: 8.3 KB
- 大小: 31.3 KB
- 大小: 48.1 KB
分享到:
相关推荐
ik,suggest 已经配置好了,可以在Windows/linux直接启动
solr cloud6.x.x 都可以用,solr的拼音分词
solr.warsolr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包...
solr
solr
solr文档
solr-smart-建议您需要将以下 jar 文件包含到类路径中以编译 solr-smart-suggest 组件: lucene-core-4.10.3-SNAPSHOT.jar lucene-analyzers-common-4.10.3-SNAPSHOT.jar lucene-suggest-4.10.3-SNAPSHOT.jar solr-...
6. Suggest查询 7. SolrJ 章节三:Solr高级(上) 1. Solr Cloud 2. 函数查询 3. 地理位置查询 4. JSON Facet 章节四:Solr高级(下) 1. 深度分页 2. Solr Join查询 3. 相关度排序 4.Solr缓存 5.Spring Data Solr ...
solr manageschema 配置文件,增加了分词器后的配置文件
solr技术文solr技术文solr技术文
Solr定时更新Solr定时更新
如何使用solr搭建服务器
Solr 依存于Lucene,因为Solr底层的核心技术是使用Lucene 来实现的,Solr和Lucene的本质区别有以下三点:搜索服务器,企业级和管理。Lucene本质上是搜索库,不是独立的应用程序,而Solr是。Lucene专注于搜索底层的...
Apache Solr(solr-8.11.1.tgz)Binary releases 二进制版本
solr增量更新-
Solr笔记,Solr笔记,Solr笔记,Solr笔记,Solr笔记,Solr笔记,Solr笔记,Solr笔记,Solr笔记,Solr笔记,
solr安装包下载地址
solr3.5开发教程solr3.5开发教程solr3.5开发教程solr3.5开发教程solr3.5开发教程
Solr(Cloudera)使用手册
solr