一路繁花似锦绣前程
失败的越多,成功才越有价值

导航

 

一、pom.xml

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>A02elasticsearch</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.4.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/transport -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>7.4.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-to-slf4j -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-to-slf4j</artifactId>
            <version>2.13.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>1.7.30</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/log4j/log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.11.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.11.2</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.9</source>
                    <target>1.9</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

二、bean

package com.wuxi.bean;

import lombok.Data;

@Data
public class Article {
    private Long id;
    private String title;
    private String content;
}

三、测试

package com.wuxi.test;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.wuxi.bean.Article;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Test;

import java.net.InetAddress;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class MyElasticSearchTest {
    /**
     * 创建索引库
     *
     * @throws Exception
     */
    @Test
    public void createIndex() throws Exception {
        //1、创建一个Settings对象,相当于是一个配置信息。主要配置集群名称。
        Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
        //2、创建一个客户端client对象
        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9301));
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9302));
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9303));
        //3、使用client对象创建一个索引库
        Map<String, Object> settingsMap = new HashMap<>();
        Map<String, Object> indexMap = new HashMap<>();
        indexMap.put("number_of_shards", "5");
        indexMap.put("number_of_replicas", "1");
        settingsMap.put("index", indexMap);
        client.admin().indices().prepareCreate("index_hello").setSettings(settingsMap)
                //执行操作
                .get();
        //4、关闭client对象
        client.close();
    }

    /**
     * 添加mapping映射
     *
     * @throws Exception
     */
    @Test
    public void setMappings() throws Exception {
        //创建一个Settings对象
        Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
        //创建一个TransportClient对象
        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9301));
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9302));
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9303));
        //创建一个Mappings信息
        XContentBuilder builder = XContentFactory.jsonBuilder()
                .startObject()
                .startObject("properties")
                .startObject("id")
                .field("type", "long")
                .field("store", true)
                .endObject()
                .startObject("title")
                .field("type", "text")
                .field("store", true)
                .field("analyzer", "ik_smart")
                .endObject()
                .startObject("content")
                .field("type", "text")
                .field("store", true)
                .field("analyzer", "ik_smart")
                .endObject()
                .endObject()
                .endObject();
        //使用client把mapping信息设置到索引库中
        client.admin().indices()
                .preparePutMapping("index_hello")
                .setType("_doc")
                .setSource(builder)
                .get();
        //关闭client对象
        client.close();
    }

    /**
     * 添加文档
     *
     * @throws Exception
     */
    @Test
    public void testAddDocument() throws Exception {
        //创建一个Settings对象
        Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
        //创建一个TransportClient对象
        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9301));
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9302));
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9303));
        //创建一个文档对象
        XContentBuilder builder = XContentFactory.jsonBuilder()
                .startObject()
                .field("id", 1l)
                .field("title", "这是文档的标题")
                .field("content", "这是文档的内容,是一段中文")
                .endObject();
        //把文档对象添加到索引库
        client.prepareIndex()
                .setIndex("index_hello")
                .setType("_doc")
                .setId("1")
                .setSource(builder)
                .get();
        //关闭
        client.close();
    }

    /**
     * json方式添加文档
     *
     * @throws Exception
     */
    @Test
    public void testAddDocument2() throws Exception {
        //创建一个Settings对象
        Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
        //创建一个TransportClient对象
        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9301));
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9302));
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9303));
        //创建生成json字符串
        Article article = new Article();
        article.setId(2l);
        article.setTitle("使用json方式添加文档");
        article.setContent("就统筹推进常态化疫情防控和经济社会发展工作、谋划“十四五”时期经济社会发展进行调研。");
        String jsonDocument = new ObjectMapper().writeValueAsString(article);
        //使用client对象把文档写入索引库
        client.prepareIndex("index_hello", "_doc", "2")
                .setSource(jsonDocument, XContentType.JSON)
                .get();
        //关闭
        client.close();
    }

    /**
     * 根据id查询文档
     *
     * @throws Exception
     */
    @Test
    public void testSearchById() throws Exception {
        //创建一个Settings对象
        Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
        //创建一个TransportClient对象
        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9301));
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9302));
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9303));
        //创建一个查询对象
        QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("1", "2");
        //执行查询
        SearchResponse searchResponse = client.prepareSearch("index_hello")
                .setTypes("_doc")
                .setQuery(queryBuilder)
                .get();
        //取查询结果
        SearchHits searchHits = searchResponse.getHits();
        //取查询结果的总记录数
        System.out.println("查询结果总记录数:" + searchHits.getTotalHits());
        //查询结果列表
        Iterator<SearchHit> iterator = searchHits.iterator();
        while (iterator.hasNext()) {
            SearchHit searchHit = iterator.next();
            //打印文档对象,以json格式输出
            System.out.println(searchHit.getSourceAsString());
            //取文档的属性
            System.out.println("--------文档的属性");
            Map<String, Object> document = searchHit.getSourceAsMap();
            System.out.println(document.get("id"));
            System.out.println(document.get("title"));
            System.out.println(document.get("content"));
        }
        //关闭
        client.close();
    }

    /**
     * 根据关键词查询文档
     *
     * @throws Exception
     */
    @Test
    public void testSearchByTerm() throws Exception {
        //创建一个Settings对象
        Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
        //创建一个TransportClient对象
        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9301));
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9302));
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9303));
        //创建一个查询对象
        QueryBuilder queryBuilder = QueryBuilders.termQuery("title", "文档");
        //执行查询
        SearchResponse searchResponse = client.prepareSearch("index_hello")
                .setTypes("_doc")
                .setQuery(queryBuilder)
                .get();
        //取查询结果
        SearchHits searchHits = searchResponse.getHits();
        //取查询结果的总记录数
        System.out.println("查询结果总记录数:" + searchHits.getTotalHits());
        //查询结果列表
        Iterator<SearchHit> iterator = searchHits.iterator();
        while (iterator.hasNext()) {
            SearchHit searchHit = iterator.next();
            //打印文档对象,以json格式输出
            System.out.println(searchHit.getSourceAsString());
            //取文档的属性
            System.out.println("--------文档的属性");
            Map<String, Object> document = searchHit.getSourceAsMap();
            System.out.println(document.get("id"));
            System.out.println(document.get("title"));
            System.out.println(document.get("content"));
        }
        //关闭
        client.close();
    }

    /**
     * 根据分词查询,分页查询,高亮显示
     *
     * @throws Exception
     */
    @Test
    public void testQueryStringQuery() throws Exception {
        //创建一个Settings对象
        Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
        //创建一个TransportClient对象
        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9301));
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9302));
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9303));
        //创建一个查询对象
        QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("这是一个文档")
                .defaultField("title");
        //高亮显示
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.field("title");
        highlightBuilder.preTags("<em>");
        highlightBuilder.postTags("</em>");
        //执行分页查询
        SearchResponse searchResponse = client.prepareSearch("index_hello")
                .setTypes("_doc")
                .setQuery(queryBuilder)
                //页数
                .setFrom(0)
                //每页条数
                .setSize(5)
                //设置高亮
                .highlighter(highlightBuilder)
                .get();
        //取查询结果
        SearchHits searchHits = searchResponse.getHits();
        //取查询结果的总记录数
        System.out.println("查询结果总记录数:" + searchHits.getTotalHits());
        //查询结果列表
        Iterator<SearchHit> iterator = searchHits.iterator();
        while (iterator.hasNext()) {
            SearchHit searchHit = iterator.next();
            //打印文档对象,以json格式输出
            System.out.println(searchHit.getSourceAsString());
            //取文档的属性
            System.out.println("--------文档的属性");
            Map<String, Object> document = searchHit.getSourceAsMap();
            System.out.println(document.get("id"));
            System.out.println(document.get("title"));
            System.out.println(document.get("content"));
            System.out.println("********高亮显示");
            Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
            System.out.println(highlightFields);
            //取title高亮显示的结果
            HighlightField field = highlightFields.get("title");
            Text[] fragments = field.getFragments();
            if (fragments != null) {
                String title = fragments[0].toString();
                System.out.println(title);
            }
        }
        //关闭
        client.close();
    }
}

 

posted on 2020-09-18 23:24  一路繁花似锦绣前程  阅读(259)  评论(0编辑  收藏  举报