15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > 利用Elasticsearch 的java 客户端为网站开发一个搜索服务

利用Elasticsearch 的java 客户端为网站开发一个搜索服务

时间:2023-05-30 10:15:01 | 来源:网站运营

时间:2023-05-30 10:15:01 来源:网站运营

利用Elasticsearch 的java 客户端为网站开发一个搜索服务:Elasticsearch 是什么

百科上得描述,Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。

安装 Elasticsearch

在使用之前,我们需要安装Elasticsearch 服务,这里就不介绍如何去安装了,可以参考一些地址进行安装,本次测试使用得是 elasticsearch-6.2.3

https://www.elastic.co/guide/index.html

引入ES java client端包,注意客户包要和ES服务的版本一致,客户端也使用 6.2.3

<elasticsearch.version>6.2.3</elasticsearch.version><!--引入ES相关的包 --> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.elasticsearch.distribution.integ-test-zip</groupId> <artifactId>elasticsearch</artifactId> <type>zip</type> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>org.elasticsearch.plugin</groupId> <artifactId>transport-netty4-client</artifactId> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client</artifactId> <version>${elasticsearch.version}</version> <exclusions> <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-client</artifactId> <version>${elasticsearch.version}</version> </dependency>创建一个ES client 类

创建一个Java类,用去获取一个连接到 ES服务的客户端对象,通过这个对象可以操作ES的数据了,比如网ES添加数据,搜索数据。

public class EsClient { static RestHighLevelClient client; public static synchronized void initClint(){ if(client==null){ client = new RestHighLevelClient( RestClient.builder(new HttpHost("192.168.0.1", 9200, "http") )); } } public static RestHighLevelClient getClient(){ initClint(); return client; } public void closeClient(String s) { try { client.close(); } catch (IOException e) { e.printStackTrace(); } }}这边使用的 RestHighLevelClient 客户端和ES服务端进行通信,将 192.168.0.1 替换成自己的 ES 服务地址。

创建一个保存类

创建一个Java类,提供将内容保存到ES服务的方法

public class SaveClient { /** * 数据保存到es * @param text * @param fileName * @param id */ public static void save(String text,String fileName,String id){ Map<String, Object> jsonMap = new HashMap<>(); jsonMap.put("url", "http://127.0.0.1:9123/mdwiki.html#!"+fileName); jsonMap.put("postDate", new Date()); jsonMap.put("message", text); IndexRequest indexRequest = new IndexRequest("posts", "doc",id).source(jsonMap); try { EsClient.getClient().index(indexRequest); } catch (IOException e) { e.printStackTrace(); } }}关键代码:EsClient.getClient().index(indexRequest);

意思是通过 EsClient.getClient() 获取一个client , 调用 index方法,传递一个IndexRequest,将内容保存到ES

"posts" : 索引标识

"doc":索引类型

id:文档ID,类似关系表的标识列

读取内容写入到ES

本例做的是将本地的makedown 文本内容,替换掉特殊标签之后,保存到ES中,以下是一个写入的工具类

import java.io.File;import java.util.regex.Pattern;public class SaveContentTest { public static void main(String[] args) { //调用保存方法 setConent(); } /** * 读取目录下的makedown文件 */ public static void setConent(){ String pendingPath="E://mdwiki//mdwiki-0.6.2//"; File file = new File(pendingPath); File[] fileList = file.listFiles(); for(File fileOjb:fileList){ if (fileOjb.isFile()) { String name= fileOjb.getName(); String names[] = name.split("//."); if(names.length==2 && "md".equals( names[1].toLowerCase() ) ){ putEs(pendingPath,name,MD5Util.md5low(name)); } } } } /** * 将makedown文件通过正则替换掉特殊字符,然后保存到ES * @param pendingPath * @param fileName * @param id */ public static void putEs(String pendingPath,String fileName,String id){ ReadFileUtil readFileUtil=new ReadFileUtil(); String text= readFileUtil.read(pendingPath, fileName, new ReadFileUtil.FixLine() { @Override public String fixLine(String buff) { String jsonString=Pattern.compile(".*!//[.*?//]//(.*?//).*").matcher(buff).replaceAll(""); jsonString=Pattern.compile(".*//<iframe(.*?)><///iframe//>.*").matcher(jsonString).replaceAll(""); jsonString=jsonString.replaceAll("-",""); jsonString=jsonString.replaceAll("//*",""); jsonString=jsonString.replaceAll("`",""); jsonString=jsonString.replaceAll(">",""); jsonString=jsonString.replaceAll("=",""); return jsonString; } }); System.out.println(text); //数据添加ES SaveClient.save(text,fileName,id); }}创建一个搜索工具类

创建一个搜索工具类,根据关键字,返回匹配到的内容,本例是返回匹配到的前5行,并且将关键字符标黄,用于突出显示;匹配的一行内容可能会过长,这里截取了关键字位置的前100个字符和后100个字符

@Componentpublic class SearchClient { public String doSearch(String s) { //构建一个搜索对象 SearchRequest searchRequest = new SearchRequest("posts"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchPhraseQuery("message", s)); sourceBuilder.from(0); sourceBuilder.size(5); sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS)); searchRequest.source(sourceBuilder); SearchResponse searchResponse = null; try { searchResponse = EsClient.getClient().search(searchRequest); } catch (IOException e) { e.printStackTrace(); } StringBuilder bu=new StringBuilder(); bu.append("<div>"); SearchHits hits = searchResponse.getHits(); for (SearchHit hit : hits.getHits()) { String text= hit.getSourceAsString(); HtmlBean htmlBean= JsonUtils.convert2bean(text,HtmlBean.class); text=htmlBean.getMessage(); int indexOf= text.indexOf(s); int lastOf= text.lastIndexOf(s); int startIndex=(indexOf-100) < 0 ? 0 : indexOf-100 ; int lastIndex=(lastOf +100) > text.length() ? text.length() : lastOf+100 ; text=text.substring( startIndex,lastIndex); text= text.replaceAll(s,"<span style=/"background: yellow;/"> "+s+"</span>"); bu.append("<a href='"); bu.append(htmlBean.getUrl()); bu.append("'>"); bu.append(text); bu.append("</a>"); bu.append("</br>"); } bu.append("</div>"); return bu.toString(); } static class HtmlBean { private String postDate; private String message; private String url; public String getPostDate() { return postDate; } public void setPostDate(String postDate) { this.postDate = postDate; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } }}构建一个SearchController 提高http请求

在SearchController 中调用搜索方法,返回内容给前端,核心代码就算完成了

@Controllerpublic class SearchController { private static final Logger logger= LoggerFactory.getLogger(SearchController.class); @Autowired SearchClient searchClientStandardServiceImpl; @ResponseBody @RequestMapping(value = "/search") public String search(String text){ return searchClientStandardServiceImpl.doSearch(text); }}输入 http://127.0.0.1:9300/sync/search?text=控件

返回匹配到的内容



关键词:服务,利用

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭