看到网上配置suggest模块的文章也不上,大部分都差不多,但是自己配起来就是查询不到,后来阴差阳错在一个qq群里看到一哥们配置的,把我的稍微改了一下就可以了……
manage-schema.xml文件配置:
<field name="suggestion" type="text_pinyin" indexed="true" stored="true" termVectors="true" multiValued="true"></field>
<field name="title" type="text_pinyin" indexed="true" stored="true" />
<copyField source="title" dest="suggestion"/>
test_pinyin类型是我配置的拼音搜索字段,
solrConfig.xml配置文件suggest配置如下:
配置好后,打开solr admin页面进行搜索,
搜索结果:
可以自动提示与x相关的索引词。
在solrj中关于suggest的取值如下:
public List<String> queryAll(String htmlWord){
htmlWord = escapeQueryChars(htmlWord);
//获得查询对象
SolrQuery query =new SolrQuery();
query.set("qt", "/suggest");
query.setQuery(htmlWord);
query.set("sort","score desc");;
query.setStart(0);
query.setRows(5);
//获得客户端对象
cloudSolrClient = getCloudSolrClient(ZKHOST_URL);
final String defaultCollection = "autocomplete";
final int zkClientTimeout = 200000;
final int zkConnectTimeout = 10000;
//设置查询的集合
cloudSolrClient.setDefaultCollection(defaultCollection);
cloudSolrClient.setZkClientTimeout(zkClientTimeout);
cloudSolrClient.setZkConnectTimeout(zkConnectTimeout);
cloudSolrClient.connect();
//查询返回对象
QueryResponse queryRes = new QueryResponse();
List<String> keyWord =new ArrayList<String>();
try {
//返回的索引数据
queryRes = cloudSolrClient.query(query);
NamedList<Object> nameRes =queryRes.getResponse();
SuggesterResponse suggesterRes = queryRes.getSuggesterResponse();
if(suggesterRes!=null){
Map<String, List<String>> suggestedTerms = suggesterRes.getSuggestedTerms();
List<String> terms = suggestedTerms.get("suggest");
for (String term : terms) {
keyWord.add(term);
}
}
}catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
cloudSolrClient = null;
}
return keyWord;
}
其中escapeQueryChars()是去除特殊字符的一个函数,可以不用管,getCloudSolrClient()是写的一个获取客户端的单例方法,可以直接拿,走了很多弯路主要是现在网上的资源很多都是复制粘贴没有参考性,在配置suggest模块时,把
suggest与spellcheck配置混了导致一直配置不成功。