本文结合Java客户端API,深入讲解Elasticsearch全文搜索的实现。包含10+个实战示例及对应的Java代码,涵盖match、multi_match、高亮显示等核心功能。
<dependency>
<groupId>org.elasticsearch.clientgroupId>
<artifactId>elasticsearch-rest-high-level-clientartifactId>
<version>7.17.0version>
dependency>
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http")));
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);
SearchRequest searchRequest = new SearchRequest("books");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(QueryBuilders.matchQuery("content", "搜索技术"));
searchRequest.source(sourceBuilder);
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
// 处理结果...
MatchQueryBuilder matchQuery = QueryBuilders.matchQuery("content", "分布式存储")
.operator(Operator.AND);
sourceBuilder.query(matchQuery);
MultiMatchQueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery("性能优化", "title", "content");
sourceBuilder.query(multiMatchQuery);
MatchPhraseQueryBuilder phraseQuery = QueryBuilders.matchPhraseQuery("content", "典型应用")
.slop(2); // 允许间隔2个词
sourceBuilder.query(phraseQuery);
MatchQueryBuilder fuzzyQuery = QueryBuilders.matchQuery("title", "Elasticsarch")
.fuzziness(Fuzziness.AUTO);
sourceBuilder.query(fuzzyQuery);
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field("content")
.preTags("")
.postTags("");
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);
}
}
sourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC));
sourceBuilder.sort(new FieldSortBuilder("rating").order(SortOrder.DESC));
MultiMatchQueryBuilder weightedQuery = QueryBuilders.multiMatchQuery("搜索算法")
.field("title", 3.0f) // 提升title权重
.field("content");
sourceBuilder.query(weightedQuery);
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("content", "技术"))
.should(QueryBuilders.matchPhraseQuery("title", "实战"))
.filter(QueryBuilders.rangeQuery("rating").gte(4.0));
sourceBuilder.query(boolQuery);
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());
}
}
client.close(); // 使用后关闭客户端
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 高可用实战:架构设计与场景化解决方案》