elasticsearch java api 使用ik 分词器
2015-09-25 13:38
786 查看
本文主要说明如何在java中使用 ik 分词器
安装分词器见:elasticsearch 安装 analysis-ik
注:分词是没有结果的,所以存入的字符串还是我们写入的,只是在查询时会去调用对应的分词器去处理
分词结果 listAnalysis 中的内容和 RestApi 中的结果一样
在IK中,只有Tokenizer。Analyzer只是构造了一个Tokenizer去处理的。见源码: org.wltea.analyzer.lucene.IKAnalyzer
此类中有一个覆盖方法:
参考原文:
- elasticsearch mapping
- ElasticSearch java API–创建mapping
- solr学习之六——–Analyzer(分析器)、Tokenizer(分词器)
- Lucene源码解析–Analyzer之Tokenizer
- 全文检索的几个重要概念: Analyzer, tokenizer, token filter, char filter
安装分词器见: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
相关文章推荐
- 使eclipse XML文件内容变整齐
- eclipse运行项目时怎么设置虚拟机内存大小
- Java异常处理机制【转载】
- 新手如何配置spring
- Struts2标签<s:checkboxlist>回显问题
- Struts2标签<s:checkboxlist>回显问题
- Java基础知识强化84:System类之exit()方法和currentTimeMillis()方法
- java缓存技术(转)
- Java虚拟机参数设置(转)
- 深入Java虚拟机——类型装载、连接(转)
- Java虚拟机类型卸载和类型更新解析(转)
- Ajax+SpringMVC传递JSON数组
- Java基础知识强化83:System类之gc()方法(垃圾回收)以及和finalize()区别
- MyEclipse2014快速配置SpringMVC入门实例
- 【单机版,以两个文件为例】K-Shingle+最小Hash签名+LSH算法+LSH族....Java代码
- java 内部类分为成员内部类,局部内部类,匿名内部类,
- 整合Spring与Hibernate
- java 反射Reflection
- 【Java】【Flume】Flume-NG源代码分析的启动过程(两)
- Java实现快速排序