向量查询
edit向量查询
edit向量查询是专门用于向量字段的查询,能够高效地执行语义搜索。
-
knnquery -
一个查询,用于查找与查询向量最接近的 k 个向量,适用于
dense_vector字段,通过相似性度量来衡量。 -
sparse_vectorquery -
用于搜索
sparse_vector字段类型的查询。 -
semanticquery -
一个允许您在
semantic_text字段上执行语义搜索的查询。
已弃用的向量查询
edit以下查询已被弃用,并将在不久的将来被移除。
请改用sparse_vector 查询。
-
text_expansionquery -
一个允许您在
sparse_vector或rank_features字段上执行稀疏向量搜索的查询。 -
weighted_tokensquery - 允许执行优化性能的文本扩展查询。
Knn 查询
edit查找与查询向量最接近的 k 个向量,通过相似性度量进行测量。knn 查询通过索引的 dense_vectors 上的近似搜索找到最近的向量。进行近似 kNN 搜索的首选方法是使用搜索请求的 kNN 搜索部分。knn 查询保留给专家案例,在这些案例中需要将此查询与其他查询结合使用。
示例请求
editPUT my-image-index
{
"mappings": {
"properties": {
"image-vector": {
"type": "dense_vector",
"dims": 3,
"index": true,
"similarity": "l2_norm"
},
"file-type": {
"type": "keyword"
},
"title": {
"type": "text"
}
}
}
}
-
索引您的数据。
POST my-image-index/_bulk?refresh=true { "index": { "_id": "1" } } { "image-vector": [1, 5, -20], "file-type": "jpg", "title": "mountain lake" } { "index": { "_id": "2" } } { "image-vector": [42, 8, -15], "file-type": "png", "title": "frozen lake"} { "index": { "_id": "3" } } { "image-vector": [15, 11, 23], "file-type": "jpg", "title": "mountain lake lodge" } -
使用
knn查询运行搜索,从每个分片请求前10个最近的向量,然后将分片结果合并以获得前3个全局结果。POST my-image-index/_search { "size" : 3, "query" : { "knn": { "field": "image-vector", "query_vector": [-5, 9, -12], "k": 10 } } }
用于knn的顶级参数
edit-
field -
(必需,字符串) 要搜索的向量字段的名称。必须是启用了索引的
dense_vector字段。 -
query_vector -
(可选, 浮点数数组或字符串) 查询向量。必须与您正在搜索的向量字段具有相同的维度数量。必须是浮点数数组或十六进制编码的字节向量。必须提供此项或
query_vector_builder。 -
query_vector_builder -
(可选, 对象) 查询向量构建器。 一个配置对象,指示如何在执行请求之前构建查询向量。你必须提供一个
query_vector_builder或query_vector,但不能同时提供两者。请参阅执行语义搜索以了解更多信息。 -
k -
(可选, 整数) 每个分片返回的最近邻数量。 Elasticsearch 从每个分片收集
k个结果, 然后合并它们以找到全局最优结果。 此值必须小于或等于num_candidates。默认为num_candidates。 -
num_candidates -
(可选,整数) 在进行knn搜索时,每个分片要考虑的最近邻候选数量。不能超过10,000。增加
num_candidates通常会提高最终结果的准确性。 默认值为1.5 * k(如果设置了k),或者1.5 * size(如果未设置k)。 -
filter -
(可选,查询对象) 用于过滤可以匹配的文档的查询。 kNN 搜索将返回也匹配此过滤器的顶部文档。 值可以是一个查询或一个查询列表。如果未提供
filter, 则所有文档都可以匹配。过滤器是一个预过滤器,意味着它是在近似kNN搜索期间应用的,以确保返回
num_candidates个匹配的文档。 -
similarity -
(可选, 浮点数) 文档被视为匹配项所需的最小相似度。计算出的相似度值与使用的原始
相似度相关。不是文档分数。然后根据相似度对匹配的文档进行评分,并应用提供的boost。 -
boost -
(可选, 浮点数) 用于乘以匹配文档得分的浮点数。此值不能为负数。默认为
1.0。 -
_name -
(可选, 字符串) 用于标识查询的名称字段
knn查询中的预过滤器和后过滤器
edit有两种方法可以过滤与kNN查询匹配的文档:
-
预过滤 – 在近似kNN搜索期间应用过滤器,以确保返回
k个匹配的文档。 - 后过滤 – 在近似kNN搜索完成后应用过滤器,即使有足够的匹配文档,也会导致少于k个结果。
预过滤通过 knn 查询的 filter 参数实现。
同时,来自 别名 的过滤器也会作为预过滤器应用。
查询DSL树中找到的所有其他过滤器都作为后过滤器应用。
例如,knn 查询找到与最近向量(k=3)最接近的3个文档,这些文档与 term 过滤器结合,进行后过滤。最终的文档集将只包含通过后过滤器的单个文档。
POST my-image-index/_search
{
"size" : 10,
"query" : {
"bool" : {
"must" : {
"knn": {
"field": "image-vector",
"query_vector": [-5, 9, -12],
"k": 3
}
},
"filter" : {
"term" : { "file-type" : "png" }
}
}
}
}
使用knn查询的混合搜索
editKnn查询可以作为混合搜索的一部分,其中knn查询与其他词汇查询结合使用。例如,下面的查询找到与title匹配mountain lake的文档,并将它们与最接近query_vector图像向量的前10个文档结合。然后对这些组合文档进行评分,并返回得分最高的前3个文档。
+
POST my-image-index/_search
{
"size" : 3,
"query": {
"bool": {
"should": [
{
"match": {
"title": {
"query": "mountain lake",
"boost": 1
}
}
},
{
"knn": {
"field": "image-vector",
"query_vector": [-5, 9, -12],
"k": 10,
"boost": 2
}
}
]
}
}
}
嵌套查询中的Knn查询
editknn 查询可以在嵌套查询中使用。这里的行为与顶层嵌套 kNN 搜索类似:
- kNN搜索嵌套的dense_vectors在顶级文档上多样化顶部结果
-
filter在顶级文档元数据上受支持,并作为预过滤器 -
filter在nested字段元数据上不受支持
一个示例查询可能如下所示:
{
"query" : {
"nested" : {
"path" : "paragraph",
"query" : {
"knn": {
"query_vector": [
0.45,
45
],
"field": "paragraph.vector",
"num_candidates": 2
}
}
}
}
}
稀疏向量查询
edit稀疏向量查询执行由稀疏向量组成的查询,例如由学习到的稀疏检索模型构建的查询。 这可以通过两种策略之一来实现:
- 使用自然语言处理模型将查询文本转换为一组词元-权重对
- 发送预先计算的词元-权重对作为查询向量
这些令牌-权重对随后用于对稀疏向量进行查询。 在查询时,查询向量使用与创建令牌时相同的推理模型计算。 在查询时,这些查询向量与其各自的权重进行OR操作,这意味着评分实际上是存储维度与查询维度之间的点积计算。
例如,一个存储的向量 {"feature_0": 0.12, "feature_1": 1.2, "feature_2": 3.0} 与查询向量 {"feature_0": 2.5, "feature_2": 0.2} 会对文档进行评分 _score = 0.12*2.5 + 3.0*0.2 = 0.9
使用自然语言处理模型的示例请求
editGET _search
{
"query":{
"sparse_vector": {
"field": "ml.tokens",
"inference_id": "the inference ID to produce the token weights",
"query": "the query string"
}
}
}
使用预计算向量的示例请求
editGET _search
{
"query":{
"sparse_vector": {
"field": "ml.tokens",
"query_vector": { "token1": 0.5, "token2": 0.3, "token3": 0.2 }
}
}
}
用于sparse_vector的顶级参数
edit-
field - (必需,字符串) 包含要搜索的词元-权重对的字段的名称。
-
inference_id -
(可选,字符串) 用于将查询文本转换为权重对的 推理ID。
它必须与用于从输入文本创建令牌的推理ID相同。
只允许使用
inference_id和query_vector中的一个。 如果指定了inference_id,则还必须指定query。 -
query -
(可选,字符串) 用于搜索的查询文本。
如果指定了
inference_id,则也必须指定query。 如果指定了query_vector,则不得指定query。 -
query_vector -
(可选,字典) 一个包含词元-权重对的字典,表示预计算的查询向量以进行搜索。
使用此查询向量进行搜索将绕过额外的推理。
只允许使用
inference_id和query_vector中的一个。 -
prune -
(可选, 布尔值)
[预览]
此功能处于技术预览阶段,可能会在未来的版本中更改或删除。Elastic 将努力修复任何问题,但技术预览中的功能不受官方 GA 功能支持 SLA 的约束。
是否执行修剪,从查询中省略不重要的标记以提高查询性能。
如果
prune为 true 但未指定pruning_config,则将进行修剪,但将使用默认值。 默认值: false。 -
pruning_config -
(可选, 对象) [预览] 此功能处于技术预览阶段,可能会在未来的版本中更改或删除。Elastic 将努力修复任何问题,但技术预览中的功能不受官方 GA 功能支持 SLA 的约束。 可选的修剪配置。 如果启用,这将省略查询中的非重要标记,以提高查询性能。 仅当
prune设置为true时使用。 如果prune设置为true但未指定pruning_config,将使用默认值。参数
pruning_config如下:-
tokens_freq_ratio_threshold -
(可选, 整数)
[预览]
此功能处于技术预览阶段,可能会在未来的版本中更改或删除。Elastic 将努力修复任何问题,但技术预览中的功能不受官方 GA 功能支持 SLA 的约束。
频率超过
tokens_freq_ratio_threshold倍于指定字段中所有标记的平均频率的标记被视为异常值并被修剪。 此值必须在 1 到 100 之间。 默认值:5。 -
tokens_weight_threshold -
(可选, 浮点数)
[预览]
此功能处于技术预览阶段,可能会在未来的版本中更改或删除。Elastic 将努力修复任何问题,但技术预览中的功能不受官方 GA 功能支持 SLA 的约束。
权重小于
tokens_weight_threshold的标记被视为不重要并被修剪。 此值必须在 0 到 1 之间。 默认值:0.4。 -
only_score_pruned_tokens -
(可选, 布尔值)
[预览]
此功能处于技术预览阶段,可能会在未来的版本中更改或删除。Elastic 将努力修复任何问题,但技术预览中的功能不受官方 GA 功能支持 SLA 的约束。
如果为
true,我们只将修剪后的标记输入到评分中,并丢弃未修剪的标记。 强烈建议将此设置为false用于主查询,但可以将其设置为true用于重新评分查询以获得更相关的结果。 默认值:false。
默认值
tokens_freq_ratio_threshold和tokens_weight_threshold是基于使用ELSERv2进行的测试选择的,这些测试提供了最优的结果。 -
ELSER 查询示例
edit以下是引用ELSER模型执行语义搜索的sparse_vector查询示例。
有关如何使用ELSER和sparse_vector查询执行语义搜索的更详细描述,请参阅本教程。
GET my-index/_search
{
"query":{
"sparse_vector": {
"field": "ml.tokens",
"inference_id": "my-elser-model",
"query": "How is the weather in Jamaica?"
}
}
}
多个sparse_vector查询可以相互组合或与其他查询类型组合。
这可以通过将它们包装在布尔查询子句中并使用线性提升来实现:
GET my-index/_search
{
"query": {
"bool": {
"should": [
{
"sparse_vector": {
"field": "ml.inference.title_expanded.predicted_value",
"inference_id": "my-elser-model",
"query": "How is the weather in Jamaica?",
"boost": 1
}
},
{
"sparse_vector": {
"field": "ml.inference.description_expanded.predicted_value",
"inference_id": "my-elser-model",
"query": "How is the weather in Jamaica?",
"boost": 1
}
},
{
"multi_match": {
"query": "How is the weather in Jamaica?",
"fields": [
"title",
"description"
],
"boost": 4
}
}
]
}
}
}
这也可以通过使用倒数排名融合 (RRF),通过一个带有多个standard 检索器的rrf 检索器来实现。
GET my-index/_search
{
"retriever": {
"rrf": {
"retrievers": [
{
"standard": {
"query": {
"multi_match": {
"query": "How is the weather in Jamaica?",
"fields": [
"title",
"description"
]
}
}
}
},
{
"standard": {
"query": {
"sparse_vector": {
"field": "ml.inference.title_expanded.predicted_value",
"inference_id": "my-elser-model",
"query": "How is the weather in Jamaica?",
"boost": 1
}
}
}
},
{
"standard": {
"query": {
"sparse_vector": {
"field": "ml.inference.description_expanded.predicted_value",
"inference_id": "my-elser-model",
"query": "How is the weather in Jamaica?",
"boost": 1
}
}
}
}
],
"window_size": 10,
"rank_constant": 20
}
}
}
带有剪枝配置和重新评分的ELSER查询示例
edit以下是对上述示例的扩展,添加了一个
[预览]
此功能处于技术预览阶段,可能会在未来的版本中进行更改或删除。Elastic 将努力修复任何问题,但技术预览中的功能不受官方 GA 功能支持 SLA 的约束。
修剪配置到 sparse_vector 查询中。
修剪配置用于识别并从查询中修剪非重要标记,以提高查询性能。
Token pruning 发生在分片级别。
虽然这应该会导致相同的token在所有分片中被标记为不重要,但这并不能基于每个分片的组成来保证。
因此,如果您在使用 sparse_vector 和 pruning_config 的多分片索引上运行,我们强烈建议添加一个 Rescore filtered search results 函数,使用最初从查询中修剪的token。
这将有助于缓解修剪token在分片级别的不一致性,并提供更好的整体相关性。
GET my-index/_search
{
"query":{
"sparse_vector":{
"field": "ml.tokens",
"inference_id": "my-elser-model",
"query":"How is the weather in Jamaica?",
"prune": true,
"pruning_config": {
"tokens_freq_ratio_threshold": 5,
"tokens_weight_threshold": 0.4,
"only_score_pruned_tokens": false
}
}
},
"rescore": {
"window_size": 100,
"query": {
"rescore_query": {
"sparse_vector": {
"field": "ml.tokens",
"inference_id": "my-elser-model",
"query": "How is the weather in Jamaica?",
"prune": true,
"pruning_config": {
"tokens_freq_ratio_threshold": 5,
"tokens_weight_threshold": 0.4,
"only_score_pruned_tokens": true
}
}
}
}
}
}
当执行跨集群搜索时,推理是在本地集群上执行的。
语义查询
edit此功能处于测试阶段,可能会发生变化。设计和代码不如正式发布的功能成熟,并且是按原样提供的,不提供任何保证。测试功能不受正式发布功能的支持服务级别协议的约束。
The semantic 查询类型使您能够在存储在 语义搜索 字段中的数据上执行 semantic_text 字段。
示例请求
editGET my-index-000001/_search
{
"query": {
"semantic": {
"field": "inference_field",
"query": "Best surfing places"
}
}
}
用于semantic的顶级参数
edit-
field -
(必需, 字符串)
要在其上执行查询的
semantic_text字段。 -
query - (必需, 字符串) 要在字段上搜索的查询文本。
请参考本教程以了解更多关于使用semantic_text和semantic查询进行语义搜索的信息。
使用语义查询的混合搜索
edit语义查询可以作为混合搜索的一部分,其中语义查询与词汇查询结合使用。例如,下面的查询查找title字段匹配“mountain lake”的文档,并将它们与title_semantic字段上的语义搜索结果结合,该字段是一个semantic_text字段。然后对组合的文档进行评分,并返回得分最高的前3个文档。
POST my-index/_search
{
"size" : 3,
"query": {
"bool": {
"should": [
{
"match": {
"title": {
"query": "mountain lake",
"boost": 1
}
}
},
{
"semantic": {
"field": "title_semantic",
"query": "mountain lake",
"boost": 2
}
}
]
}
}
}
您还可以将semantic_text作为Reciprocal Rank Fusion的一部分,以使排名相关结果更容易:
GET my-index/_search
{
"retriever": {
"rrf": {
"retrievers": [
{
"standard": {
"query": {
"term": {
"text": "shoes"
}
}
}
},
{
"standard": {
"query": {
"semantic": {
"field": "semantic_field",
"query": "shoes"
}
}
}
}
],
"rank_window_size": 50,
"rank_constant": 20
}
}
}
在semantic_text字段上的高级搜索
edit为了便于使用,semantic 查询在 semantic_text 字段上使用默认设置进行搜索。
如果您想对 semantic_text 字段上的搜索进行微调,您需要了解在 semantic_text 中配置的 inference_id 所使用的任务类型。
您可以使用 Get inference API 查找任务类型,并检查与推理服务关联的 task_type。
根据 task_type,使用 sparse_vector 或 knn 查询以获得更大的灵活性和自定义性。
虽然可以在 semantic_text 字段上使用 sparse_vector 查询或 knn 查询,但不支持在 sparse_vector 或 dense_vector 字段类型上使用 semantic_query。
使用 sparse_embedding 进行搜索推理
edit当推理端点使用sparse_embedding模型时,您可以在semantic_text字段上使用sparse_vector查询,如下所示:
GET test-index/_search
{
"query": {
"nested": {
"path": "inference_field.inference.chunks",
"query": {
"sparse_vector": {
"field": "inference_field.inference.chunks.embeddings",
"inference_id": "my-inference-id",
"query": "mountain lake"
}
}
}
}
}
您可以自定义 sparse_vector 查询以包含特定设置,例如 修剪配置。
使用text_embedding推理进行搜索
edit当推理端点使用text_embedding模型时,您可以在semantic_text字段上使用knn查询,如下所示:
GET test-index/_search
{
"query": {
"nested": {
"path": "inference_field.inference.chunks",
"query": {
"knn": {
"field": "inference_field.inference.chunks.embeddings",
"query_vector_builder": {
"text_embedding": {
"model_id": "my_inference_id",
"model_text": "mountain lake"
}
}
}
}
}
}
}
您可以自定义 knn 查询以包含特定设置,例如 num_candidates 和 k。
文本扩展查询
edit在8.15.0版本中已弃用。
此查询已被稀疏向量查询所取代。
文本扩展查询使用自然语言处理模型将查询文本转换为一组词元-权重对,然后用于对稀疏向量或排名特征字段进行查询。
示例请求
editGET _search
{
"query":{
"text_expansion":{
"<sparse_vector_field>":{
"model_id":"the model to produce the token weights",
"model_text":"the query string"
}
}
}
}
用于text_expansion的顶级参数
edit-
<sparse_vector_field> - (必需,对象) 包含基于输入文本由NLP模型创建的令牌-权重对的字段的名称。
用于的顶级参数
edit-
model_id - (必需,字符串) 用于将查询文本转换为词元权重对的模型的ID。 它必须与用于从输入文本创建词元的模型ID相同。
-
model_text - (必需,字符串) 用于搜索的查询文本。
-
pruning_config -
(可选, 对象) [预览] 此功能处于技术预览阶段,可能会在未来的版本中更改或删除。Elastic 将努力修复任何问题,但技术预览中的功能不受官方 GA 功能支持 SLA 的约束。 可选的修剪配置。 如果启用,这将省略查询中的非重要标记,以提高查询性能。 默认值: 禁用。
参数
如下:-
tokens_freq_ratio_threshold -
(可选, 整数)
[预览]
此功能处于技术预览阶段,可能会在未来的版本中更改或删除。Elastic 将努力修复任何问题,但技术预览中的功能不受官方 GA 功能支持 SLA 的约束。
频率超过
tokens_freq_ratio_threshold倍于指定字段中所有标记的平均频率的标记被视为异常值并被修剪。 此值必须在 1 到 100 之间。 默认值:5。 -
tokens_weight_threshold -
(可选, 浮点数)
[预览]
此功能处于技术预览阶段,可能会在未来的版本中更改或删除。Elastic 将努力修复任何问题,但技术预览中的功能不受官方 GA 功能支持 SLA 的约束。
权重小于
tokens_weight_threshold的标记被视为不重要并被修剪。 此值必须在 0 到 1 之间。 默认值:0.4。 -
only_score_pruned_tokens -
(可选, 布尔值)
[预览]
此功能处于技术预览阶段,可能会在未来的版本中更改或删除。Elastic 将努力修复任何问题,但技术预览中的功能不受官方 GA 功能支持 SLA 的约束。
如果
true,我们只将修剪后的标记输入到评分中,并丢弃未修剪的标记。 强烈建议将此设置为false用于主查询,但可以将此设置为true用于重新评分查询以获得更相关的结果。 默认值:false。
默认值
tokens_freq_ratio_threshold和tokens_weight_threshold是基于使用ELSER进行的测试选择的,这些测试提供了最优的结果。 -
ELSER 查询示例
edit以下是引用ELSER模型执行语义搜索的text_expansion查询示例。
有关如何使用ELSER和text_expansion查询执行语义搜索的更详细描述,请参阅本教程。
GET my-index/_search
{
"query":{
"text_expansion":{
"ml.tokens":{
"model_id":".elser_model_2",
"model_text":"How is the weather in Jamaica?"
}
}
}
}
多个text_expansion查询可以相互组合或与其他查询类型组合。
这可以通过将它们包装在布尔查询子句中并使用线性提升来实现:
GET my-index/_search
{
"query": {
"bool": {
"should": [
{
"text_expansion": {
"ml.inference.title_expanded.predicted_value": {
"model_id": ".elser_model_2",
"model_text": "How is the weather in Jamaica?",
"boost": 1
}
}
},
{
"text_expansion": {
"ml.inference.description_expanded.predicted_value": {
"model_id": ".elser_model_2",
"model_text": "How is the weather in Jamaica?",
"boost": 1
}
}
},
{
"multi_match": {
"query": "How is the weather in Jamaica?",
"fields": [
"title",
"description"
],
"boost": 4
}
}
]
}
}
}
这也可以通过使用倒数排名融合 (RRF),通过一个带有多个standard 检索器的rrf 检索器来实现。
GET my-index/_search
{
"retriever": {
"rrf": {
"retrievers": [
{
"standard": {
"query": {
"multi_match": {
"query": "How is the weather in Jamaica?",
"fields": [
"title",
"description"
]
}
}
}
},
{
"standard": {
"query": {
"text_expansion": {
"ml.inference.title_expanded.predicted_value": {
"model_id": ".elser_model_2",
"model_text": "How is the weather in Jamaica?"
}
}
}
}
},
{
"standard": {
"query": {
"text_expansion": {
"ml.inference.description_expanded.predicted_value": {
"model_id": ".elser_model_2",
"model_text": "How is the weather in Jamaica?"
}
}
}
}
}
],
"window_size": 10,
"rank_constant": 20
}
}
}
带有剪枝配置和重新评分的ELSER查询示例
edit以下是对上述示例的扩展,添加了一个
[预览]
此功能处于技术预览阶段,可能会在未来的版本中进行更改或移除。Elastic 将努力修复任何问题,但技术预览中的功能不受官方 GA 功能支持 SLA 的约束。
修剪配置到 text_expansion 查询中。
修剪配置用于识别并从查询中修剪非重要标记,以提高查询性能。
令牌修剪发生在分片级别。
虽然这应该会导致相同的令牌在所有分片中被标记为不重要,但这并不能根据每个分片的组成来保证。
因此,如果您在使用pruning_config的多分片索引上运行text_expansion,我们强烈建议添加一个重新评分过滤后的搜索结果函数,使用最初从查询中修剪的令牌。
这将有助于缓解修剪令牌在分片级别的不一致性,并提供更好的整体相关性。
GET my-index/_search
{
"query":{
"text_expansion":{
"ml.tokens":{
"model_id":".elser_model_2",
"model_text":"How is the weather in Jamaica?",
"pruning_config": {
"tokens_freq_ratio_threshold": 5,
"tokens_weight_threshold": 0.4,
"only_score_pruned_tokens": false
}
}
}
},
"rescore": {
"window_size": 100,
"query": {
"rescore_query": {
"text_expansion": {
"ml.tokens": {
"model_id": ".elser_model_2",
"model_text": "How is the weather in Jamaica?",
"pruning_config": {
"tokens_freq_ratio_threshold": 5,
"tokens_weight_threshold": 0.4,
"only_score_pruned_tokens": true
}
}
}
}
}
}
}
根据您的数据,使用 track_total_hits: false 可能会使文本扩展查询更快。
加权词元查询
edit在8.15.0版本中已弃用。
此查询已被稀疏向量查询取代,并将在即将发布的版本中移除。
此功能处于技术预览阶段,可能会在未来的版本中进行更改或移除。Elastic 将努力修复任何问题,但技术预览版中的功能不受官方 GA 功能支持 SLA 的约束。
加权标记查询需要一个标记-权重对的列表,这些标记-权重对是随查询一起发送的,而不是使用自然语言处理模型计算的。 这些标记对随后用于对稀疏向量或排名特征字段进行查询。
加权标记查询在您想要使用外部查询扩展模型,或快速原型化更改而不重新索引新模型时非常有用。
示例请求
editPOST _search
{
"query": {
"weighted_tokens": {
"query_expansion_field": {
"tokens": {"2161": 0.4679, "2621": 0.307, "2782": 0.1299, "2851": 0.1056, "3088": 0.3041, "3376": 0.1038, "3467": 0.4873, "3684": 0.8958, "4380": 0.334, "4542": 0.4636, "4633": 2.2805, "4785": 1.2628, "4860": 1.0655, "5133": 1.0709, "7139": 1.0016, "7224": 0.2486, "7387": 0.0985, "7394": 0.0542, "8915": 0.369, "9156": 2.8947, "10505": 0.2771, "11464": 0.3996, "13525": 0.0088, "14178": 0.8161, "16893": 0.1376, "17851": 1.5348, "19939": 0.6012},
"pruning_config": {
"tokens_freq_ratio_threshold": 5,
"tokens_weight_threshold": 0.4,
"only_score_pruned_tokens": false
}
}
}
}
}
用于 weighted_token 的顶级参数
edit-
<tokens> -
(必需,字典) 一个包含令牌-权重对的字典。
-
pruning_config -
(可选, 对象) 可选的剪枝配置。 如果启用,这将省略查询中不重要的标记,以提高查询性能。 默认值: 禁用。
参数
如下:-
tokens_freq_ratio_threshold -
(可选, 整数) 频率超过
tokens_freq_ratio_threshold倍于指定字段中所有标记的平均频率的标记被视为异常值并被剪枝。 此值必须在 1 到 100 之间。 默认值:5。 -
tokens_weight_threshold -
(可选, 浮点数) 权重小于
tokens_weight_threshold的标记被视为不重要并被剪枝。 此值必须在 0 到 1 之间。 默认值:0.4。 -
only_score_pruned_tokens -
(可选, 布尔值) 如果为
true,我们只将剪枝后的标记输入评分,并丢弃未剪枝的标记。 强烈建议将此设置为false用于主查询,但可以将其设置为true用于重新评分查询以获得更相关的结果。 默认值:false。
默认值
tokens_freq_ratio_threshold和tokens_weight_threshold是基于使用ELSER进行的测试选择的,这些测试提供了最优的结果。 -
-
带剪枝配置和重新评分的加权令牌查询示例
edit以下示例向text_expansion查询添加了一个剪枝配置。
该剪枝配置用于识别并从查询中剪除非重要标记,以提高查询性能。
Token pruning 发生在分片级别。
虽然这应该会导致相同的 token 在所有分片中被标记为不重要,但这并不能基于每个分片的组成来保证。
因此,如果您在使用 pruning_config 的多分片索引上运行 text_expansion,我们强烈建议添加一个带有最初从查询中修剪的 token 的 Rescore filtered search results 函数。
这将有助于缓解修剪 token 在分片级别上的任何不一致性,并提供更好的整体相关性。
GET my-index/_search
{
"query":{
"weighted_tokens": {
"query_expansion_field": {
"tokens": {"2161": 0.4679, "2621": 0.307, "2782": 0.1299, "2851": 0.1056, "3088": 0.3041, "3376": 0.1038, "3467": 0.4873, "3684": 0.8958, "4380": 0.334, "4542": 0.4636, "4633": 2.2805, "4785": 1.2628, "4860": 1.0655, "5133": 1.0709, "7139": 1.0016, "7224": 0.2486, "7387": 0.0985, "7394": 0.0542, "8915": 0.369, "9156": 2.8947, "10505": 0.2771, "11464": 0.3996, "13525": 0.0088, "14178": 0.8161, "16893": 0.1376, "17851": 1.5348, "19939": 0.6012},
"pruning_config": {
"tokens_freq_ratio_threshold": 5,
"tokens_weight_threshold": 0.4,
"only_score_pruned_tokens": false
}
}
}
},
"rescore": {
"window_size": 100,
"query": {
"rescore_query": {
"weighted_tokens": {
"query_expansion_field": {
"tokens": {"2161": 0.4679, "2621": 0.307, "2782": 0.1299, "2851": 0.1056, "3088": 0.3041, "3376": 0.1038, "3467": 0.4873, "3684": 0.8958, "4380": 0.334, "4542": 0.4636, "4633": 2.2805, "4785": 1.2628, "4860": 1.0655, "5133": 1.0709, "7139": 1.0016, "7224": 0.2486, "7387": 0.0985, "7394": 0.0542, "8915": 0.369, "9156": 2.8947, "10505": 0.2771, "11464": 0.3996, "13525": 0.0088, "14178": 0.8161, "16893": 0.1376, "17851": 1.5348, "19939": 0.6012},
"pruning_config": {
"tokens_freq_ratio_threshold": 5,
"tokens_weight_threshold": 0.4,
"only_score_pruned_tokens": true
}
}
}
}
}
}
}