java 交互ElasticSearch

创建工程,导入坐标

<properties>
        <maven.compiler.source>1.9</maven.compiler.source>
        <maven.compiler.target>1.9</maven.compiler.target>
    </properties>
    <dependencies>
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>5.6.8</version>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>transport</artifactId>
        <version>5.6.8</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-to-slf4j</artifactId>
        <version>2.9.1</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.24</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.21</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>

创建索引index

//创建索引
public void createIndex() throws Exception{
    // 创建Client连接对象
    Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
    TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
    //创建名称为index_name的索引
    client.admin().indices().prepareCreate("index_name").get();
    //释放资源
    client.close();
}

创建映射mapping

 public void setMappings() throws Exception {
  		// 创建Client连接对象
    	Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
        TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        //创建一个Mappings信息
        /*{
            "article":{
            "properties":{
                "id":{
                    "type":"long",
                            "store":true
                },
                "title":{
                    "type":"text",
                            "store":true,
                            "index":true,
                            "analyzer":"ik_smart"
                },
                "content":{
                    "type":"text",
                            "store":true,
                            "index":true,
                            "analyzer":"ik_smart"
                }
            }
        }
        }*/
        XContentBuilder builder = XContentFactory.jsonBuilder()
                .startObject()
                    .startObject("article")
                        .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()
                .endObject();
        //使用client把mapping信息设置到索引库中
        client.admin().indices()
                //设置要做映射的索引
                .preparePutMapping("index_name")
                //设置要做映射的type
                .setType("article")
                //mapping信息,可以是XContentBuilder对象可以是json格式的字符串
                .setSource(builder)
                //执行操作
                .get();
        //关闭链接
        client.close();
    }

建立文档document(方式一)

  public void AddDocument() throws Exception {
  		// 创建Client连接对象
    	Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
    	//创建一个client对象
        TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        //创建一个文档对象
        XContentBuilder builder = XContentFactory.jsonBuilder()
                .startObject()
                    .field("id",1)
                    .field("title","新增的文章标题")
                    .field("content", "新增的文章内容")
                .endObject();
        //把文档对象添加到索引库
        client.prepareIndex()
                //设置索引名称
                .setIndex("index_name")
                //设置type
                .setType("article")
                //设置文档的id,如果不设置的话自动的生成一个id
                .setId("1")
                //设置文档信息
                .setSource(builder)
                //执行操作
                .get();
        //关闭客户端
        client.close();
    }

建立文档document(方式二)

由于我们要使用Jackson转换实体类
添加jackson坐标

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.8.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.1</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.8.1</version>
</dependency>

创建Article实体

public class Article {
    private long id;
    private String title;
    private String content;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

添加文档

public void AddDocument2() throws Exception {
        // 创建Client连接对象
    	Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
        TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        //创建一个Article对象
        Article article = new Article();
        //设置对象的属性
        article.setId(2);
        article.setTitle("新增文章标题(方式二)");
        article.setContent("新增文章内容(方式二)");
        //把article对象转换成json格式的字符串。
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonDocument = objectMapper.writeValueAsString(article);
        System.out.println(jsonDocument);
        //使用client对象把文档写入索引库
        client.prepareIndex("index_name","article", "2")
                .setSource(jsonDocument, XContentType.JSON)
                .get();
        //关闭客户端
        client.close();
    }

删除文档

 public void DeleteDocument() throws Exception{
   		// 创建Client连接对象
    	Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
        TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        client.prepareDelete("index_name", "article", "2").get();
        client.close();
    }

查询文档操作

根据文档ID查询
public void SearchById() throws Exception {
        // 创建Client连接对象
    	Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
        TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        SearchResponse response = client.prepareSearch("index_name")
                .setTypes("article")
                //设置要查询的id
                .setQuery(QueryBuilders.idsQuery().addIds("1"))
                //执行查询
                .get();
        //取查询结果
        SearchHits searchHits = response.getHits();
        //取查询结果总记录数
        System.out.println(searchHits.getTotalHits());
        Iterator<SearchHit> hitIterator = searchHits.iterator();
        while(hitIterator.hasNext()) {
            SearchHit searchHit = hitIterator.next();
            //打印整行数据
            System.out.println(searchHit.getSourceAsString());
        }
    }

关键词查询
public void TermQuery() throws Exception{
    	Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
   		TransportClient client = new PreBuiltTransportClient(settings)
        	.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
    	//设置搜索条件
    	SearchResponse searchResponse = client.prepareSearch("index_name")
        	.setTypes("article")
        	.setQuery(QueryBuilders.termQuery("content", "搜索")).get();

   		//取查询结果
    	SearchHits searchHits = searchResponse.getHits();
  		//取查询结果的总记录数
   		System.out.println("查询结果总记录数:" + searchHits.getTotalHits());
   		//查询结果列表
    	Iterator<SearchHit> iterator = searchHits.iterator();
    	while(iterator.hasNext()) {
        	SearchHit searchHit = iterator.next();
        	//取文档的属性
        	System.out.println("-----------文档的属性");
        	Map<String, Object> document = searchHit.getSource();
        	System.out.println(document.get("id"));
        	System.out.println(document.get("title"));
        	System.out.println(document.get("content"));
    }
    //释放资源
    client.close();
}
将传入字符串分词后查询
public void StringQuery() throws Exception{
    	//创建es客户端连接对象
    	Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
    	TransportClient client = new PreBuiltTransportClient(settings)
        	.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));

    	//设置搜索条件
    	SearchResponse searchResponse = client.prepareSearch("index_name")
        	.setTypes("article")
        	.setQuery(QueryBuilders.queryStringQuery("分词后搜索")).get();

    	//遍历搜索结果数据
    	SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
    	System.out.println("查询结果有:" + hits.getTotalHits() + "条");
    	Iterator<SearchHit> iterator = hits.iterator();
    	while (iterator.hasNext()) {
        	SearchHit searchHit = iterator.next(); // 每个查询对象
        	System.out.println(searchHit.getSourceAsString()); // 获取字符串格式打印
    	}
   		//释放资源
    	client.close();
}

文档分页操作

public void search_paging() throws Exception {
		Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
   		TransportClient client = new PreBuiltTransportClient(settings)
        	.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        QueryBuilder queryBuilder = QueryBuilders.termQuery("title", "文档");
        //执行查询
        SearchResponse searchResponse = client.prepareSearch("index_name")
                .setTypes("article")
                .setQuery(queryBuilder)
                //设置分页信息
                .setFrom(0)
                //每页显示的行数
                .setSize(5)
                .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());
        }
        //关闭client
        client.close();
    }

查询结果高亮

ElasticSearch可以对查询出的内容中关键字部分进行标签和样式的设置,但是你需要告诉ElasticSearch使用什么标签对高亮关键字进行包裹

pulic void search_highlight() throws Exception {
		Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();
   		TransportClient client = new PreBuiltTransportClient(settings)
        	.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        //创建一个QueryBuilder对象
        QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("文档")
                .defaultField("title");
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        //高亮显示的字段
        highlightBuilder.field("title");
        highlightBuilder.preTags("<em>");
        highlightBuilder.postTags("</em>");
        //执行查询
        SearchResponse searchResponse = client.prepareSearch("index_name")
                .setTypes("article")
                .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, HighlightField> highlightFields = searchHit.getHighlightFields();
            //取title高亮显示的结果
            HighlightField field = highlightFields.get(highlightField);
            Text[] fragments = field.getFragments();
            if (fragments != null) {
                String title = fragments[0].toString();
                System.out.println(title);
            }
        }
        //关闭client
        client.close();
    }

分享到这里就结束了,欢迎关注

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值