使用Java操作Elasticsearch

本文通过具体案例展示了如何使用Elasticsearch进行复杂的搜索操作,包括基于多字段的关键词查询、分页、排序、过滤、指定字段返回以及高亮处理等高级功能。通过对查询结果的分析,展现了Elasticsearch在处理大量数据时的强大能力和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 使用Kibana建立索引和映射及文档

PUT /ems
{
  "mappings":{
    "emp":{
      "properties":{
        "name":{
          "type":"text",
           "analyzer": "ik_max_word",
           "search_analyzer": "ik_max_word"
        },
        "age":{
          "type":"integer"
        },
        "bir":{
          "type":"date"
        },
        "content":{
          "type":"text",
          "analyzer": "ik_max_word",
          "search_analyzer": "ik_max_word"
        },
        "address":{
          "type":"keyword"
        }
      }
    }
  }
}
PUT /ems/emp/_bulk
  {"index":{}}
  {"name":"小黑","age":23,"bir":"2012-12-12","content":"为开发团队选择一款优秀的MVC框架是件难事儿,在众多可行的方案中决择需要很高的经验和水平","address":"北京"}
  {"index":{}}
  {"name":"王小黑","age":24,"bir":"2012-12-12","content":"Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式","address":"上海"}
  {"index":{}}
  {"name":"张小五","age":8,"bir":"2012-12-12","content":"Spring Cloud 作为Java 语言的微服务框架,它依赖于Spring Boot,有快速开发、持续交付和容易部署等特点。Spring Cloud 的组件非常多,涉及微服务的方方面面,井在开源社区Spring 和Netflix 、Pivotal 两大公司的推动下越来越完善","address":"无锡"}
  {"index":{}}
  {"name":"win7","age":9,"bir":"2012-12-12","content":"Spring的目标是致力于全方位的简化Java开发。 这势必引出更多的解释, Spring是如何简化Java开发的?","address":"南京"}
  {"index":{}}
  {"name":"梅超风","age":43,"bir":"2012-12-12","content":"Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API","address":"杭州"}
  {"index":{}}
  {"name":"张无忌","age":59,"bir":"2012-12-12","content":"ElasticSearch是一个基于Lucene的搜索服务器。碰瓷了,它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口","address":"北京"}
  {"index":{}}
  {"name":"开源框架全集","age":59,"bir":"2012-12-12","content":"spring springcloud springboot springdata 这是开源框架的技术栈之一,还有很多开源技术值得我们学习","address":"开源框架团队"}

2. 使用IDEA进行案例测试

	TransportClient transportClient;

    @Before
    public void before() throws UnknownHostException {

        this.transportClient = new PreBuiltTransportClient(Settings.EMPTY);

        transportClient.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.116.128"),9300));
    }

    @After
    public void after(){
        transportClient.close();
    }

	/**
     * 基于多字段关键词查询
     * 分页
     * 排序
     * 过滤
     * 指定字段返回
     * 高亮处理
     */
    @Test
    public void testSearch() {
        SearchResponse searchResponse = transportClient.prepareSearch("ems")
                .setTypes("emp")
                // 起始条数
                .setFrom(0)
                // 每页记录数
                .setSize(20)
                // 执行排序条件
                .addSort("age", SortOrder.DESC)
                // 指定返回的字段和不返回的字段
                .setSource(SearchSourceBuilder.searchSource().fetchSource("*", "bir"))
                // 过滤条件
                .setPostFilter(QueryBuilders.rangeQuery("age").gte(0).lte(100))
                // 多字段搜索
                .setQuery(QueryBuilders.multiMatchQuery("框架爱好者", "name", "content"))
                // 高亮处理
                .highlighter(new HighlightBuilder().field("*").requireFieldMatch(false).preTags("<span style='color:red;'>").postTags("</span>"))
                .get();

        long totalHits = searchResponse.getHits().getTotalHits();
        System.out.println("符合条件的总条数:" + totalHits);

        float maxScore = searchResponse.getHits().getMaxScore();
        System.out.println("最大分数:" + maxScore);

        SearchHit[] hits = searchResponse.getHits().getHits();
        for (SearchHit hit : hits) {
            System.out.println("原始文档:" + hit.getSourceAsString());
            System.out.println("高亮字段:" + hit.getHighlightFields());
        }
    }

3. 测试结果

符合条件的总条数:3
最大分数:0.9331132
原始文档:{"address":"开源框架团队","name":"开源框架全集","age":59,"content":"spring springcloud springboot springdata 这是开源框架的技术栈之一,还有很多开源技术值得我们学习"}
高亮字段:{name=[name], fragments[[开源<span style='color:red;'>框架</span>全集]], content=[content], fragments[[spring springcloud springboot springdata 这是开源<span style='color:red;'>框架</span>的技术栈之一,还有很多开源技术值得我们学习]]}
原始文档:{"address":"北京","name":"小黑","age":23,"content":"为开发团队选择一款优秀的MVC框架是件难事儿,在众多可行的方案中决择需要很高的经验和水平"}
高亮字段:{content=[content], fragments[[为开发团队选择一款优秀的MVC<span style='color:red;'>框架</span>是件难事儿,在众多可行的方案中决择需要很高的经验和水平]]}
原始文档:{"address":"上海","name":"王小黑","age":24,"content":"Spring 框架是一个分层架构,由 7 个定义良好的模块组成,这是一个开源框架,她非常不错,使用真的很方便"}
高亮字段:{content=[content], fragments[[Spring <span style='color:red;'>框架</span>是一个分层架构,由 7 个定义良好的模块组成,这是一个开源<span style='color:red;'>框架</span>,她非常不错,使用真的很方便]]}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值