Coin163

solr获取分词结果和直接lucene获取分词

2016-07-24by coin, 次阅读
    solr在查询之前,可能需要对查询条件预处理(查询计划),可以使用solr获取分词结果或直接使用lucene获取分词结果

solr获取分词结果:

public class SolrAnalysisService {
  
    private static HttpSolrServer solrServer;
    static {
      //初始化
    }

    /**
     * 给指定的语句分词。
     * @param keyword被分词的语句
     * @return 分词结果
     */
    public static List<String> getAnalysis(String keyword) {
        FieldAnalysisRequest request = new FieldAnalysisRequest(
                "/analysis/field");
        request.addFieldName("title");// 字段名,随便指定一个支持中文分词的字段
        request.setFieldValue("");// 字段值,可以为空字符串,但是需要显式指定此参数
        request.setQuery(sentence);
       
        FieldAnalysisResponse response = null;
        try {
            response = request.process(solrServer);
        } catch (Exception e) {
            log.error("获取查询语句的分词时遇到错误", e);
        }

        List<String> results = new ArrayList<String>();
        Iterator<AnalysisPhase> it = response.getFieldNameAnalysis("title")
                .getQueryPhases().iterator();
        while(it.hasNext()) {
          AnalysisPhase pharse = (AnalysisPhase)it.next();
          List<TokenInfo> list = pharse.getTokens();
          for (TokenInfo info : list) {
              results.add(info.getText());
          }
        }
        
        return results;
    }
}
直接使用lucene获取分词结果:
public static Set<String> tokenStream(String content, Analyzer tokenAnalyzer) {
		HashSet<String> set=null;
		try{
			TokenStream ts = tokenAnalyzer.tokenStream("keywords", content);
			ts.reset();
			set = new HashSet<String>();
			while (ts.incrementToken()) {
				CharTermAttribute ta = ts.getAttribute(CharTermAttribute.class);
				if(ta.length() != 1){
					set.add(ta.toString());
				}
			}
			ts.close();
		}catch(IOException e){
		}
		return set==null?Collections.<String>emptySet():set;
	}
 
调用:
Analyzer ikAnalyzer = new IKAnalyzer(true);
tokenStream("test测试",ikAnalyzer);
------分隔线----------------------------