elasticsearch java api 使用ik 分词器

来源:互联网 发布:淘宝客服名字大全 编辑:程序博客网 时间:2024/05/22 15:54

本文主要说明如何在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

0 0
原创粉丝点击