Elasticsearch RESTful API入门:全文搜索实战(Java版)

Elasticsearch RESTful API入门:全文搜索实战(Java版)

本文结合Java客户端API,深入讲解Elasticsearch全文搜索的实现。包含10+个实战示例及对应的Java代码,涵盖match、multi_match、高亮显示等核心功能。

一、环境准备

1. 添加Maven依赖

xml 复制代码
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.17.0</version> <!-- 请匹配ES服务器版本 -->
</dependency>

2. 初始化客户端

java 复制代码
RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost", 9200, "http")));

3. 创建索引(Java实现)

java 复制代码
CreateIndexRequest request = new CreateIndexRequest("books");
request.settings(Settings.builder()
        .put("index.number_of_shards", 1)
        .put("index.number_of_replicas", 1)
);
// 定义mapping
XContentBuilder mappingBuilder = XContentFactory.jsonBuilder()
        .startObject()
            .startObject("properties")
                .startObject("title")
                    .field("type", "text")
                    .field("analyzer", "ik_max_word")
                .endObject()
                .startObject("author")
                    .field("type", "keyword")
                .endObject()
                .startObject("content")
                    .field("type", "text")
                    .field("analyzer", "ik_smart")
                .endObject()
                .startObject("publish_date")
                    .field("type", "date")
                .endObject()
                .startObject("rating")
                    .field("type", "float")
                .endObject()
            .endObject()
        .endObject();
request.mapping(mappingBuilder);
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);

二、基础全文搜索实战(Java API)

1. match查询

java 复制代码
SearchRequest searchRequest = new SearchRequest("books");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchQuery("content", "搜索技术"));
searchRequest.source(sourceBuilder);
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
// 处理结果...

2. 设置AND逻辑

java 复制代码
MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("content", "分布式存储")
        .operator(Operator.AND);
sourceBuilder.query(matchQuery);

3. 多字段搜索(multi_match)

java 复制代码
MultiMatchQueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery("性能优化", "title", "content");
sourceBuilder.query(multiMatchQuery);

三、高级搜索技巧(Java实现)

1. 短语搜索

java 复制代码
MatchPhraseQueryBuilder phraseQuery = QueryBuilders.matchPhraseQuery("content", "典型应用")
        .slop(2); // 允许间隔2个词
sourceBuilder.query(phraseQuery);

2. 模糊搜索

java 复制代码
MatchQueryBuilder fuzzyQuery = QueryBuilders.matchQuery("title", "Elasticsarch")
        .fuzziness(Fuzziness.AUTO);
sourceBuilder.query(fuzzyQuery);

四、搜索结果优化(Java API)

1. 高亮显示

java 复制代码
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field("content")
        .preTags("<strong>")
        .postTags("</strong>");
sourceBuilder.highlighter(highlightBuilder);
// 解析高亮结果
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
    Map<String, HighlightField> highlightFields = hit.getHighlightFields();
    HighlightField highlight = highlightFields.get("content");
    if (highlight != null) {
        Text[] fragments = highlight.fragments();
        String fragmentString = fragments[0].string();
        System.out.println(fragmentString);
    }
}

2. 结果排序

java 复制代码
sourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC));
sourceBuilder.sort(new FieldSortBuilder("rating").order(SortOrder.DESC));

3. 字段权重

java 复制代码
MultiMatchQueryBuilder weightedQuery = QueryBuilders.multiMatchQuery("搜索算法")
        .field("title", 3.0f) // 提升title权重
        .field("content");
sourceBuilder.query(weightedQuery);

五、复杂场景实战(Java)

1. 组合搜索(bool查询)

java 复制代码
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
        .must(QueryBuilders.matchQuery("content", "技术"))
        .should(QueryBuilders.matchPhraseQuery("title", "实战"))
        .filter(QueryBuilders.rangeQuery("rating").gte(4.0));
sourceBuilder.query(boolQuery);

2. 搜索建议

java 复制代码
SuggestionBuilder termSuggestionBuilder = SuggestBuilders.termSuggestion("title")
        .text("elastc")
        .suggestMode(TermSuggestionBuilder.SuggestMode.ALWAYS);
SuggestBuilder suggestBuilder = new SuggestBuilder();
suggestBuilder.addSuggestion("title_suggest", termSuggestionBuilder);
sourceBuilder.suggest(suggestBuilder);
// 解析建议结果
Suggest suggest = response.getSuggest();
TermSuggestion termSuggestion = suggest.getSuggestion("title_suggest");
for (TermSuggestion.Entry entry : termSuggestion.getEntries()) {
    for (TermSuggestion.Entry.Option option : entry) {
        System.out.println(option.getText().string());
    }
}

六、资源释放

java 复制代码
client.close(); // 使用后关闭客户端

七、常见问题(Java客户端相关)

  1. 依赖冲突
    确保Elasticsearch客户端版本与服务器一致

  2. 连接池管理
    推荐单例模式创建客户端,避免频繁创建销毁

  3. 异步操作
    高性能场景可使用异步客户端:

    java 复制代码
    client.searchAsync(searchRequest, RequestOptions.DEFAULT, new ActionListener<>() {
         @Override
         public void onResponse(SearchResponse response) { /*处理响应*/ }
         @Override
         public void onFailure(Exception e) { /*处理异常*/ }
    });

提示:完整代码示例可在GitHub仓库获取(虚拟链接:https://github.com/example/es-java-demo)

RESTful 操作 Java 类/方法
创建索引 CreateIndexRequest, RestHighLevelClient#indices().create()
添加文档 IndexRequest
match查询 QueryBuilders.matchQuery()
bool查询 BoolQueryBuilder
高亮显示 HighlightBuilder
分页 SearchSourceBuilder#from()size()
排序 SortBuilders

下集预告:《Elasticsearch 高可用实战:架构设计与场景化解决方案》

相关推荐
楠枬11 分钟前
OpenFeign
java·spring cloud·微服务
是席木木啊13 分钟前
基于MinIO Java SDK实现ZIP文件上传的方案与实践
java·开发语言
寰天柚子13 分钟前
大模型时代的技术从业者:核心能力重构与实践路径
大数据·人工智能
计算机毕设指导618 分钟前
基于微信小程序的垃圾分类信息系统【源码文末联系】
java·spring boot·mysql·微信小程序·小程序·tomcat·maven
毕设源码-赖学姐20 分钟前
【开题答辩全过程】以 高校就业系统的实现为例,包含答辩的问题和答案
java·eclipse
一起养小猫23 分钟前
《Java数据结构与算法》第四篇(四):二叉树的高级操作查找与删除实现详解
java·开发语言·数据结构·算法
成长之路51427 分钟前
【工具变量】上市公司西部陆海新通道DID数据(2010-2024年)
大数据
Coder_Boy_34 分钟前
【人工智能应用技术】-基础实战-小程序应用(基于springAI+百度语音技术)智能语音控制-单片机交互代码
java·人工智能·后端·嵌入式硬件
Hello.Reader1 小时前
Flink SQL UPDATE 语句批模式行级更新、连接器能力要求与实战避坑
大数据·sql·flink
a努力。1 小时前
国家电网Java面试被问:二叉树的前序、中序、后序遍历
java·开发语言·后端·面试