You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenSearch Java客户端:如何查找指定ID文档的相似文档?

OpenSearch 通过文档ID查找相似文档的Java客户端实现

可以通过OpenSearch的more_like_this查询实现基于文档ID的相似文档搜索——该查询会分析指定文档的内容,返回与它语义/内容相似的其他文档。下面是使用OpenSearch Java客户端(2.x版本)的完整实用示例:

依赖配置

首先确保项目中引入OpenSearch Java客户端依赖(以Maven为例):

<dependency>
    <groupId>org.opensearch.client</groupId>
    <artifactId>opensearch-rest-client</artifactId>
    <version>2.12.0</version>
</dependency>
<dependency>
    <groupId>org.opensearch.client</groupId>
    <artifactId>opensearch-java</artifactId>
    <version>2.12.0</version>
</dependency>

完整代码示例

import org.opensearch.client.opensearch.OpenSearchClient;
import org.opensearch.client.opensearch.core.SearchRequest;
import org.opensearch.client.opensearch.core.SearchResponse;
import org.opensearch.client.opensearch.core.search.Hit;
import org.opensearch.client.opensearch.core.search.MoreLikeThisQuery;
import org.opensearch.client.transport.rest_client.RestClientTransport;
import org.opensearch.client.transport.json.JsonpMapper;
import org.opensearch.client.json.jackson.JacksonJsonpMapper;
import org.apache.http.HttpHost;
import org.opensearch.client.RestClient;

import java.io.IOException;
import java.util.List;

public class SimilarDocumentsSearch {
    public static void main(String[] args) throws IOException {
        // 初始化OpenSearch客户端
        RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200, "http")).build();
        JsonpMapper jsonpMapper = new JacksonJsonpMapper();
        OpenSearchClient client = new OpenSearchClient(new RestClientTransport(restClient, jsonpMapper));

        // 目标文档ID
        String targetDocId = "X";
        // 要返回的相似文档数量
        int similarCount = 10;
        // 你的索引名称
        String indexName = "your-target-index";
        // 指定用于相似性匹配的字段(比如标题、正文等text类型字段)
        List<String> matchFields = List.of("title", "content");

        // 构建more_like_this查询
        MoreLikeThisQuery moreLikeThisQuery = MoreLikeThisQuery.of(m -> m
                .ids(List.of(targetDocId)) // 指定基准文档ID
                .fields(matchFields) // 参与相似计算的字段
                .minTermFreq(1) // 忽略基准文档中出现次数少于该值的词
                .maxQueryTerms(20) // 生成相似查询的最大词数
                .exclude(true) // 排除基准文档本身
        );

        // 构建搜索请求
        SearchRequest searchRequest = SearchRequest.of(s -> s
                .index(indexName)
                .query(q -> q.moreLikeThis(moreLikeThisQuery))
                .size(similarCount)
        );

        // 执行查询并解析结果
        SearchResponse<YourDocumentPOJO> response = client.search(searchRequest, YourDocumentPOJO.class);

        // 遍历输出相似文档
        List<Hit<YourDocumentPOJO>> hits = response.hits().hits();
        for (Hit<YourDocumentPOJO> hit : hits) {
            System.out.println("相似文档ID: " + hit.id());
            System.out.println("相似度得分: " + hit.score());
            System.out.println("文档内容: " + hit.source());
            System.out.println("---");
        }

        // 关闭客户端资源
        restClient.close();
    }

    // 替换为你项目中对应的文档实体类
    static class YourDocumentPOJO {
        private String title;
        private String content;

        // getter、setter及toString方法自行补充
        public String getTitle() { return title; }
        public void setTitle(String title) { this.title = title; }
        public String getContent() { return content; }
        public void setContent(String content) { this.content = content; }

        @Override
        public String toString() {
            return "YourDocumentPOJO{" +
                    "title='" + title + '\'' +
                    ", content='" + content + '\'' +
                    '}';
        }
    }
}

关键参数说明

  • ids: 指定作为相似性基准的文档ID列表,这里传入单个目标ID即可
  • fields: 必须指定参与相似计算的text类型字段,OpenSearch会基于这些字段的词频、逆文档频率计算相似度
  • exclude: 设置为true可自动排除基准文档本身,避免出现在结果中
  • minTermFreq: 过滤基准文档中出现次数过少的词,减少无效匹配噪音
  • maxQueryTerms: 控制生成相似查询的词数,值越大结果精准度越高但可能影响查询性能

注意事项

  1. 确保参与匹配的字段是text类型并配置了合适的分词器,否则more_like_this无法有效分析内容
  2. 如果集群开启了身份验证,需在RestClient初始化时添加认证逻辑(比如BasicAuth)
  3. 可根据业务需求调整min_doc_freq、max_doc_freq等参数,优化相似结果的质量

内容的提问来源于stack exchange,提问作者Shadowman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:06:23