美文网首页
es6.2.4学习学习----ik分词器java

es6.2.4学习学习----ik分词器java

作者: 轻易流逝 | 来源:发表于2018-06-13 15:37 被阅读0次

本文使用java实现ik分词器的使用
java代码

1、首先新建索引ik_java
ik_java索引包含
title使用standard分词器
title.title_ik_max_word使用ik_max_word分词器
title.title_ik_smart使用ik_smart分词器
java代码为

public static void main(String[] args) throws IOException {
        RestHighLevelClient client = new RestHighLevelClient(RestClient
                .builder(new HttpHost("192.168.16.21", 9200, "http"), new HttpHost("192.168.16.22", 9200, "http")));
        // 创建索引
        createIndex(client);
    
        client.close();
    }

public static void createIndex(RestHighLevelClient client) throws IOException {
        CreateIndexRequest req = new CreateIndexRequest("ik_java");
        
        req.settings(Settings.builder().put("index.number_of_shards", 3).put("index.number_of_replicas", 2));
        
        XContentBuilder mappings = JsonXContent.contentBuilder().startObject()
                .startObject("properties")
                    .startObject("title")//默认使用standard分词器
                        .field("type", "text")
                        .startObject("fields")
                            .startObject("title_ik_smart")
                                .field("type", "text")
                                .field("analyzer", "ik_smart")//使用ik_smart分词器
                            .endObject()
                            .startObject("title_ik_max_word")
                                .field("type", "text")
                                .field("analyzer", "ik_max_word")//使用ik_max_word分词器
                            .endObject()
                        .endObject()
                    .endObject()
                .endObject().endObject();

        req.mapping("doc", mappings);
        client.indices().create(req);
    }

对应DSL

PUT ik_java
{
  "mappings": {
    "doc": {
      "properties": {
        "title": {
          "type": "text",
          "fields": {
            "title_ik_max_word": {
              "type": "text",
              "analyzer": "ik_max_word"
            },
            "title_ik_smart": {
              "type": "text",
              "analyzer": "ik_smart"
            }
          }
        }
      }
    }
  },
  "settings": {
    "number_of_shards": "3",
    "number_of_replicas": "2"
  }
}

2、添加文档到索引中
添加
好好学习,天天向上”,
学和习,有什么区别”,
es的分词该怎么学的
三个文档

public static void main(String[] args) throws IOException {
        RestHighLevelClient client = new RestHighLevelClient(RestClient
                .builder(new HttpHost("192.168.16.21", 9200, "http"), new HttpHost("192.168.16.22", 9200, "http")));
        //添加文档
        indexDoc(client, "好好学习,天天向上");
        indexDoc(client, "学和习,有什么区别");
        indexDoc(client, "es的分词该怎么学的");
        
        client.close();
    }

public static void indexDoc(RestHighLevelClient client, String title) throws IOException {
        IndexRequest req = new IndexRequest("ik_java", "doc");
        
        XContentBuilder contentBuilder = XContentFactory.jsonBuilder().startObject()
                .field("title", title)
            .endObject();
        req.source(contentBuilder);
        
        client.index(req);
    }

对应DSL

POST /ik_java/doc
{
  "title":"好好学习,天天向上"
}

3、查询
查询ik_java中与“学习”相关的文档

public static void main(String[] args) throws IOException {
        RestHighLevelClient client = new RestHighLevelClient(RestClient
                .builder(new HttpHost("192.168.16.21", 9200, "http"), new HttpHost("192.168.16.22", 9200, "http")));
        //查询文档
        searchDoc(client, "title", "学习");
        searchDoc(client, "title.title_ik_smart", "学习");
        searchDoc(client, "title.title_ik_max_word", "学习");
        
        client.close();
    }

public static void searchDoc(RestHighLevelClient client, String field, String value) throws IOException {
        SearchRequest req = new SearchRequest("ik_java");
        SearchSourceBuilder ssb = new SearchSourceBuilder();
        ssb.query(QueryBuilders.matchQuery(field, value));//查询field包含value的文档
        req.source(ssb);
        SearchResponse resp = client.search(req);
        System.out.println(field+" : "+resp);
    }

对应DSL

GET /ik_java/doc/_search
{
  "query": {
    "match": {
      "title": "学习"
    }
  }
}

GET /ik_java/doc/_search
{
  "query": {
    "match": {
      "title.title_ik_smart": "学习"
    }
  }
}

GET /ik_java/doc/_search
{
  "query": {
    "match": {
      "title.title_ik_max_word": "学习"
    }
  }
}

查询结果:
title匹配到3个文档
title_ik_smart匹配到0个文档
title_ik_max_word匹配到1个文档(好好学习,天天向上)

相关文章

网友评论

      本文标题:es6.2.4学习学习----ik分词器java

      本文链接:https://www.haomeiwen.com/subject/ibyesftx.html