rsgg03 发表于 2015-6-19 20:44:44

solr4.7开发实践——拼音检索思路及代码实现

    拼音检索的大致思路是这样的:

            ①将需要使用拼音检索的字段汇集到一个拼音分词字段里(我的拼音分词字段使用pinyin4j+NGram做的);

                加入两个jar包:pinyin4j-2.5.0.jar、pinyinAnalyzer.jar;

                schema.xml文件设置:
<field name="pinyin" type ="text_pinyin" indexed ="true" stored ="false" multiValued ="true"/>
<copyField source="name" dest="pinyin"/>
<copyField source="author" dest="pinyin"/>
<copyField source="region" dest="pinyin"/>
<copyField source="theme" dest="pinyin"/>
<!-- by michael: pinyin-->
<fieldType name="text_pinyin" class="solr.TextField" positionIncrementGap="0">
   <analyzer type="index">
   <tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>
   <filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>
   <filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" />
   <filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="6" maxGram="20" />
   </analyzer>
   <analyzer type="query">
   <tokenizer class="org.apache.lucene.analysis.cn.smart.SmartChineseSentenceTokenizerFactory"/>
   <filter class="org.apache.lucene.analysis.cn.smart.SmartChineseWordTokenFilterFactory"/>
   <filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" />
   <filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="6" maxGram="20" />
   </analyzer>
</fieldType>


②使用solrj进行拼音检索:

/**
* @method: testPhoneticize
* @Description: 拼音检索
*    ??? 也会把不符合条件的检索出来
*    (解决方法:把汉子和相应的拼音建立同义词)
* @return void
*
* @author: ChenYW
* @date 2014-4-16 下午01:44:57
*/
    public List<Map<String, String>> phoneticize(String pinyin){
try {
   List<Map<String, String>> list = new ArrayList<Map<String, String>>();
   
   SolrQuery query = new SolrQuery();
   query.set("q", "pinyin:"+pinyin);//高亮查询字段
         
         QueryResponse qr=server.query(query);//执行查询
         SolrDocumentList dlist=qr.getResults();
         
         System.out.println("总数:"+dlist.getNumFound());
         Map<String, String> mapRe = null;
         for(SolrDocument sd:dlist){
             mapRe = new HashMap<String, String>();
             mapRe.put("name", sd.getFieldValue("name").toString());
             mapRe.put("content", sd.getFieldValue("content").toString().substring(0,200));
             list.add(mapRe);
         }
         
         return list;
} catch (SolrServerException e) {
   e.printStackTrace();
}
return null;
}






页: [1]
查看完整版本: solr4.7开发实践——拼音检索思路及代码实现