论坛首页 Java企业应用论坛

solr搜索智能提示Suggest

浏览 5926 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-09-27  

solr1.4以后实现的智能提示,方便用户输入搜索

 

Suggest配置

<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">name</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>
		<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.extendedResults">false</str>		
		<str name="spellcheck.collate">true</str>
		<!--<str name="spellcheck.build">true</str>	-->	
	</lst>  
	<arr name="components">  
		<str>suggest</str>  
	</arr>  
  </requestHandler>
 说明:

 1.solr的suggest基于solr.SpellCheckComponent

 2.queryAnalyzerFieldType 参数为string,在这不要定义复杂分词,如果是根据某一个索引字段,意义不大

 3.field字段名,表示基于schema中的某一个索引字段

 4.threshold限制一些不常用的词出现,值越大过滤纸越多

 5.sourceLocation用于设置字典,如果有一个字典能记录用户常搜索的字,那提示更更好

 6.spellcheckIndexDir如果已经设置spellcheck,那么可以在此制定目录

 7.字典格式如下

# This is a sample dictionary file.

acquire

accidentally\t2.0

accommodate\t3.0

文本格式utf-8,#开头表示注释,被忽略

每一个词一行,后面带权重

 8.配置词典后在requestHandler中设置spellcheck.onlyMorePopular为true,可以根据权重排序

 9.spellcheck.count返回行

 

 配置完成重启服务后,设置参数suggest/?spellcheck.build=true来创建spellchecker的索引

 

 然后输入:http://ip:port/corename/suggest?q=xxx进行搜索了

 接下来就是前台js实现的问题了。

 当然也可以通过solrj来进行搜索

CommonsHttpSolrServer server = new CommonsHttpSolrServer(
				"http://ip:port/corename/");
	SolrQuery params = new SolrQuery();
		String token = "牛";
		params.set("qt", "/suggest");
		params.set("q", token);
		params.set("spellcheck.build", "true");
		QueryResponse response = null;

		try {
			response = server.query(params);
			System.out.println("查询耗时:" + response.getQTime());
		} catch (SolrServerException e) {
			System.err.println(e.getMessage());
			e.printStackTrace();
		} catch (Exception e) {
			System.err.println(e.getMessage());
			e.printStackTrace();
		} finally {
		}

		SpellCheckResponse spellCheckResponse = response
				.getSpellCheckResponse();
		if (spellCheckResponse != null) {
			List<Suggestion> suggestionList = spellCheckResponse
					.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();
			}
		}

 这样就可以。

 

对于Suggest,个人的想法,字典是一种好的方式,但是增加字典比较麻烦,还有可以独立一个字段,对该字段做一些特殊的分词,比如像商品搜索类,整个标题可以是一个词,中文,数字,英文,符号等间隔的分开,这个具体还是看应用了。

  • 大小: 53.3 KB
   发表时间:2012-09-27  
这个有空研究下,目前的做法都是直接查询数据库,再将提示结果缓存起来的
0 请登录后投票
   发表时间:2012-09-28  
java_user 写道
这个有空研究下,目前的做法都是直接查询数据库,再将提示结果缓存起来的

数据量不大的情况下,like查询,key-valye缓存列表问题不大。不过使用solr方式,可以把库传为字典形式,可能更简单一些。
0 请登录后投票
   发表时间:2013-05-13  
请问楼主,这个字典文件里的内容是要自己手动写进去的?还是solr会根据用户的请求自动填充这个字典文件?
0 请登录后投票
   发表时间:2013-05-30  
请问楼主用的哪个版本 我是4.2的但是不成功 麻烦解答一下好么谢谢
0 请登录后投票
   发表时间:2013-09-22  
有没有具体的实现案例啊?就是支持中文搜索这一块?还有字典里具体怎么存放啊?存放在那个目录下?需要进行文件配置吗?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics