1. jar包不存在于maven仓库 需要添加到仓库中 或者使用本地依赖 。
<dependency>
<groupId>org.wltea.ik-analyzer</groupId>
<artifactId>ik-analyzer</artifactId>
<version>2012FF_u1</version>
<scope>system</scope>
<!--<systemPath>${basedir}/src/main/webapp/WEB-INF/lib/IKAnalyzer2012FF_u1.jar</systemPath>-->
<systemPath>C:/Users/Administrator/Desktop/ik/IKAnalyzer2012FF_u1.jar</systemPath>
</dependency>
2. 在使用solr配置IK和pinyin4j的组合时,发现IKAnalyzer2012FF_u1 中并没有TokenizerFactory ,无法生成拼音自动分词转换的fired ,因为项目时间紧,后来放弃了给Ik编写一个TokenizerFactory 加到Jar包的想法(其实就是编译好麻烦) ,然后直接在solr中设置一个普通域 在服务器分词之后放入solr域的形式
依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
/** * solr用方法 * 讲文字转换为拼音 * 字符串为 拼接 中间使用 分割 每个字符串转换为首字母与全拼形势 * 例: 文字 ==》 wenzi wz * 2017/4/6 更改 首字母拼写放弃使用 * * @param initString * @return * @throws IOException */ @Override public String pinYinAnalysis(String initString) throws IOException { StringBuffer sb = new StringBuffer(); if(StringUtils.isBlank(initString)){ return ""; } StringReader sr=new StringReader(initString); IKSegmenter ik=new IKSegmenter(sr, true); Lexeme lex=null; while((lex=ik.next())!=null){ String lexemeText = lex.getLexemeText(); //匹配年份 if (lexemeText.matches("(19[0-9][0-9]|200|201[0-9])")){ lexemeText = lexemeText.replaceAll("[^0-9]",""); } sb.append( PinYinUtils.cnToPinYin(lex.getLexemeText())).append(" "); // .append(PinYinUtils.cnToFirstSpell(lex.getLexemeText())).append(" "); } return sb.toString(); }
|
3 。 拼音转换工具类
/、、、、、、、、、、、、、、、、、、、、、、、
package com.maizhong.common.utils;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
/**
* chinese2pinyin 工具包 提供汉字转换拼音功能
*
* Created by YangF on 2017/4/6.
*/
public class PinYinUtils {
public static void main(String[] args) {
cnToPinYin("她在说谎");
}
/**
* 获取汉字串拼音,英文字符不变
*
* @param chinese 汉字串
* @return 汉语拼音
*/
public static String cnToPinYin(String chinese) {
StringBuffer pybf = new StringBuffer();
char[] arr = chinese.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < arr.length; i++) {
if (arr[i] > 128) {
try {
pybf.append(PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat)[0]);
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pybf.append(arr[i]);
}
}
return pybf.toString();
}
/**
* 获取汉字串拼音首字母,英文字符不变
*
* @param chinese 汉字串
* @return 汉语拼音首字母
*/
public static String cnToFirstSpell(String chinese) {
StringBuffer pybf = new StringBuffer();
char[] arr = chinese.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < arr.length; i++) {
if (arr[i] > 128) {
try {
String[] _t = PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat);
if (_t != null) {
pybf.append(_t[0].charAt(0));
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pybf.append(arr[i]);
}
}
return pybf.toString().replaceAll("\\W", "").trim();
}
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、在网上找到factory代码 但是并没有测试 先记录一下 代码来自 http://bbs.youkuaiyun.com/topics/390982377
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package
org.wltea.analyzer.lucene;
import
java.io.Reader;
import
java.util.Map;
import
org.apache.lucene.analysis.Tokenizer;
import
org.apache.lucene.analysis.util.TokenizerFactory;
import
org.apache.lucene.util.AttributeFactory;
public
class
IKTokenizerFactory
extends
TokenizerFactory{
private
final
boolean
useSmart;
public
IKTokenizerFactory(Map<String, String> args) {
super
(args);
this
.useSmart = getBoolean(args,
"useSmart"
,
false
);
}
@Override
public
Tokenizer create(AttributeFactory factory, Reader in) {
return
new
IKTokenizer(in,
this
.useSmart);
}
}
|
1
2
3
4
5
6
7
8
9
10
|
<
fieldType
name
=
"ik_cn"
class
=
"solr.TextField"
>
<
analyzer
>
<
tokenizer
class
=
"org.wltea.analyzer.lucene.IKTokenizerFactory"
useSmart
=
"true"
/>
<
filter
class
=
"solr.StopFilterFactory"
ignoreCase
=
"true"
words
=
"org/apache/lucene/analysis/cn/smart/stopwords.txt"
/>
<
filter
class
=
"solr.SynonymFilterFactory"
synonyms
=
"synonyms.txt"
ignoreCase
=
"true"
expand
=
"true"
/>
</
analyzer
>
</
fieldType
>
|
上方代码来自 http://bbs.youkuaiyun.com/topics/390982377