您的位置:首页 > 编程语言 > Java开发

elasticsearch java api 使用ik 分词器

2015-09-25 13:38 786 查看
本文主要说明如何在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: