查询数据

OpenSearch 有不同类型的查询,包括:


简单查询

没有参数执行搜索 API ,会提供来自索引的结果, 而不进行过滤。当没有提供filter时,每个文档都是搜索结果的一部分:

GET /my-movie-index/_search

刚刚检索到的索引数据存储在组成索引的shard中,并在以下两个阶段检索:

  • 查询阶段(Query phase) - 在此阶段,在每个分片上本地执行查询,并将匹配的文档 ID 返回到查询节点。查询节点合并这些记录并创建一个排序列表。
  • 获取阶段(Fetch phase) - 在此阶段,查询节点获取实际数据并将其返回给客户端。

OpenSearch 支持简单的基于 URL 的查询语法以及更复杂的基于 REST 的 JSON 接口。当使用 OpenSearch 时,最常使用 JSON API。

运行以下基于 URL 的查询来执行一个简单的搜索,并使用一个查询参数:

GET /my-movie-index/_search?q=:param{key=query.general.query}

GET /my-movie-index/_search?q=franco

查看响应。返回的数据包含操作信息和结果集:

{
  "took" : 11,            // 服务器端执行时间(毫秒)
  "timed_out" : false,    // 如果查询操作超时
  "_shards" : {           
    "total" : 3,          // 正在查询的索引中的总分片数
    "successful" : 3,     // 成功响应查询的分片数
    "skipped" : 0,        // 跳过的分片数
    "failed" : 0          // 搜索失败的分片数
  }"hits" : {                
    "total" : {
      "value" : 13,       // 找到的相关文档数
      "relation" : "eq"   // 搜索关系,默认操作 eq
    }
  }
}

Term查询

Term查询返回与搜索词完全匹配的文档。检查输出,并检查是否所有返回的文档都包含关键字

GET my-movie-index/_search
{
  "query": {
    "term": {
      "directors.keyword": {
        "value": "James Franco"
      }
    }
  }
}

关键词查询

OpenSearch 拥有丰富的查询接口,支持多种不同的查询类型。

  • Term查询 - 当想要精确匹配词条时,可以使用这个查询。通常会将Term查询与 keyword字段一起使用。
  • Match查询 - 当匹配较大的文本块时,尤其是使用 OpenSearch 的相关性对结果进行排序时,可以使用这个查询。通常会将这些查询与 text 字段一起使用。

那么 keywordtext 字段有什么区别呢?

  • OpenSearch 会对 [text] 字段中的字符串进行处理,这个过程称为 分析(Analysis)。在分析过程中,OpenSearch 会 分段(segment) 文本,提取出单独的 term。可以将词条视为由空白字符分隔的单词,尽管一些语言(如日语)的分段更加复杂,需要考虑上下文。OpenSearch 还会进一步处理这些词条,删除常见的 停用词,将单词还原为词干形式,添加同义词,转换为小写等。

  • Keyword字段提供了一个单一的词条用于匹配。OpenSearch 不会对 keyword字段应用文本转换。

standard 分析器将:

  • 在空白字符处拆分单词
  • 将单词转换为小写(因此 [Jump] 将被索引为 [jump])

运行以下查询:

GET my-movie-index/_search
{
  "query": {
    "term": {
      "title": "transformers"
    }
  }
}

文本在索引过程中被转换为小写。请注意上述查询返回的值 Transformers

可以使用 _analyze API 查看 OpenSearch 如何转换输入文本:

GET my-movie-index/_analyze
{
  "analyzer": "default",
  "text": ["Transformers"]
}

对于不区分大小写的搜索,可以使用 simple_query_string 操作。simple_query_string 属于match查询。

POST my-movie-index/_search
{
  "query": {
    "simple_query_string": {
      "query": "Transformers",
      "fields": ["title"]
    }
  }
}