美文网首页
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