03 java操作elasticsearch完成索引与搜索

如上一节所示,elasticsearch提供了多种多样Restful格式的api,但es也提供了很多语言的对应插件。es的java客户端包括Java Transport Client和Java REST Client,后者又可分为Java Low Level REST Client和Java High Level REST Client。这一节我们将看一下使用Java High Level REST Client来操作elasticsearch服务。

1、前提约束

2、操作步骤

        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.2.4</version>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.2.4</version>
        </dependency>
  • 在项目/src/main/java下创建TestEs.java:
import org.apache.commons.beanutils.BeanUtils;
import org.apache.http.HttpHost;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class TestEs {


    public static void main(String[] args) throws Exception {
        insertDoc("1", "java", "Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程");
        insertDoc("2", "python", "Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发");
        insertDoc("3", "c", "C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。");
        getDoc("1");
        updateDoc("1", "name", "ali");
        getDoc("1");
        searchTerm("thon");

        searchId("1");
        deleteDoc("1");
        searcherHighlight();
    }


    //根据id精确匹配
    public static void searchId(String id) throws Exception {
        RestHighLevelClient client = initClient();
        String indexName = "test";//索引名称
        String typeName = "doc";//类型名称
        String[] split = new String[]{id};
        List<String> idList = Arrays.asList(split);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//构造搜索对象
        searchSourceBuilder.query(QueryBuilders.termsQuery("_id", idList));

        SearchRequest searchRequest = new SearchRequest(indexName);//创建查询请求对象
        searchRequest.types(typeName);//设置type
        searchRequest.source(searchSourceBuilder);//设置searchSourceBuilder

        SearchResponse searchResponse = client.search(searchRequest);//执行查询
        SearchHits hits = searchResponse.getHits();
        SearchHit[] searchHits = hits.getHits();
        for (SearchHit hit : searchHits) {
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            String studymodel = (String) sourceAsMap.get("desc");
            System.out.println(name);
            System.out.println(studymodel);
        }
        client.close();
    }

    //高亮显示关键字
    public static void searcherHighlight() throws Exception {
        RestHighLevelClient client = initClient();
        String indexName = "test";//索引名称
        String typeName = "doc";//类型名称
        String highligtFiled = "desc";//设置高亮的字段,此处查询的是interest中含有basketball的文档,因此高亮字段设为interest
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//构造搜索对象
        searchSourceBuilder.query(QueryBuilders.matchQuery("desc",
                "java"));//设置查询条件
        //设置高亮
        String preTags = "<strong>";
        String postTags = "</strong>";
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.preTags(preTags);//设置前缀
        highlightBuilder.postTags(postTags);//设置后缀
        highlightBuilder.field(highligtFiled);//设置高亮字段
        searchSourceBuilder.highlighter(highlightBuilder);//设置高亮信息

        SearchRequest searchRequest = new SearchRequest(indexName);//创建查询请求对象
        searchRequest.types(typeName);//设置type
        searchRequest.source(searchSourceBuilder);//设置searchSourceBuilder

        SearchResponse searchResponse = client.search(searchRequest);//执行查询

        SearchHits hits = searchResponse.getHits();
        SearchHit[] searchHits = hits.getHits();
        for (SearchHit searchHit : searchHits) {
            Map<String, HighlightField> map = searchHit.getHighlightFields();
            System.out.println(map.toString());
        }
        client.close();
    }

    //term关键字不分词搜索
    public static void searchTerm(String key) throws Exception {
        RestHighLevelClient client = initClient();
        String indexName = "test";//索引名称
        String typeName = "doc";//类型名称
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//构造搜索对象
        searchSourceBuilder.query(QueryBuilders.termQuery("desc", key));
        searchSourceBuilder.fetchSource(new String[]{"name"}, new String[]{});
        SearchRequest searchRequest = new SearchRequest(indexName);//创建查询请求对象
        searchRequest.types(typeName);//设置type
        searchSourceBuilder.from(0); //分页查询,设置起始下标,从0开始
        searchSourceBuilder.size(10);//每页显示个数
        searchRequest.source(searchSourceBuilder);//设置searchSourceBuilder

        SearchResponse searchResponse = client.search(searchRequest);//执行查询
        SearchHits hits = searchResponse.getHits();
        SearchHit[] searchHits = hits.getHits();
        for (SearchHit hit : searchHits) {
            String index = hit.getIndex();
            String type = hit.getType();
            String id = hit.getId();
            float score = hit.getScore();
            String sourceAsString = hit.getSourceAsString();
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            System.out.println(name);
        }
        client.close();
    }
    //更新文档
    public static void updateDoc(String id, String name, String desc) throws Exception {
        RestHighLevelClient client = initClient();
        Student student = new Student(name, desc);

        Map map = BeanUtils.describe(student);
        IndexRequest request = new IndexRequest("test", "doc", id);
        request.source(map);
        client.index(request);
        client.close();
    }
   //插入文档
    public static void insertDoc(String id, String name, String desc) throws Exception {
        RestHighLevelClient client = initClient();
        Student student = new Student(name, desc);
        Map map = BeanUtils.describe(student);
        IndexRequest request = new IndexRequest("test", "doc", id);
        request.source(map);
        client.index(request);
        client.close();
    }
   //删除文档
    public static void deleteDoc(String id) throws Exception {
        RestHighLevelClient client = initClient();

        DeleteRequest request = new DeleteRequest("test", "doc", id);
        client.delete(request);

        client.close();
    }

   //获取文档
    public static void getDoc(String id) throws Exception {
        RestHighLevelClient client = initClient();
        GetRequest request = new GetRequest("test", "doc", id);
        GetResponse response = client.get(request);
        Map<String, Object> source = response.getSource();
        Student student = new Student();
        BeanUtils.populate(student, source);
        System.out.println(student);
        client.close();
    }
    //获取es客户端
    private static RestHighLevelClient initClient() {
        String[] ips = {"localhost:9200"};
        HttpHost[] httpHosts = new HttpHost[ips.length];
        for (int i = 0; i < ips.length; i++) {
            httpHosts[i] = HttpHost.create(ips[i]);
        }
        RestClientBuilder builder = RestClient.builder(httpHosts);
        return new RestHighLevelClient(builder);
    }
}

以上就是java操作es的基本过程。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值