本文主要说明如何在java中使用 ik 分词器
安装分词器见:elasticsearch 安装 analysis-ik
ElasticSearch java API–创建mapping
package Index;
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.Requests;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import Client.ServerClient;
public class createIndex {
private static Client client=ServerClient.getClient();
/**
* 创建索引名称
* @param indices 索引名称
*/
public static void createCluterName(String indices){
client.admin().indices().prepareCreate(indices).execute().actionGet();
client.close();
}
/**
* 创建mapping(feid("indexAnalyzer","ik")该字段分词IK索引 ;feid("searchAnalyzer","ik")该字段分词ik查询;具体分词插件请看IK分词插件说明)
* @param indices 索引名称;
* @param mappingType 索引类型
* @throws Exception
*/
public static void createMapping(String indices,String mappingType)throws Exception{
new XContentFactory();
XContentBuilder builder=XContentFactory.jsonBuilder()
.startObject()
.startObject(indices)
.startObject("properties")
.startObject("id").field("type", "integer").field("store", "yes").endObject()
.startObject("kw").field("type", "string").field("store", "yes").field("indexAnalyzer", "ik").field("searchAnalyzer", "ik").endObject()
.startObject("edate").field("type", "date").field("store", "yes").field("indexAnalyzer", "ik").field("searchAnalyzer", "ik").endObject()
.endObject()
.endObject()
.endObject();
PutMappingRequest mapping = Requests.putMappingRequest(indices).type(mappingType).source(builder);
client.admin().indices().putMapping(mapping).actionGet();
client.close();
}
public static void main(String[] args)throws Exception {
createMapping("lianan", "lianan");
createCluterName("lianan");
}
}
//field("store", "yes")并不是必需的,但是field("type", "string")是必需要存在的,不然会报错。
注:分词是没有结果的,所以存入的字符串还是我们写入的,只是在查询时会去调用对应的分词器去处理
java中调用ik去分词
java查询分词结果
IndicesAdminClient indicesAdminClient = ElasticFactory.getClient().admin().indices();
AnalyzeRequestBuilder request = new AnalyzeRequestBuilder(indicesAdminClient,"cloud_repair","中华人民共和国国歌");
// request.setAnalyzer("ik");
request.setTokenizer("ik");
// Analyzer(分析器)、Tokenizer(分词器)
List listAnalysis = request.execute().actionGet().getTokens();
System.out.println(listAnalysis);
// listAnalysis中的结果就是分词的结果
查询
for (AnalyzeResponse.AnalyzeToken term : listAnalysis) {
System.out.print(term.getTerm());
System.out.print(',');
queryBuilder.should(QueryBuilders.queryString(term.getTerm()).field("search_keys_ik"));
//这里可以用must 或者 should 视情况而定
}
System.out.print('\n');
分词结果 listAnalysis 中的内容和 RestApi 中的结果一样
分词器和分析器
Analyzer(分析器)、Tokenizer(分词器)这两个概念以后弄懂了再发出来,可以参考其它文章去了解。
在IK中,只有Tokenizer。Analyzer只是构造了一个Tokenizer去处理的。见源码: org.wltea.analyzer.lucene.IKAnalyzer
此类中有一个覆盖方法:
/**
* 重载Analyzer接口,构造分词组件
*/
@Override
protected TokenStreamComponents createComponents(String fieldName, final Reader in) {
Tokenizer _IKTokenizer = new IKTokenizer(in , settings, environment);
return new TokenStreamComponents(_IKTokenizer);
}
参考原文:
- elasticsearch mapping
- ElasticSearch java API–创建mapping
- solr学习之六——–Analyzer(分析器)、Tokenizer(分词器)
- Lucene源码解析–Analyzer之Tokenizer
- 全文检索的几个重要概念: Analyzer, tokenizer, token filter, char filter