Lucene + Pinyin4J 提供首字母搜索(——)

 遇到一个集团需求,要求在地址查询时候提供拼音搜索,第一反应应该不难,不过实现过程中却一波三折。

1、第一步是讲字段首字母进行索引,具体可以使用Pinyin4j提供的方法完成。

2、原来系统用的lucene3.0,分词用的ikanalyzer3.2 ,不支持连续字母和数字的分词,网上搜索下 ikanalyzer5.2 可以支持,下载下来发现必须用1.7JDK,如此高的版本,实际上已经把采纳的可能枪毙了。然后进行测试,发现仍然不行。最后找到 WildcardQuery 查询;具体代码如下

Boolean isPingYin = false;
if(firstCharacter.matches("^[A-Za-z]+$")){
isPingYin = true;
}
if(isPingYin) {

if(tempStandName.length()<4) {
return list;
}

WildcardQuery wq=new WildcardQuery(new Term("standNamePingyin","*" + tempStandName + "*"));
BooleanQuery booleanQuery = new BooleanQuery();
booleanQuery.add(wq, Occur.MUST);
TermQuery termQuery1 = new TermQuery(new Term("outSide", "0"));
booleanQuery.add(termQuery1, Occur.MUST);

TermQuery termQuery2 = new TermQuery(new Term("bindEqps", "1"));
booleanQuery.add(termQuery2, Occur.MUST);
/**
* 模糊查询器
*/
TopDocs topDocs_pp = isearcher.search(booleanQuery, count);

ScoreDoc[] scoreDocs_pp = topDocs_pp.scoreDocs;
for (int i = 0; i < (topDocs_pp.totalHits > count ? count : topDocs_pp.totalHits); i++)
{
VOqryAddrSegm voQAS = new VOqryAddrSegm();
Document targetDoc = isearcher.doc(scoreDocs_pp[i].doc);
voQAS.setSegmID(targetDoc.get("segmId"));
voQAS.setStandName(targetDoc.get("standName"));
voQAS.setSegmType(targetDoc.get("segmType"));
voQAS.setRegionId(targetDoc.get("regionId"));
voQAS.setBindEqps(targetDoc.get("bindEqps"));
voQAS.setOutSide(targetDoc.get("outSide"));
list.add(voQAS);
}



}

实现的效果:

 

posted @ 2017-07-04 12:50  滚雪球俱乐部  阅读(1130)  评论(0编辑  收藏  举报