文本扩展查询编辑

文本扩展查询使用自然语言处理模型将查询文本转换为标记-权重对列表,然后在针对 稀疏向量排名特征 字段的查询中使用这些标记-权重对。

示例请求编辑

response = client.search(
  body: {
    query: {
      text_expansion: {
        "<sparse_vector_field>": {
          model_id: 'the model to produce the token weights',
          model_text: 'the query string'
        }
      }
    }
  }
)
puts response
GET _search
{
   "query":{
      "text_expansion":{
         "<sparse_vector_field>":{
            "model_id":"the model to produce the token weights",
            "model_text":"the query string"
         }
      }
   }
}

text_expansion 的顶级参数编辑

<sparse_vector_field>
(必填,对象)包含 NLP 模型根据输入文本创建的标记-权重对的字段的名称。

<sparse_vector_field> 的顶级参数编辑

model_id
(必填,字符串)用于将查询文本转换为标记-权重对的模型的 ID。它必须与用于从输入文本创建标记的模型 ID 相同。
model_text
(必填,字符串)要用于搜索的查询文本。
pruning_config

(可选,对象) [预览] 此功能处于技术预览阶段,可能会在未来版本中更改或删除。Elastic 将努力解决任何问题,但技术预览版中的功能不受官方 GA 功能支持 SLA 的约束。 可选的剪枝配置。如果启用,这将从查询中省略不重要的标记,以提高查询性能。默认值:禁用。

<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 的默认值是根据使用 ELSER 进行的测试选择的,这些测试提供了最佳结果。

示例 ELSER 查询编辑

以下是 text_expansion 查询的示例,该查询引用 ELSER 模型来执行语义搜索。有关如何使用 ELSER 和 text_expansion 查询执行语义搜索的更详细说明,请参阅本教程

response = client.search(
  index: 'my-index',
  body: {
    query: {
      text_expansion: {
        'ml.tokens' => {
          model_id: '.elser_model_2',
          model_text: 'How is the weather in Jamaica?'
        }
      }
    }
  }
)
puts response
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 查询编辑

以下是上述示例的扩展,它向 text_expansion 查询添加了一个 [预览] 此功能处于技术预览阶段,可能会在未来版本中更改或删除。Elastic 将努力解决任何问题,但技术预览版中的功能不受官方 GA 功能支持 SLA 的约束。 剪枝配置。剪枝配置标识要从查询中剪枝的不重要标记,以提高查询性能。

标记剪枝发生在分片级别。虽然这应该会导致在各个分片中将相同的标记标记为不重要,但根据每个分片的组成,不能保证这一点。因此,如果您在多分片索引上运行带有 pruning_configtext_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 的情况下可能会更快。