Apache Solr 搜索自动完成

php

1个回答

写回答

12105zhzj

2025-07-09 16:40

+ 关注

Java
Java

Apache Solr 搜索自动完成

Apache Solr 是一个功能强大的开源搜索平台,提供了丰富的搜索功能和灵活的自定义选项。其中一个非常有用的功能是搜索自动完成,它可以根据用户的输入提示搜索建议,并实时显示可能的搜索结果。本文将介绍如何使用 Apache Solr 实现搜索自动完成,并提供案例代码。

准备工作

在开始之前,我们需要确保已经安装了 Apache Solr。可以从 Apache Solr 的官方网站下载最新版本,并根据官方文档进行安装和配置。

建立索引

首先,我们需要建立一个索引,以便 Solr 可以根据用户的输入进行搜索。在这个例子中,我们将以一个电子商务网站为例,建立一个产品名称的索引。

1. 创建一个名为 "products" 的新核心(Core)。

bin/solr create_core -c products

2. 在 Solr 管理界面中,选择 "products" 核心,并点击左侧菜单中的 "Schema" 进入模式编辑器。

3. 在模式编辑器中,添加一个新的字段 "name",并将其设置为 "text_general" 类型。

4. 保存并应用模式更改。

5. 使用 Solr API 将产品数据导入到索引中。假设我们有一个包含产品名称的 CSV 文件,每一行包含一个产品名称。

Java

import Java.io.BufferedReader;

import Java.io.FileReader;

import Java.io.IOException;

import org.apache.http.HttpEntity;

import org.apache.http.client.methods.CloseableHttpResponse;

import org.apache.http.client.methods.HttpPost;

import org.apache.http.entity.ContentType;

import org.apache.http.entity.StringEntity;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.solr.common.util.NamedList;

public class SolrIndexer {

private static final String SOLR_URL = "http://localhost:8983/solr/products/update?commit=true";

public static void mAIn(String[] args) {

try (CloseableHttpClient httpClient = HttpClients.createDefault()) {

HttpPost httpPost = new HttpPost(SOLR_URL);

httpPost.setHeader("Content-Type", "application/JSon");

StringBuilder JSon = new StringBuilder();

JSon.append("{\"add\": {\"doc\": [");

BufferedReader reader = new BufferedReader(new FileReader("products.csv"));

String line;

while ((line = reader.readLine()) != null) {

JSon.append("{\"name\": \"").append(line).append("\"},");

}

reader.close();

JSon.deleteCharAt(JSon.length() - 1);

JSon.append("]}}");

httpPost.setEntity(new StringEntity(JSon.toString(), ContentType.APPLICATION_JSON));

try (CloseableHttpResponse response = httpClient.execute(httpPost)) {

HttpEntity entity = response.getEntity();

NamedList<Object> result = new NamedList<>(); // 解析响应结果

result = SolrResponseParser.parse(entity.getcontent());

System.out.println(result);

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

实现搜索自动完成

现在我们已经建立了索引,可以开始实现搜索自动完成的功能。

1. 在 Solr 管理界面中,选择 "products" 核心,并点击左侧菜单中的 "Config" 进入配置编辑器。

2. 在配置编辑器中,找到 "Request Handlers" 部分,并添加一个新的请求处理程序。

XML

<requestHandler name="/suggest" class="solr.SearchHandler">

<lst name="defaults">

<str name="echoParams">explicit</str>

<str name="wt">JSon</str>

<str name="indent">true</str>

<str name="df">name</str>

<str name="fl">name</str>

<str name="rows">10</str>

<str name="sort">count desc</str>

<str name="group">true</str>

<str name="group.field">name</str>

</lst>

</requestHandler>

3. 保存并应用配置更改。

4. 使用 Solr API 发送搜索请求,并获取搜索建议。

Java

import Java.io.IOException;

import Java.util.ArrayList;

import Java.util.List;

import org.apache.http.HttpEntity;

import org.apache.http.client.methods.CloseableHttpResponse;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.CloseableHttpClient;

import org.apache.http.impl.client.HttpClients;

import org.apache.solr.common.util.NamedList;

import com.fasterXML.jackson.databind.JSonNode;

import com.fasterXML.jackson.databind.ObjectMapper;

public class SolrAutoComplete {

private static final String SOLR_URL = "http://localhost:8983/solr/products/suggest";

public static void mAIn(String[] args) {

try (CloseableHttpClient httpClient = HttpClients.createDefault()) {

HttpGet httpGet = new HttpGet(SOLR_URL + "?q=" + args[0]);

httpGet.setHeader("Content-Type", "application/JSon");

try (CloseableHttpResponse response = httpClient.execute(httpGet)) {

HttpEntity entity = response.getEntity();

NamedList<Object> result = new NamedList<>(); // 解析响应结果

result = SolrResponseParser.parse(entity.getcontent());

List<String> suggestions = new ArrayList<>();

ObjectMapper mapper = new ObjectMapper();

JSonNode responseNode = mapper.readTree(result.get("response").toString());

JSonNode groupNode = responseNode.get("grouped").get("name").get("groups");

for (JSonNode node : groupNode) {

suggestions.add(node.get("groupValue").asText());

}

System.out.println(suggestions);

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

案例代码解析

上述案例代码中,我们使用了 Apache Solr 提供的 Java 客户端库进行索引和搜索操作。在索引部分,我们读取了一个 CSV 文件,将每行作为一个产品名称,并通过 Solr API 将其添加到索引中。在搜索自动完成部分,我们发送了一个 GET 请求到 Solr API,根据用户的输入获取搜索建议,并将结果解析为一个字符串列表。

本文介绍了如何使用 Apache Solr 实现搜索自动完成的功能,并提供了相应的案例代码。通过使用 Solr 的强大搜索功能,我们可以为用户提供更好的搜索体验,帮助他们快速找到他们想要的内容。希望本文能够对您理解和使用 Apache Solr 有所帮助。

参考资料:

- Apache Solr 官方网站:https://lucene.apache.org/solr/

- Apache Solr 官方文档:https://lucene.apache.org/solr/guide/

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号