使用 Java 与 Elasticsearch IK 分词器实现搜索

在现代应用中,全面且灵活的搜索能力是不可或缺的。Elasticsearch 是一个基于 Lucene 的搜索引擎,能帮助我们构建强大的搜索功能。而 IK 分词器是 Elasticsearch 中用于中文分词的一个插件,它能有效处理中文文本。本文将引导你如何在 Java 中实现 IK 分词器的搜索。

流程概述

实施完整的搜索功能可以分为几个步骤,具体流程如下表所示:

步骤 说明
1. 环境搭建 安装 Elasticsearch 和 IK 分词器
2. 创建索引 在 Elasticsearch 中创建带有 IK 分词器的索引
3. 添加文档 将文档添加到索引中
4. 查询文档 使用 IK 分词器对文档进行搜索

具体步骤

1. 环境搭建

首先,确保你已安装Java(建议使用JDK 11及以上版本)。然后,安装Elasticsearch,并在其配置中添加IK分词器。

# 在elasticsearch.yml配置文件中添加以下内容
plugin.mandatory: ik-synonym

2. 创建索引

在代码中,实现一个创建索引的功能。以下是使用Java与Elasticsearch进行索引创建的示例代码:

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.common.xcontent.XContentType;

public class ElasticsearchClient {
    private static RestHighLevelClient client;

    public static void main(String[] args) {
        // 连接 Elasticsearch
        client = new RestHighLevelClient(
                RestClient.builder(
                        HttpHost.create("http://localhost:9200")));
        
        // 创建索引
        createIndex("example");
    }

    private static void createIndex(String index) {
        try {
            CreateIndexRequest request = new CreateIndexRequest(index);
            String mappings = "{ \"settings\": { \"analysis\": { \"analyzer\": { \"ik_analyzer\": { \"type\": \"ik_smart\" } } } }, \"mappings\": { \"properties\": { \"content\": { \"type\": \"text\", \"analyzer\": \"ik_analyzer\" } } } } }";
            request.source(mappings, XContentType.JSON);
            client.indices().create(request, RequestOptions.DEFAULT);
            System.out.println("Index created: " + index);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
注释:
  • 上述代码首先通过RestHighLevelClient连接到Elasticsearch服务。
  • 接着创建名为“example”的索引,并定义其存储文档的字段及分词器。

3. 添加文档

在创建好索引后,我们需要将文档存储到该索引中。下面是将文档添加到索引的代码示例:

import org.elasticsearch.action.index.IndexRequest;

private static void addDocument(String index, String id, String content) {
    try {
        IndexRequest request = new IndexRequest(index).id(id).source(XContentType.JSON, "content", content);
        client.index(request, RequestOptions.DEFAULT);
        System.out.println("Document added in index: " + index + " with id: " + id);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
注释:
  • IndexRequest用于创建一个存储文档的请求,在这里指定了索引名称和文档ID和内容。

4. 查询文档

最后,我们来实现搜索功能,使用IK分词器对文档进行查询。以下是查询文档的代码:

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.query.QueryBuilders;

private static void searchDocument(String index, String query) {
    try {
        SearchRequest searchRequest = new SearchRequest(index);
        searchRequest.source().query(QueryBuilders.matchQuery("content", query));
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println("Search Results: " + searchResponse.toString());
    } catch (Exception e) {
        e.printStackTrace();
    }
}
注释:
  • SearchRequest用来构建一个搜索请求,matchQuery方法用于根据内容字段执行模糊匹配搜索。

序列图

下面是整个流程的序列图,您可以使用mermaid语法渲染:

sequenceDiagram
    participant User
    participant JavaApp
    participant Elasticsearch

    User->>JavaApp: 1. 初始化Elasticsearch连接
    JavaApp->>Elasticsearch: 2. 创建索引
    User->>JavaApp: 3. 添加文档
    JavaApp->>Elasticsearch: 4. 存储文档
    User->>JavaApp: 5. 执行搜索
    JavaApp->>Elasticsearch: 6. 查询文档
    Elasticsearch-->>JavaApp: 7. 返回查询结果
    JavaApp-->>User: 8. 显示结果

结尾

通过以上步骤和代码示例,你应该能快速掌握如何在Java中利用Elasticsearch的IK分词器实现搜索功能。这个过程不仅包括了环境搭建、索引创建、文档添加,还包括了基本的文档搜索操作。随着对Elasticsearch的深入了解,你可以尝试更复杂的查询,优化索引设置,以满足实际项目的需求。牢记在于实践,不断尝试和改进,才能更好地掌握这一利器!