jsp 语言 JSP 与 Elasticsearch 进行全文检索示例

JSP阿木 发布于 14 天前 4 次阅读


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 实现了一个简单的全文检索示例。在实际应用中,可以根据需求对代码进行扩展和优化,例如添加分页、排序、过滤等功能。希望本文能对您有所帮助。