【搜索文章】:搜索(es)+ 搜索记录(mongodb)+ 搜索联想词_es联想搜索
需求
用户输入关键字时,可以检索出结果,
并且可以查看历史搜索情况,
还可以进行联想词展示。
ElasticSearch(搜索)
准备工作
- 使用docker安装es,配置ik分词器
- 重新建一个search模块,用来写搜索微服务的业务代码
- 导入es的依赖
- 配置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
- 初始化索引库数据(项目上线之前需要批量导入):
@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); }
文章搜索
- 单一条件查询:直接放入SearchSourceBuilder
如果查询逻辑简单,只有一个独立条件,可以直接将条件放入SearchSourceBuilder的query方法中
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();sourceBuilder.query(QueryBuilders.termQuery(\"status\", \"active\"));
- 组合多个条件:必须使用BoolQueryBuilder,当需要组合多个条件(如 AND/OR/NOT 逻辑)时,必须显式使用 BoolQueryBuilder。
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 {