向量查询

edit

向量查询是专门用于向量字段的查询,能够高效地执行语义搜索

knn query
一个查询,用于查找与查询向量最接近的 k 个向量,适用于 dense_vector 字段,通过相似性度量来衡量。
sparse_vector query
用于搜索 sparse_vector 字段类型的查询。
semantic query
一个允许您在semantic_text字段上执行语义搜索的查询。

已弃用的向量查询

edit

以下查询已被弃用,并将在不久的将来被移除。 请改用sparse_vector 查询

text_expansion query
一个允许您在sparse_vectorrank_features字段上执行稀疏向量搜索的查询。
weighted_tokens query
允许执行优化性能的文本扩展查询。

Knn 查询

edit

查找与查询向量最接近的 k 个向量,通过相似性度量进行测量。knn 查询通过索引的 dense_vectors 上的近似搜索找到最近的向量。进行近似 kNN 搜索的首选方法是使用搜索请求的 kNN 搜索部分knn 查询保留给专家案例,在这些案例中需要将此查询与其他查询结合使用。

示例请求

edit
PUT my-image-index
{
  "mappings": {
    "properties": {
       "image-vector": {
        "type": "dense_vector",
        "dims": 3,
        "index": true,
        "similarity": "l2_norm"
      },
      "file-type": {
        "type": "keyword"
      },
      "title": {
        "type": "text"
      }
    }
  }
}
  1. 索引您的数据。

    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" }
  2. 使用 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_builderquery_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查询匹配的文档:

  1. 预过滤 – 在近似kNN搜索期间应用过滤器,以确保返回k个匹配的文档。
  2. 后过滤 – 在近似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查询的混合搜索

edit

Knn查询可以作为混合搜索的一部分,其中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查询

edit

knn 查询可以在嵌套查询中使用。这里的行为与顶层嵌套 kNN 搜索类似:

  • kNN搜索嵌套的dense_vectors在顶级文档上多样化顶部结果
  • filter 在顶级文档元数据上受支持,并作为预过滤器
  • filternested字段元数据上不受支持

一个示例查询可能如下所示:

{
  "query" : {
    "nested" : {
      "path" : "paragraph",
        "query" : {
          "knn": {
            "query_vector": [
                0.45,
                45
            ],
            "field": "paragraph.vector",
            "num_candidates": 2
        }
      }
    }
  }
}

带聚合的Knn查询

edit

knn 查询在每个分片的顶部 k 个文档上计算聚合。 因此,聚合的最终结果包含 k * number_of_shards 个文档。这与 顶层 knn 部分不同,其中聚合是在全局顶部 k 个最近文档上计算的。

稀疏向量查询

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

使用自然语言处理模型的示例请求

edit
GET _search
{
   "query":{
      "sparse_vector": {
        "field": "ml.tokens",
        "inference_id": "the inference ID to produce the token weights",
        "query": "the query string"
      }
   }
}

使用预计算向量的示例请求

edit
GET _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_idquery_vector 中的一个。 如果指定了 inference_id,则还必须指定 query
query
(可选,字符串) 用于搜索的查询文本。 如果指定了inference_id,则也必须指定query。 如果指定了query_vector,则不得指定query
query_vector
(可选,字典) 一个包含词元-权重对的字典,表示预计算的查询向量以进行搜索。 使用此查询向量进行搜索将绕过额外的推理。 只允许使用 inference_idquery_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_thresholdtokens_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_vectorpruning_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 字段。

示例请求

edit
GET my-index-000001/_search
{
  "query": {
    "semantic": {
      "field": "inference_field",
      "query": "Best surfing places"
    }
  }
}

用于semantic的顶级参数

edit
field
(必需, 字符串) 要在其上执行查询的 semantic_text 字段。
query
(必需, 字符串) 要在字段上搜索的查询文本。

请参考本教程以了解更多关于使用semantic_textsemantic查询进行语义搜索的信息。

使用语义查询的混合搜索

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_vectorknn 查询以获得更大的灵活性和自定义性。

虽然可以在 semantic_text 字段上使用 sparse_vector 查询或 knn 查询,但不支持在 sparse_vectordense_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_candidatesk

文本扩展查询

edit

在8.15.0版本中已弃用。

此查询已被稀疏向量查询所取代。

文本扩展查询使用自然语言处理模型将查询文本转换为一组词元-权重对,然后用于对稀疏向量排名特征字段进行查询。

示例请求

edit
GET _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_thresholdtokens_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 的约束。

加权标记查询需要一个标记-权重对的列表,这些标记-权重对是随查询一起发送的,而不是使用自然语言处理模型计算的。 这些标记对随后用于对稀疏向量排名特征字段进行查询。

加权标记查询在您想要使用外部查询扩展模型,或快速原型化更改而不重新索引新模型时非常有用。

示例请求

edit
POST _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_thresholdtokens_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
                }
              }
            }
         }
      }
   }
}