elasticsearch java api 使用ik 分词器

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值