基于 ElasticSearch 实现站内全文搜索,写得太好了

这篇具有很好参考价值的文章主要介绍了基于 ElasticSearch 实现站内全文搜索,写得太好了。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 搜索引擎服务使用ElasticSearch

  • 提供的对外web服务选则springboot web

1.1 ElasticSearch

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。1

现在开源的搜索引擎在市面上最常见的就是ElasticSearch和Solr,二者都是基于Lucene的实现,其中ElasticSearch相对更加重量级,在分布式环境表现也更好,二者的选则需考虑具体的业务场景和数据量级。对于数据量不大的情况下,完全需要使用像Lucene这样的搜索引擎服务,通过关系型数据库检索即可。

1.2 springBoot

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”.2

现在springBoot在做web开发上是绝对的主流,其不仅仅是开发上的优势,在布署,运维各个方面都有着非常不错的表现,并且spring生态圈的影响力太大了,可以找到各种成熟的解决方案。

1.3 ik分词器

elasticSearch本身不支持中文的分词,需要安装中文分词插件,如果需要做中文的信息检索,中文分词是基础,此处选则了ik,下载好后放入elasticSearch的安装位置的plugin目录即可。

2 环境准备


需要安装好elastiSearch以及kibana(可选),并且需要lk分词插件。

  • 安装elasticSearch elasticsearch官网. 笔者使用的是7.5.1。

  • ik插件下载 ik插件github地址. 注意下载和你下载elasticsearch版本一样的ik插件。

  • 将ik插件放入elasticsearch安装目录下的plugins包下,新建报名ik,将下载好的插件解压到该目录下即可,启动es的时候会自动加载该插件。

es实现站内搜索,程序员,elasticsearch,大数据,搜索引擎

  • 搭建springboot项目 idea ->new project ->spring initializer

es实现站内搜索,程序员,elasticsearch,大数据,搜索引擎

3 项目架构


  • 获取数据使用ik分词插件

  • 将数据存储在es引擎中

  • 通过es检索方式对存储的数据进行检索

  • 使用es的java客户端提供外部服务

es实现站内搜索,程序员,elasticsearch,大数据,搜索引擎

4 实现效果


4.1 搜索页面

简单实现一个类似百度的搜索框即可。

es实现站内搜索,程序员,elasticsearch,大数据,搜索引擎

4.2 搜索结果页面

es实现站内搜索,程序员,elasticsearch,大数据,搜索引擎

点击第一个搜索结果是我个人的某一篇博文,为了避免数据版权问题,笔者在es引擎中存放的全是个人的博客数据。

es实现站内搜索,程序员,elasticsearch,大数据,搜索引擎

5 具体代码实现


5.1 全文检索的实现对象

按照博文的基本信息定义了如下实体类,主要需要知道每一个博文的url,通过检索出来的文章具体查看要跳转到该url。

package com.lbh.es.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;

import javax.persistence.*;

/**

  • PUT articles

  • {

  • “mappings”:

  • {“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”},

  • “url”:{“type”:“text”}

  • } },

  • “settings”:{

  • "index":{
    
  •   "number_of_shards":1,
    
  •   "number_of_replicas":2
    
  • }
    
  • }

  • }


  • Copyright©lbhbinhao@163.com

  • @author liubinhao

  • @date 2021/3/3

*/

@Entity

@Table(name = “es_article”)

public class ArticleEntity {

@Id

@JsonIgnore

@GeneratedValue(strategy = GenerationType.IDENTITY)

private long id;

@Column(name = “author”)

private String author;

@Column(name = “content”,columnDefinition=“TEXT”)

private String content;

@Column(name = “title”)

private String title;

@Column(name = “createDate”)

private String createDate;

@Column(name = “url”)

private String url;

public String getAuthor() {

return author;

}

public void setAuthor(String author) {

this.author = author;

}

public String getContent() {

return content;

}

public void setContent(String content) {

this.content = content;

}

public String getTitle() {

return title;

}

public void setTitle(String title) {

this.title = title;

}

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 业务代码编写

包括一些检索文章的信息,可以从文章标题,文章内容以及作者信息这些维度来查看相关信息。

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”}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

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

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。es实现站内搜索,程序员,elasticsearch,大数据,搜索引擎

es实现站内搜索,程序员,elasticsearch,大数据,搜索引擎

es实现站内搜索,程序员,elasticsearch,大数据,搜索引擎

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

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

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

es实现站内搜索,程序员,elasticsearch,大数据,搜索引擎

言尽于此,完结

无论是一个初级的 coder,高级的程序员,还是顶级的系统架构师,应该都有深刻的领会到设计模式的重要性。

  • 第一,设计模式能让专业人之间交流方便,如下:

程序员A:这里我用了XXX设计模式

程序员B:那我大致了解你程序的设计思路了

  • 第二,易维护

项目经理:今天客户有这样一个需求…

程序员:明白了,这里我使用了XXX设计模式,所以改起来很快

  • 第三,设计模式是编程经验的总结

程序员A:B,你怎么想到要这样去构建你的代码

程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题

  • 第四,学习设计模式并不是必须的

程序员A:B,你这段代码使用的是XXX设计模式对吗?

程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的

es实现站内搜索,程序员,elasticsearch,大数据,搜索引擎

从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!

es实现站内搜索,程序员,elasticsearch,大数据,搜索引擎

搜集费时费力,能看到此处的都是真爱!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
第一,设计模式能让专业人之间交流方便,如下:

程序员A:这里我用了XXX设计模式

程序员B:那我大致了解你程序的设计思路了

  • 第二,易维护

项目经理:今天客户有这样一个需求…

程序员:明白了,这里我使用了XXX设计模式,所以改起来很快

  • 第三,设计模式是编程经验的总结

程序员A:B,你怎么想到要这样去构建你的代码

程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题

  • 第四,学习设计模式并不是必须的

程序员A:B,你这段代码使用的是XXX设计模式对吗?

程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的

[外链图片转存中…(img-nrz3GOnM-1711933868009)]

从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!

[外链图片转存中…(img-Sah5EZMT-1711933868010)]

搜集费时费力,能看到此处的都是真爱!
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!文章来源地址https://www.toymoban.com/news/detail-859293.html

到了这里,关于基于 ElasticSearch 实现站内全文搜索,写得太好了的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Es elasticsearch 二十 站内搜索示例 高亮内容 java springboot 实现

    目录 实现思路 代码 全依赖 参数对象 搜索实现代码全代码 日志 重点 权重 分页 入参高亮数据处理 返回出参数据处理 构建请求 请求体设置搜索字段 返回数据解析获取高亮 高亮通过设置标签和class  前端设置class字体颜色 也可直接写在后端   全依赖 参数对象 搜索实现代码

    2024年02月02日
    浏览(38)
  • Spring Boot 项目设计业务操作日志功能,写得太好了!

    很久以前都想写这篇文章,一直没有空,但直到现在我对当时的情景还有印象,之所以有印象是因为需求很简单,业务操作日志的记录与查询的功能,但是具体实现真的很烂,具体的烂法会在反面示例里细说,领导以及客户层面很认可,一系列迷之操作,让我印象深刻。 客户

    2024年02月11日
    浏览(31)
  • 京东一面:分布式 ID 生成方案怎么选?写得太好了!

    在分布式系统中,经常需要用到全局唯一ID发生器,标识需要存储的数据。我们需要什么样的ID生成器? ID生成器除了是数据的唯一标识以外,一般需要在系统中承担更多的责任,概括起来有以下几点: 唯一性:“全局唯一” vs “业务唯一”? 分布式系统使用唯一的ID生成器

    2024年02月08日
    浏览(38)
  • Elasticsearch实现全文搜索的步骤和实现原理

    ElasticSearch(简称为ES)是一个基于开源的分布式搜索和分析引擎,它提供了强大的全文搜索、结构化查询、实时数据分析和可视化等功能。它是建立在 Apache Lucene 搜索引擎库之上的,并且通过 RESTful API 提供了简单易用的接口。 以下是 ElasticSearch 的一些主要特点: 分布式架构

    2024年02月06日
    浏览(28)
  • SpringBoot封装Elasticsearch搜索引擎实现全文检索

    注:本文实现了Java对Elasticseach的分页检索/不分页检索的封装 ES就不用过多介绍了,直接上代码: 创建Store类(与ES字段对应,用于接收ES数据) Elasticsearch全文检索接口:不分页检索 Elasticsearch全文检索接口:分页检索 本文实现了Java对Elasticsearch搜索引擎全文检索的封装 传入

    2024年02月04日
    浏览(34)
  • fastapi结合Manticore Search、elasticsearch、mysql实现全文搜索

    创建测试表 测试表插入数据 表字段描述 字段意义 mysql数据同步到es es查看数据(Elasticvue插件)   mysql数据同步到Manticore 注:Manticore 和 Mysql 使用pymysql即mysql客户端 Manticore 数据查询(工具Webyog SQLyog)   es安全认证连接(参考官网) 按fields查询方法封装,输入参数fields 筛选器,

    2024年02月12日
    浏览(34)
  • 基于Java的新闻全文搜索引擎的设计与实现

    中文摘要 本文以学术研究为目的,针对新闻行业迫切需求和全文搜索引擎技术的优越性,设计并实现了一个针对新闻领域的全文搜索引擎。该搜索引擎通过Scrapy网络爬虫工具获取新闻页面,将新闻内容存储在分布式存储系统HBase中,并利用倒排索引及轮排索引等索引技术对新

    2024年02月14日
    浏览(38)
  • Elasticsearch(十四)搜索---搜索匹配功能⑤--全文搜索

    不同于之前的term。terms等结构化查询,全文搜索首先对查询词进行分析,然后根据查询词的分词结果构建查询。这里所说的全文指的是文本类型数据(text类型),默认的数据形式是人类的自然语言,如对话内容、图书名称、商品介绍和酒店名称等。结构化搜索关注的是数据是

    2024年02月11日
    浏览(40)
  • 【Elasticsearch】全文搜索

    全文搜索是ES的关键特性之一,平时我们使用SQL的like语句,搜索一些文本、字符串是否包含指定的,但是如果两篇文章,都包含我们的,具体那篇文章内容的相关度更高? 这个SQL的like语句是做不到的,更别说like语句的性能问题了。 ES通过分词处理、相关度计算

    2024年02月09日
    浏览(33)
  • SpringBoot Elasticsearch全文搜索

    全文搜索(检索),工作原理:计算机索引程序,扫描文章中的每一个词,对每一个词建立一个索引,指明出现次数和位置。查询时通过索引进行查找,类似于查字典。 因为是通过索引在查,速度较于通过sql查,会快很多。 具体过程如下: 1、建文本库 2、建立索引 3、执行

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包