我的DEMO项目下载:https://gitee.com/zhuhongliang/soringboot_elastic_search_732.git

下载elasticsearch-analysis-ik-7.3.2.zip :https://github.com/medcl/elasticsearch-analysis-ik/releases
在\elasticsearch-7.3.2\plugins 目录里创建文件夹ik,然后把zip全部解压进去
用命令查看当前的插件:

PS C:\data\elasticsearch-7.3.2\bin> .\elasticsearch-plugin.bat list
ik

然后重启elasticsearch
在一大堆启动输出内容里能发现

[2019-09-20T23:52:09,550][INFO ][o.e.p.PluginsService     ] [node-1] loaded plugin [analysis-ik]

表示ik安装成功。

项目文件:

pom.xml在依赖elasticsearch-rest-high-level-client的时候,需要把一些内部低版本的依赖去除

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zhl</groupId>
    <artifactId>elasticsearch_demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>elasticsearch_demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring.data.elasticsearch.version>3.1.10.RELEASE</spring.data.elasticsearch.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.3.2</version>
            <exclusions>
                <!--这里内部依赖的版本太低,去除-->
                <exclusion>
                    <groupId>org.elasticsearch</groupId>
                    <artifactId>elasticsearch</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.elasticsearch.client</groupId>
                    <artifactId>elasticsearch-rest-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>7.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

然后看spring的代码,创建实体类Article

public class Article {
    private Integer id;
    private String title;
    private String content;
    private Date create_time;
    //省略getter & setter
}

创建一个RestHighLevelClient客户端的Bean,后面的操作都用这个Bean

@SpringBootApplication
public class ElasticsearchDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(ElasticsearchDemoApplication.class, args);
    }

    @Bean
    public RestHighLevelClient client() {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("192.168.10.1", 9200, "http")));
        return client;
    }

}

下面的代码就是创建一个索引,对指定字段设置ik中文分词

    @Autowired
    RestHighLevelClient client;
   /**
     * 创建索引
     * 将实体类的String类型的字段添加ik中文分词,其他字段在实际添加数据后会按类型自动添加
     * @param clasz
     * @return
     */
    public Boolean createIndex2(Class clasz){
        try {
            CreateIndexRequest index = new CreateIndexRequest(clasz.getSimpleName().toLowerCase());

            XContentBuilder builder = JsonXContent.contentBuilder();
            builder.startObject()
                    .startObject("mappings")
                    .startObject("properties");
            Field[] fields = clasz.getDeclaredFields();
            for(Field field : fields){
                Class<?> type = field.getType();
                //这里只对String类型的字段添加ik中文分词处理
                if(type.getSimpleName().equals("String")){
                    builder.startObject(field.getName().toLowerCase())
                                .field("type","text")
                                .field("index",true)
                                .field("analyzer","ik_max_word")
                            .endObject();
                }
            }
            builder.endObject().endObject();
            builder.startObject("settings")
                    //分片数
                    .field("number_of_shards",1)
                    //副本数,1台机器设为0
                    .field("number_of_replicas",0)
                    .endObject()
                    .endObject();

            index.source(builder);
            CreateIndexResponse response = client.indices().create(index,RequestOptions.DEFAULT);
            log.info(JSONObject.toJSONString(response));
            return response.isAcknowledged();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 索引是否存在
     * @param indeces
     */
    public Boolean exist(String indeces){
        GetIndexRequest request = new GetIndexRequest(indeces.toLowerCase());
        Boolean exist = null;
        try {
            exist = client.indices().exists(request, RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return exist;
    }

    /**
     * 删除索引
     * @param indeces
     */
    public void delete(String indeces){
        DeleteIndexRequest request = new DeleteIndexRequest(indeces.toLowerCase());
        try {
            AcknowledgedResponse deleteIndexResponse = client.indices().delete(request, RequestOptions.DEFAULT);
            boolean acknowledged = deleteIndexResponse.isAcknowledged();
            log.info("删除索引:{}", acknowledged);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 测试创建索引
     */
    @Test
    public void indexCreate(){
        Boolean exist = commodityServiceImpl.exist(Article.class.getSimpleName());
        if(!exist){
            log.info("需要创建新的索引");
            Boolean result = commodityServiceImpl.createIndex2(Article.class);
            log.info("创建索引结果:{}",result);
            return;
        }
        log.info("索引已存在,不需要创建新的");
    }

    /**
     * 删除索引
     */
    @Test
    public void indexDelete(){
        commodityServiceImpl.delete(Article.class.getSimpleName());
    }

运行测试代码,打开kibana,查看创建的索引http://localhost:5601/:

aticle就是前面创建的实体类的小写名称,mapping中的content字段和title是Article.class的两个String类型的成员,设置使用ik分词,其余没有设置的字段,会在添加数据后自动添加

 

除了用代码访问接口外,也可以使用kibana在Dev Tools使用创建mapping接口:

PUT article
{
  "mappings" : {
      "properties" : {
        "content" : {
          "type" : "text",
          "analyzer":"ik_max_word"
        },
        "title" : {
          "type" : "text",
          "analyzer":"ik_max_word"
        },
        "year" : {
          "type" : "long"
        }
      }
  }
}

用put 加 索引名称,json数据按照实际的实体类来修改即可。
 

 

 

我的DEMO项目下载:https://gitee.com/zhuhongliang/soringboot_elastic_search_732.git

发表评论