JSP 与 Elasticsearch 进行全文检索示例
随着互联网的快速发展,信息量的爆炸式增长,如何快速、准确地检索到所需信息成为了一个重要课题。全文检索技术应运而生,它能够对大量文本数据进行高效检索。Elasticsearch 是一个基于 Lucene 的开源全文搜索引擎,具有高性能、易扩展等特点。本文将结合 JSP(JavaServer Pages)技术,展示如何使用 Elasticsearch 实现一个简单的全文检索示例。
环境准备
在开始编写代码之前,我们需要准备以下环境:
1. JDK 1.8 或更高版本
2. Tomcat 8.5 或更高版本
3. Elasticsearch 6.x 或更高版本
4. Maven 3.6 或更高版本
项目结构
以下是项目的目录结构:
src
|-- main
| |-- java
| | |-- com
| | | |-- example
| | | | |-- ElasticsearchUtil.java
| | | | |-- SearchServlet.java
| |-- webapp
| |-- WEB-INF
| | |-- web.xml
| |-- index.jsp
1. ElasticsearchUtil 类
ElasticsearchUtil 类负责连接 Elasticsearch 集群,并提供基本的搜索功能。
java
package com.example;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.core.CountRequest;
import org.elasticsearch.client.core.CountResponse;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class ElasticsearchUtil {
private static final String HOST = "localhost";
private static final int PORT = 9200;
private static final String SCHEME = "http";
private static final String INDEX_NAME = "test_index";
private static final RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost(HOST, PORT, SCHEME)
)
);
public static void closeClient() throws IOException {
client.close();
}
public static Map<String, Object> search(String query) throws IOException {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("content", query));
searchSourceBuilder.fetchSource(new FetchSourceContext(true, new String[]{"title", "content"}, null));
searchSourceBuilder.highlighter(new HighlightBuilder().field("content").preTags("<em>").postTags("</em>"));
CountRequest countRequest = new CountRequest(INDEX_NAME);
countRequest.query(QueryBuilders.matchQuery("content", query));
CountResponse countResponse = client.count(countRequest, RequestOptions.DEFAULT);
int count = countResponse.getCount();
SearchResponse searchResponse = client.search(searchSourceBuilder.request(), RequestOptions.DEFAULT);
Map<String, Object> result = new HashMap<>();
result.put("count", count);
result.put("hits", searchResponse.getHits().getHits());
return result;
}
}
2. SearchServlet 类
SearchServlet 类负责处理 JSP 页面的搜索请求,并返回搜索结果。
java
package com.example;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
@WebServlet("/search")
public class SearchServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String query = req.getParameter("query");
Map<String, Object> result = ElasticsearchUtil.search(query);
req.setAttribute("result", result);
req.getRequestDispatcher("/index.jsp").forward(req, resp);
}
}
3. web.xml 配置
在 `web.xml` 文件中,我们需要配置 SearchServlet。
xml
<web-app>
<servlet>
<servlet-name>SearchServlet</servlet-name>
<servlet-class>com.example.SearchServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SearchServlet</servlet-name>
<url-pattern>/search</url-pattern>
</servlet-mapping>
</web-app>
4. index.jsp 页面
index.jsp 页面用于展示搜索结果。
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>全文检索示例</title>
</head>
<body>
<form action="search" method="get">
<input type="text" name="query" placeholder="请输入搜索内容">
<input type="submit" value="搜索">
</form>
<h1>搜索结果(共 ${result.count} 条):</h1>
<ul>
<%
for (SearchHit hit : (List<SearchHit>) result.get("hits")) {
String title = hit.getSource().get("title").toString();
String content = hit.getSource().get("content").toString();
String highlightedContent = hit.getHighlightFields().get("content").get(0).getFragments()[0].toString();
%>
<li>
<h2><a href="${title}">${title}</a></h2>
<p>${highlightedContent}</p>
</li>
<%
}
%>
</ul>
</body>
</html>
总结
本文通过 JSP 和 Elasticsearch 实现了一个简单的全文检索示例。在实际应用中,可以根据需求对代码进行扩展和优化,例如添加分页、排序、过滤等功能。希望本文能对您有所帮助。
Comments NOTHING