为 Elasticsearch

对于需要组合多个搜索条件的复杂查询,请使用查询正文。 查询子句有助于决定文档是否与搜索匹配,从而返回更精确的结果。

与 Elasticsearch 的集成使用关键字搜索,但您可以在代理中将查询正文配置为高级 Elasticsearch 设置,以启用更高级的搜索技术,例如:

  • 使用 ELSER 进行语义搜索。

  • k-nearest neighbor ( kNN ) 密集向量搜索。

  • 嵌套查询,用于搜索嵌套文档。

  • 混合搜索。

  • 在语义文本字段中进行搜索。

使用 ELSER 进行语义搜索

利用 ELSER 进行语义搜索,通过了解用户查询背后的上下文和意图来提高搜索准确性和相关性。 如需了解更多信息,请参阅 Elasticsearch 文档中的“使用ELSER进行语义搜索 ”。

下面的代码片段展示了使用 ELSER 进行语义搜索的示例。 该示例使用布尔查询来匹配符合其他查询布尔组合的文档。

{
  "query": {
    "bool": {
      "should": [
        {
          "text_expansion": {
            "ml.tokens": {
              "model_id": ".elser_model_2_linux-x86_64",
              "model_text": "$QUERY"
            }
          }
        }
      ],
      "filter": "$FILTER"
    }
  }
}

其中:

  • ml.tokens

它指的是存储 ELSER 标记的字段。 如果您在索引中使用了不同的字段,可能需要对其进行更新。 如果没有 ELSER 标记,也可以使用包含原始文本的字段,但搜索质量可能会下降。

  • .elser_model_2_linux-x86-64

它是 ELSER v2 优化版本的型号 ID,如果 Elasticsearch 部署中有该型号,请使用它。 否则,常规 ELSER v2 模型使用 .elser_model_2 ,ELSER v1 使用 .elser_model_1

  • $QUERY

它是用于访问用户查询的变量。 它可以确保将用户查询传递给查询主体。

  • $FILTER

这是用于访问您在 Elasticsearch 的高级设置中配置的自定义过滤器的变量。 它可以确保在查询正文中使用自定义筛选器。

使用 ELSER 在嵌套文档中使用嵌套查询进行搜索

当 Elasticsearch 索引包含嵌套文档时, 嵌套查询会包裹另一个查询,用于搜索该索引中的嵌套字段。 如果找到匹配,查询会返回根父文档以及匹配的嵌套文档。 在对搜索结果应用筛选器时,可以选择筛选父文档或嵌套文档。

查询外部文档

以下代码片段展示了一个查询 Elasticsearch 索引中外部文档的示例。 在此示例中,外层文档是包含嵌套 passages 文档的主文档。 该 nested 查询会在 passages 嵌套文档中进行搜索。 如果在嵌套文档中找到了匹配项,查询将返回外部文档以及匹配的嵌套文档。

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "path": "passages",
            "query": {
              "text_expansion": {
                "passages.sparse.tokens": {
                  "model_id": ".elser_model_2_linux-x86_64",
                  "model_text": "$QUERY"
                  }
              }
            },
            "inner_hits": {"_source": {"excludes": ["passages.sparse"]}}
          }
        }
      ],
      "filter": "$FILTER"
    }
  },
  "_source": false
}

查询内部文档

下面的代码片段展示了一个查询嵌套文档内部文档的示例。 在此示例中,系统会在嵌套文档中搜索展开后的文本,应用筛选条件,并返回包含匹配嵌套文档的父文档,同时从源数据中排除某些字段。

{
  "query": {
    "nested": {
      "path": "passages",
      "query": {
        "bool": {
          "should": [
            {
              "text_expansion": {
                "passages.sparse.tokens": {
                  "model_id": ".elser_model_2_linux-x86_64",
                  "model_text": "$QUERY"
                }
              }
            }
          ],
          "filter": "$FILTER"
        }
      },
      "inner_hits": {"_source": {"excludes": ["passages.sparse"]}}
    }
  },
  "_source": false
}

其中:

  • passages

这是一个嵌套字段,用于在父文档中存储内部文档。 如果在索引中使用不同的嵌套字段,可能需要更新。

  • passages.sparse.tokens

它指的是存储内部文档的 ELSER 标记或原始文本的字段。 如果在索引中使用不同的嵌套字段,可能需要更新。 如果没有 ELSER 标记,也可以使用包含原始文本的字段,但搜索质量可能会下降。

  • "inner_hits": {"_source": {"excludes": ["passages.sparse"]}}

它将 ELSER 标记排除在搜索结果的内部文档之外。

  • "_source": false

它不包括搜索结果中的所有顶层字段,因为只使用搜索结果中的内部文档。

  • $QUERY

它是用于访问用户查询的变量。 它可以确保将用户查询传递给查询主体。

  • $FILTER

这是用于访问您在 Elasticsearch 的高级设置中配置的自定义过滤器的变量。 它可以确保在查询正文中使用自定义筛选器。 如果应用于外部文档,则筛选器中仅可使用外部字段。 如果应用于内部文档,则过滤器中只能使用内部字段。

使用嵌套查询在语义文本字段中进行搜索

使用以下结构在语义文本字段上查询嵌套文档。 这种结构可确保搜索与 Elasticsearch 整合正常运行。

{
  "query": {
    "nested": {
      "path": "semtext.inference.chunks",
      "query": {
        "sparse_vector": {
          "field": "semtext.inference.chunks.embeddings",
          "inference_id": ".elser_model_2_linux-x86_64",
          "query": "$QUERY"
        }
      },
      "inner_hits": {"_source": {"excludes": ["semtext.inference.chunks.embeddings"]}}
    }
  },
  "_source": false
}

其中:

  • semtext

它是语义字段的名称。 如果语义字段的名称不同,您可能需要更新它。 如需更多信息,请参阅 Elasticsearch 文档中的 “语义文本字段类型”

  • semtext.inference.chunks

它指的是存储分块文本和嵌入的字段。

  • sparse_vector

它指定查询的类型,在本例中是稀疏向量查询。 与 text_expansion 查询相比,它是一种类似但较新的查询类型。

  • semtext.inference.chunks.embeddings

它指的是存储分块文本嵌入的字段。