> 技术文档 > 【搜索文章】:搜索(es)+ 搜索记录(mongodb)+ 搜索联想词_es联想搜索

【搜索文章】:搜索(es)+ 搜索记录(mongodb)+ 搜索联想词_es联想搜索


需求

用户输入关键字时,可以检索出结果,
【搜索文章】:搜索(es)+ 搜索记录(mongodb)+ 搜索联想词_es联想搜索
并且可以查看历史搜索情况,【搜索文章】:搜索(es)+ 搜索记录(mongodb)+ 搜索联想词_es联想搜索
还可以进行联想词展示。【搜索文章】:搜索(es)+ 搜索记录(mongodb)+ 搜索联想词_es联想搜索

ElasticSearch(搜索)

准备工作

  1. 使用docker安装es,配置ik分词器
  2. 重新建一个search模块,用来写搜索微服务的业务代码
  3. 导入es的依赖
  4. 配置RestHighLevelClient
@Getter@Setter@Configuration@ConfigurationProperties(prefix = \"elasticsearch\")public class ElasticSearchConfig {  private String host; private int port; @Bean public RestHighLevelClient client(){  System.out.println(host); System.out.println(port); return new RestHighLevelClient(RestClient.builder( new HttpHost( host, port, \"http\" ) )); }}
spring: autoconfigure: exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfigurationelasticsearch: host: 192.168.140.102 port: 9200
  1. 初始化索引库数据(项目上线之前需要批量导入):
@Autowiredprivate ApArticleMapper apArticleMapper; @Autowired private RestHighLevelClient restHighLevelClient; /** * 注意:数据量的导入,如果数据量过大,需要分页导入 * @throws Exception */ @Test public void init() throws Exception {  // 1. 查询所有符合条件的文章数据 List<SearchArticleVo> searchArticleVos = apArticleMapper.loadArticleList(); // 2. 批量导入es索引库中 BulkRequest bulkRequest = new BulkRequest(\"app_info_article\"); for (SearchArticleVo searchArticleVo : searchArticleVos) {  IndexRequest indexRequest = new IndexRequest().id(searchArticleVo.getId().toString())  .source(JSON.toJSONString(searchArticleVo), XContentType.JSON); bulkRequest.add(indexRequest); // 批量添加数据 } restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT); }

文章搜索

  1. 单一条件查询:直接放入SearchSourceBuilder
    如果查询逻辑简单,只有一个独立条件,可以直接将条件放入SearchSourceBuilder的query方法中
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(QueryBuilders.termQuery(\"status\", \"active\"));
  1. 组合多个条件:必须使用BoolQueryBuilder,当需要组合多个条件(如 AND/OR/NOT 逻辑)时,必须显式使用 BoolQueryBuilder。
类型 作用 是否影响评分 是否可缓存 must 子条件,必须满足,类似逻辑 AND ✅ 是 ❌ 否 filter 子条件 必须满足,但不参与相关性评分 ❌ 否 ✅ 是(可缓存)
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() .must(QueryBuilders.termQuery(\"status\", \"active\")) // AND 条件 .must(QueryBuilders.rangeQuery(\"age\").gte(18)) // 另一个 AND 条件 .should(QueryBuilders.termQuery(\"tag\", \"urgent\")) // OR 条件 .mustNot(QueryBuilders.termQuery(\"deleted\", true)); // NOT 条件SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(boolQuery);

虽然技术上可以将所有查询都包装成 BoolQuery,但直接使用单一条件更简洁

private final RestHighLevelClient restHighLevelClient;@Overridepublic ResponseResult search(UserSearchDto dto) throws IOException {