Link Search Menu Expand Document Documentation Menu

搜索(gRPC)

3.0 版本引入

这是一项实验性功能,不建议在生产环境中使用。有关该功能的进展更新或您想留下反馈,请参阅相关的GitHub issue

gRPC 搜索 API 提供了一个高性能的二进制接口,用于通过 gRPC 使用协议缓冲区运行查询。它复制了 HTTP 搜索 API 的功能,同时受益于 protobuf 类型契约和 gRPC 传输。gRPC API 是低延迟、高吞吐量应用的理想选择。

先决条件

要提交 gRPC 请求,您必须在客户端拥有 protobuf 集合。有关获取 protobuf 的方法,请参阅使用 gRPC API

gRPC 服务和方法

gRPC 文档 API 位于 SearchService 中。

您可以通过调用 SearchService 中的 Search gRPC 方法来提交搜索请求。该方法接受一个 SearchRequest 并返回一个 SearchResponse

目前,仅支持以下基本查询:match_alltermtermsmatch_none。未来的版本将支持更多查询类型。

请求字段

gRPC 搜索 API 支持以下请求字段。

SearchRequest 字段

SearchRequest 消息接受以下字段。所有字段都是可选的。

字段 Protobuf 类型 描述
index repeated string 要搜索的索引列表。如果未提供,则默认为所有索引。
source SourceConfigParam 控制响应中是否返回完整的 _source、不返回 _source,或仅返回 _source 中的特定字段。
source_excludes repeated string 要从 _source 中排除的字段。如果 sourcefalse,则忽略。
source_includes repeated string 要包含在 _source 中的字段。如果 sourcefalse,则忽略。
allow_no_indices bool 是否忽略不匹配任何索引的通配符。默认为 true
allow_partial_search_results bool 是否在出错或超时时返回部分结果。默认为 true
analyze_wildcard bool 是否分析通配符/前缀查询。默认为 false
分析器 字符串 q 查询字符串一起使用的分析器。
batched_reduce_size int32 在节点上要减少的分片数量。默认为 512
cancel_after_time_interval 字符串 请求将被取消的时间。默认为 -1
ccs_minimize_roundtrips bool 是否最小化节点和远程集群之间的往返次数。默认为 true
default_operator 运算符 查询字符串的默认运算符。有效值为 ANDOR。默认为 OR
df 字符串 不带字段前缀的查询字符串的默认字段。
docvalue_fields repeated string 要作为 doc values 返回的字段。
expand_wildcards repeated ExpandWildcard 指定通配符表达式可以匹配的索引类型。有效值为 all(匹配任何索引)、open(匹配开放的非隐藏索引)、closed(匹配关闭的非隐藏索引)、hidden(匹配隐藏索引)和 none(拒绝通配符表达式)。默认为 open
explain bool 是否返回文档得分计算详情。默认为 false
from int32 分页结果的起始索引。默认为 0
ignore_throttled bool 在解析别名时是否忽略冻结索引。默认为 true
ignore_unavailable bool 是否忽略不可用的索引或分片。默认为 false
include_named_queries_score bool 是否包含命名查询的得分。默认为 false
lenient bool 是否接受查询中的格式错误。默认为 false
max_concurrent_shard_requests int32 每个节点的并发分片请求数。默认为 5
phase_took bool 是否返回阶段级别的 took 值。默认为 false
pre_filter_shard_size int32 触发按分片大小进行预过滤的阈值。默认为 128
preference 字符串 查询执行的分片或节点偏好设置。
q 字符串 采用 Lucene 语法的查询字符串。
request_cache bool 是否使用请求缓存。默认为索引的设置。
rest_total_hits_as_int bool 是否将总匹配数作为整数返回。默认为 false
路由 repeated string 用于将请求路由到特定分片的值。
scroll 字符串 为滚动保持搜索上下文存活的时间量。
search_pipeline 字符串 要使用的搜索管道名称。
search_type SearchType 计算相关性得分的方法。有效值为 QUERY_THEN_FETCHDFS_QUERY_THEN_FETCH。默认为 QUERY_THEN_FETCH
seq_no_primary_term bool 是否返回序列号和主术语。
size int32 要返回的结果数量。
sort(排序) repeated SortOrder 排序结果所依据的字段和方向。
stats repeated string 与请求关联用于日志记录的标签。
stored_fields repeated string 要包含在响应中的存储字段列表。
suggest_field 字符串 生成建议所依据的字段。
suggest_mode SuggestMode 建议模式(例如,alwaysmissingpopular)。
suggest_size int32 要返回的建议数量。
suggest_text 字符串 用于生成建议的输入文本。
terminate_after int32 在提前终止前要处理的最大匹配文档数(命中数)。默认为 0
timeout 字符串 等待查询执行的最大时间量。默认为 1m
track_scores bool 是否返回文档得分。默认为 false
track_total_hits TrackHits 是否包含总命中元数据。
typed_keys bool 是否在聚合和建议键中包含类型信息。默认为 true
verbose_pipeline bool 是否为搜索管道启用详细模式。
version bool 是否在响应中返回文档版本。
request_body SearchRequestBody 主要的搜索请求负载,包括查询和过滤器。

SearchRequestBody 字段

SearchRequestBody 消息接受以下字段。所有字段都是可选的。

字段 Protobuf 类型 描述
collapse FieldCollapse 按字段对结果进行分组。每组只返回顶部文档。
explain bool 返回匹配文档的评分解释。
ext ObjectMap 特定于插件的元数据,例如,用于 RAG 等扩展。
from int32 分页结果的起始索引。默认为 0
highlight Highlight 在结果片段中高亮显示匹配的术语。
track_total_hits TrackHits 是否返回总命中数。
indices_boost repeated NumberMap <index>: <boost> 格式表示的每个索引的提升乘数。
docvalue_fields repeated FieldAndFormat 使用文档值返回的字段,可选地进行格式化。
min_score 浮点型 文档包含在结果中所需的最低得分。
post_filter QueryContainer 在应用聚合后过滤命中。
profile bool 启用性能分析以分析查询性能。
search_pipeline 字符串 要应用的搜索管道名称。
verbose_pipeline bool 在搜索管道中启用详细日志记录。
query QueryContainer 用于搜索的查询领域特定语言 (DSL)。
rescore repeated Rescore 重新排序前 N 个命中以提高精确度。
script_fields map<string, ScriptField> 其值由脚本计算的自定义字段。
search_after repeated FieldValue 使用上一页的值进行基于游标的分页。
size int32 要返回的结果数量。默认为 10
slice SlicedScroll 将滚动上下文拆分为切片以进行并行处理。
sort(排序) repeated SortCombinations 排序规则(例如,按字段、得分或自定义顺序)。
source SourceConfig 控制响应中是否返回完整的 _source、不返回 _source,或仅返回 _source 中的特定字段。
fields repeated FieldAndFormat 要返回的附加字段,带格式选项。
suggest Suggester 用于自动完成或更正的建议查询。
terminate_after int32 在提前终止前要处理的最大匹配文档数(命中数)。默认为 0
timeout 字符串 等待查询执行的最大时间量。
track_scores bool 是否在结果中返回文档得分。
include_named_queries_score bool 是否包含命名查询的得分。
version bool 是否在响应中包含文档版本。
seq_no_primary_term bool 是否包含每个命中的序列号和主术语。
stored_fields repeated string 要返回的存储字段(除非重新启用,否则不包括 _source)。
pit PointInTimeReference 用于搜索固定快照的时间点引用。
stats repeated string 与请求关联的标签或日志字段。
derived map<string, DerivedField> 响应中动态计算的字段。

QueryContainer 字段

QueryContainer 是所有支持的查询类型的入口点。

每个 QueryContainer 消息中**必须且只能**提供以下字段之一。

请注意,某些查询类型目前不受支持。目前仅支持 match_alltermtermsmatch_none

字段 Protobuf 类型 描述
bool BoolQuery 一个布尔查询,使用 AND/OR/NOT 逻辑组合多个子句。必须是唯一设置的字段。
boosting BoostingQuery 提升匹配正向查询的结果,并降低匹配负向查询的结果。必须是唯一设置的字段。
constant_score ConstantScoreQuery 封装一个过滤器,并为所有匹配文档分配一个恒定的相关性得分。必须是唯一设置的字段。
dis_max DisMaxQuery 返回匹配任一子句的文档。如果多个子句匹配,则使用最高得分。必须是唯一设置的字段。
function_score FunctionScoreQuery 使用自定义函数调整结果的得分。必须是唯一设置的字段。
exists ExistsQuery 匹配包含特定字段的文档。必须是唯一设置的字段。
fuzzy map<string, FuzzyQuery> 匹配与搜索词相似的词元(模糊匹配)。只允许一个条目。必须是唯一设置的字段。
ids IdsQuery _id 值匹配文档。必须是唯一设置的字段。
prefix(前缀) map<string, PrefixQuery> 匹配具有特定前缀的词元。只允许一个条目。必须是唯一设置的字段。
range map<string, RangeQuery> 匹配指定范围内的词元。只允许一个条目。必须是唯一设置的字段。
regexp map<string, RegexpQuery> 使用正则表达式匹配词元。只允许一个条目。必须是唯一设置的字段。
term map<string, TermQuery> 匹配精确词元(无分析)。只允许一个条目。必须是唯一设置的字段。
terms TermsQueryField 匹配包含字段中一个或多个指定词元的任何文档。必须是唯一设置的字段。
terms_set map<string, TermsSetQuery> 匹配字段中包含最少数量精确词元的文档。只允许一个条目。必须是唯一设置的字段。
wildcard map<string, WildcardQuery> 使用通配符模式匹配词元。只允许一个条目。必须是唯一设置的字段。
match map<string, MatchQueryTypeless> 对文本或精确值字段进行全文匹配。只允许一个条目。必须是唯一设置的字段。
match_bool_prefix map<string, MatchBoolPrefixQuery> 在布尔型查询中匹配完整单词和前缀。只允许一个条目。必须是唯一设置的字段。
match_phrase map<string, MatchPhraseQuery> 按顺序匹配精确短语。只允许一个条目。必须是唯一设置的字段。
match_phrase_prefix map<string, MatchPhrasePrefixQuery> 匹配一个短语,其中最后一个词被视为前缀。只允许一个条目。必须是唯一设置的字段。
multi_match MultiMatchQuery 使用单个查询字符串搜索多个字段。必须是唯一设置的字段。
query_string QueryStringQuery 解析作为单个字符串编写的高级查询。必须是唯一设置的字段。
simple_query_string SimpleQueryStringQuery 一种比 query_string 语法更宽松的替代方案。忽略无效语法。必须是唯一设置的字段。
间隔 (intervals) map<string, IntervalsQuery> 根据位置/邻近度匹配词项。只允许一个条目。必须是唯一设置的字段。
knn map<string, KnnField> 对向量字段执行 k-NN 查询。只允许一个条目。必须是唯一设置的字段。
match_all MatchAllQuery 匹配索引中的所有文档。必须是唯一设置的字段。
match_none MatchNoneQuery 不匹配任何文档。必须是唯一设置的字段。
script_score ScriptScoreQuery 使用脚本应用自定义评分。必须是唯一设置的字段。
nested NestedQuery 包装一个针对嵌套字段的查询。必须是唯一设置的字段。

支持的查询

gRPC 搜索 API 支持以下查询。

以下所有示例都展示了可发送到 SearchService/Search gRPC 方法的有效请求负载。

匹配所有查询

一个 match_all 查询返回索引中的所有文档。例如,以下请求从索引中返回最多 50 个文档

{
  "request_body": {
    "query": {
      "match_all": {}
    },
    "size": 50
  }
}

词语查询

一个 term 查询匹配单个字段中的特定词项。例如,以下查询搜索包含单词 Rush 的标题

{
  "index": "my_index",
  "request_body": {
    "query": {
      "term": {
        "title": {
          "value": {
            "string_value": "Rush"
          },
          "case_insensitive": true
        }
      }
    }
  }
}

词项查询

一个 terms 查询匹配特定字段包含列表中任何值的文档。例如,以下查询搜索 ID 为 6180961810 的行

{
 "request_body": {
   "query": {
     "terms": {
       "terms_lookup_field_string_array_map": {
         "line_id": {
           "string_array": {
             "string_array": [
               "61809",
                    "61810"
             ]
           }
         }
       }
     }
   }
 }
}

带有词项查找的词项查询

terms 查找的 terms 查询是 terms 查询的一种特殊形式,它允许您从集群中的另一个文档中获取用于过滤的词项,而不是直接在查询中指定它们。例如,以下请求匹配 students 索引中所有 idenrolled 数组中某个值匹配的学生文档

{
  "request_body": {
    "query": {
      "terms": {
        "boost": 1.0,
        "terms_lookup_field_string_array_map": {
          "student_id": {
            "terms_lookup_field": {
              "index": "classes",
              "id": "101",
              "path": "enrolled"
            }
          }
        }
      }
    }
  }
}

不匹配任何查询

一个 match_none 查询不匹配任何文档

{
  "request_body": {
    "query": {
      "match_none": {}
    }
  }
}

响应字段

gRPC 搜索 API 提供以下响应字段。

SearchResponse 字段

下表列出了 SearchResponse 消息支持的字段。

字段 Protobuf 类型 描述
response_body ResponseBody 搜索响应的实际负载。

ResponseBody 字段

ResponseBody 包含以下字段。

源文档以字节形式返回。使用 Base64 解码来读取 gRPC 响应中的 _source 字段。

字段 Protobuf 类型 描述
took int64 处理搜索请求所花费的时间,单位为毫秒。
timed_out bool 搜索是否超时。
分片 ShardStatistics 分片级别的成功/失败/总计元数据。
phase_took PhaseTook 响应中的阶段级别 took 时间值。
hits HitsMetadata 主要的文档结果和元数据。
profile 分析 查询执行的分析数据(调试/性能洞察)。
fields ObjectMap 响应中的顶层键值字段结构(如果有)。

HitsMetadata 字段

HitsMetadata 对象包含有关搜索结果的信息,包括匹配文档的总数和单个文档匹配的数组。它包含以下字段。

字段 Protobuf 类型 描述
total TotalHits 关于匹配文档总数的元数据(值 + 关系)。
max_score MaxScore 返回命中项的最高相关性得分(可能为 null)。
hits repeated Hit 匹配文档的实际列表。每个命中项包括 indexidscoresource 等核心字段,以及其他可选字段。

命中字段

每个 Hit 代表查询匹配的单个文档,并包含以下字段。

字段 Protobuf 类型 描述
index 字符串 包含返回文档的索引名称。
id 字符串 文档在索引中的唯一 ID。
score Score 命中项的相关性得分。
解释 Explanation 关于 _score 如何计算的文本解释。
fields ObjectMap 文档字段值。
highlight map<string, StringArray> 每个命中项的突出显示字段和片段。
inner_hits map<string, InnerHitsResult> 来自不同作用域的匹配嵌套文档,它们有助于整体查询结果。
matched_queries repeated string 匹配文档的查询名称列表。
nested NestedIdentity 命中项源自的内部嵌套对象的路径。
ignored repeated string 被忽略字段的列表。
ignored_field_values map<string, StringArray> 文档原始 JSON 中未经处理的原始值。
shard 字符串 检索到命中项的分片 ID。
node 字符串 检索到命中项的节点 ID。
路由 字符串 用于自定义分片路由的路由值。
source bytes(字节) Base64 编码的 _source 文档。
seq_no int64 序列号(用于索引历史和版本控制)。
primary_term int64 主词项号(用于乐观并发控制)。
version int64 文档版本号。
sort(排序) repeated FieldValue 用于结果排序的排序值。
meta_fields ObjectMap 文档的元数据值。

source 经过 Base64 编码,必须解码才能获取 JSON 文档。

示例响应

{
  "responseBody": {
    "took": "64",
    "timedOut": false,
    "shards": {
      "successful": 1,
      "total": 1
    },
    "hits": {
      "total": {
        "totalHits": {
          "relation": "TOTAL_HITS_RELATION_EQ",
          "value": "1"
        }
      },
      "hits": [
        {
          "index": "my_index",
          "id": "3",
          "score": {
            "floatValue": 1
          },
          "source": "eyAidGl0bGUiOiAiUnVzaCIsICJ5ZWFyIjogMjAxM30=",
          "metaFields": {}
        }
      ],
      "maxScore": {
        "floatValue": 1
      }
    }
  }
}

Java gRPC 客户端示例

以下示例展示了一个 Java 客户端程序,它提交一个示例搜索词项查询 gRPC 请求,然后打印搜索响应中返回的命中数

import org.opensearch.protobufs.*;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;

public class SearchClient {
    public static void main(String[] args) {
        ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 9400)
            .usePlaintext()
            .build();

        SearchServiceGrpc.SearchServiceBlockingStub stub = SearchServiceGrpc.newBlockingStub(channel);

        Query query = Query.newBuilder()
            .setTerm(TermQuery.newBuilder().setField("director").setValue("Nolan"))
            .build();

        SearchRequest request = SearchRequest.newBuilder()
            .addIndex("movies")
            .setQuery(query)
            .setSize(5)
            .build();

        SearchResponse response = stub.search(request);
        System.out.println("Found hits: " + response.getHits().getTotal());
        channel.shutdown();
    }
}