基于 ElasticSearch 实现站内全文搜索

}

public String getCreateDate() {

return createDate;

}

public void setCreateDate(String createDate) {

this.createDate = createDate;

}

public String getUrl() {

return url;

}

public void setUrl(String url) {

this.url = url;

}

}

5.2 客户端配置

通过java配置es的客户端。

package com.lbh.es.config;

import org.apache.http.HttpHost;

import org.elasticsearch.client.RestClient;

import org.elasticsearch.client.RestClientBuilder;

import org.elasticsearch.client.RestHighLevelClient;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;

import java.util.List;

/**

* Copyright©lbhbinhao@163.com

* @author liubinhao

* @date 2021/3/3

*/

@Configuration

public class EsConfig {

@Value(“${elasticsearch.schema}”)

private String schema;

@Value(“${elasticsearch.address}”)

private String address;

@Value(“${elasticsearch.connectTimeout}”)

private int connectTimeout;

@Value(“${elasticsearch.socketTimeout}”)

private int socketTimeout;

@Value(“${elasticsearch.connectionRequestTimeout}”)

private int tryConnTimeout;

@Value(“${elasticsearch.maxConnectNum}”)

private int maxConnNum;

@Value(“${elasticsearch.maxConnectPerRoute}”)

private int maxConnectPerRoute;

@Bean

public RestHighLevelClient restHighLevelClient() {

// 拆分地址

List hostLists = new ArrayList<>();

String[] hostList = address.split(“,”);

for (String addr : hostList) {

String host = addr.split(“:”)[0];

String port = addr.split(“:”)[1];

hostLists.add(new HttpHost(host, Integer.parseInt(port), schema));

}

// 转换成 HttpHost 数组

HttpHost[] httpHost = hostLists.toArray(new HttpHost[]{});

// 构建连接对象

RestClientBuilder builder = RestClient.builder(httpHost);

// 异步连接延时配置

builder.setRequestConfigCallback(requestConfigBuilder -> {

requestConfigBuilder.setConnectTimeout(connectTimeout);

requestConfigBuilder.setSocketTimeout(socketTimeout);

requestConfigBuilder.setConnectionRequestTimeout(tryConnTimeout);

return requestConfigBuilder;

});

// 异步连接数配置

builder.setHttpClientConfigCallback(httpClientBuilder -> {

httpClientBuilder.setMaxConnTotal(maxConnNum);

httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);

return httpClientBuilder;

});

return new RestHighLevelClient(builder);

}

}

5.3 业务代码编写

包括一些检索文章的信息,可以从文章标题,文章内容以及作者信息这些维度来查看相关信息。另外推荐:Java进阶视频资源

package com.lbh.es.service;

import com.google.gson.Gson;

import com.lbh.es.entity.ArticleEntity;

import com.lbh.es.repository.ArticleRepository;

import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;

import org.elasticsearch.action.get.GetRequest;

import org.elasticsearch.action.get.GetResponse;

import org.elasticsearch.action.index.IndexRequest;

import org.elasticsearch.action.index.IndexResponse;

import org.elasticsearch.action.search.SearchRequest;

import org.elasticsearch.action.search.SearchResponse;

import org.elasticsearch.action.support.master.AcknowledgedResponse;

import org.elasticsearch.client.RequestOptions;

import org.elasticsearch.client.RestHighLevelClient;

import org.elasticsearch.client.indices.CreateIndexRequest;

import org.elasticsearch.client.indices.CreateIndexResponse;

import org.elasticsearch.common.settings.Settings;

import org.elasticsearch.common.xcontent.XContentType;

import org.elasticsearch.index.query.QueryBuilders;

import org.elasticsearch.search.SearchHit;

import org.elasticsearch.search.builder.SearchSourceBuilder;

import org.springframework.stereotype.Service;

import javax.annotation.Resource;

import java.io.IOException;

import java.util.*;

/**

* Copyright©lbhbinhao@163.com

* @author liubinhao

* @date 2021/3/3

*/

@Service

public class ArticleService {

private static final String ARTICLE_INDEX = “article”;

@Resource

private RestHighLevelClient client;

@Resource

private ArticleRepository articleRepository;

public boolean createIndexOfArticle(){

Settings settings = Settings.builder()

.put(“index.number_of_shards”, 1)

.put(“index.number_of_replicas”, 1)

.build();

// {“properties”:{“author”:{“type”:“text”},

// “content”:{“type”:“text”,“analyzer”:“ik_max_word”,“search_analyzer”:“ik_smart”}

// ,“title”:{“type”:“text”,“analyzer”:“ik_max_word”,“search_analyzer”:“ik_smart”},

// ,“createDate”:{“type”:“date”,“format”:“yyyy-MM-dd HH:mm:ss||yyyy-MM-dd”}

// }

String mapping = “{“properties”:{“author”:{“type”:“text”},\n” +

““content”:{“type”:“text”,“analyzer”:“ik_max_word”,“search_analyzer”:“ik_smart”}\n” +

“,“title”:{“type”:“text”,“analyzer”:“ik_max_word”,“search_analyzer”:“ik_smart”}\n” +

“,“createDate”:{“type”:“date”,“format”:“yyyy-MM-dd HH:mm:ss||yyyy-MM-dd”}\n” +

“},“url”:{“type”:“text”}\n” +

“}”;

CreateIndexRequest indexRequest = new CreateIndexRequest(ARTICLE_INDEX)

.settings(settings).mapping(mapping,XContentType.JSON);

CreateIndexResponse response = null;

try {

response = client.indices().create(indexRequest, RequestOptions.DEFAULT);

} catch (IOException e) {

e.printStackTrace();

}

if (response!=null) {

System.err.println(response.isAcknowledged() ? “success” : “default”);

return response.isAcknowledged();

} else {

return false;

}

}

public boolean deleteArticle(){

DeleteIndexRequest request = new DeleteIndexRequest(ARTICLE_INDEX);

try {

AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);

return response.isAcknowledged();

} catch (IOException e) {

e.printStackTrace();

}

return false;

}

public IndexResponse addArticle(ArticleEntity article){

Gson gson = new Gson();

String s = gson.toJson(article);

//创建索引创建对象

IndexRequest indexRequest = new IndexRequest(ARTICLE_INDEX);

//文档内容

indexRequest.source(s,XContentType.JSON);

//通过client进行http的请求

IndexResponse re = null;

try {

re = client.index(indexRequest, RequestOptions.DEFAULT);

} catch (IOException e) {

e.printStackTrace();

}

return re;

}

public void transferFromMysql(){

articleRepository.findAll().forEach(this::addArticle);

}

public List queryByKey(String keyword){

SearchRequest request = new SearchRequest();

/*

* 创建  搜索内容参数设置对象:SearchSourceBuilder

* 相对于matchQuery,multiMatchQuery针对的是多个fi eld,也就是说,当multiMatchQuery中,fieldNames参数只有一个时,其作用与matchQuery相当;

* 而当fieldNames有多个参数时,如field1和field2,那查询的结果中,要么field1中包含text,要么field2中包含text。

*/

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

searchSourceBuilder.query(QueryBuilders

.multiMatchQuery(keyword, “author”,“content”,“title”));

request.source(searchSourceBuilder);

List result = new ArrayList<>();

try {

SearchResponse search = client.search(request, RequestOptions.DEFAULT);

for (SearchHit hit:search.getHits()){

Map<String, Object> map = hit.getSourceAsMap();

ArticleEntity item = new ArticleEntity();

item.setAuthor((String) map.get(“author”));

item.setContent((String) map.get(“content”));

item.setTitle((String) map.get(“title”));

item.setUrl((String) map.get(“url”));

result.add(item);

}

return result;

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

public ArticleEntity queryById(String indexId){

GetRequest request = new GetRequest(ARTICLE_INDEX, indexId);

GetResponse response = null;

try {

response = client.get(request, RequestOptions.DEFAULT);

} catch (IOException e) {

e.printStackTrace();

}

if (response!=null&&response.isExists()){

Gson gson = new Gson();

return gson.fromJson(response.getSourceAsString(),ArticleEntity.class);

}

return null;

}

}

5.4 对外接口

和使用springboot开发web程序相同。

package com.lbh.es.controller;

import com.lbh.es.entity.ArticleEntity;

import com.lbh.es.service.ArticleService;

import org.elasticsearch.action.index.IndexResponse;

import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

import java.util.List;

/**

* Copyright©lbhbinhao@163.com

* @author liubinhao

* @date 2021/3/3

*/

@RestController

@RequestMapping(“article”)

public class ArticleController {

@Resource

private ArticleService articleService;

@GetMapping(“/create”)

public boolean create(){

return articleService.createIndexOfArticle();

}

@GetMapping(“/delete”)

public boolean delete() {

return articleService.deleteArticle();

}

@PostMapping(“/add”)

public IndexResponse add(@RequestBody ArticleEntity article){

return articleService.addArticle(article);

}

@GetMapping(“/fransfer”)

public String transfer(){

articleService.transferFromMysql();

return “successful”;

}

@GetMapping(“/query”)

public List query(String keyword){

return articleService.queryByKey(keyword);

}

}

5.5 页面

此处页面使用thymeleaf,主要原因是笔者真滴不会前端,只懂一丢丢简单的h5,就随便做了一个可以展示的页面。

搜索页面
YiyiDu
一亿度
搜索结果页面
xx-manager

    • 6 小结


      上班撸代码,下班继续撸代码写博客,花了两天研究了以下es,其实这个玩意儿还是挺有意思的,现在IR领域最基础的还是基于统计学的,所以对于es这类搜索引擎而言在大数据的情况下具有良好的表现。每一次写实战笔者其实都感觉有些无从下手,因为不知道做啥?所以也希望得到一些有意思的点子笔者会将实战做出来。

      (感谢阅读,希望对你所有帮助)

      来源:blog.csdn.net/weixin_44671737/
      自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

      深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

      因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

      既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

      由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

      如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

      img

      最后总结

      ActiveMQ+Kafka+RabbitMQ学习笔记PDF

      image.png

      • RabbitMQ实战指南

      image.png

      • 手写RocketMQ笔记

      image.png

      • 手写“Kafka笔记”

      image

      关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦
      《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
      4266840)]

      既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

      由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

      如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

      img

      最后总结

      ActiveMQ+Kafka+RabbitMQ学习笔记PDF

      [外链图片转存中…(img-y0QdoK6F-1713604266840)]

      • RabbitMQ实战指南

      [外链图片转存中…(img-jUKGGdTC-1713604266841)]

      • 手写RocketMQ笔记

      [外链图片转存中…(img-Ft318fX0-1713604266841)]

      • 手写“Kafka笔记”

      [外链图片转存中…(img-lgqGocnN-1713604266842)]

      关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦
      《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

    • 20
      点赞
    • 9
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值