简单查询字符串查询

编辑

基于提供的查询字符串返回文档,使用具有有限但容错语法的解析器。

此查询使用简单语法来解析和拆分提供的查询字符串,根据特殊运算符将其拆分为词项。然后,查询在返回匹配文档之前,独立分析每个词项。

虽然其语法比 query_string 查询更有限,但 simple_query_string 查询不会因无效语法而返回错误。相反,它会忽略查询字符串的任何无效部分。

示例请求

编辑
resp = client.search(
    query={
        "simple_query_string": {
            "query": "\"fried eggs\" +(eggplant | potato) -frittata",
            "fields": [
                "title^5",
                "body"
            ],
            "default_operator": "and"
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      simple_query_string: {
        query: '"fried eggs" +(eggplant | potato) -frittata',
        fields: [
          'title^5',
          'body'
        ],
        default_operator: 'and'
      }
    }
  }
)
puts response
const response = await client.search({
  query: {
    simple_query_string: {
      query: '"fried eggs" +(eggplant | potato) -frittata',
      fields: ["title^5", "body"],
      default_operator: "and",
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "simple_query_string" : {
        "query": "\"fried eggs\" +(eggplant | potato) -frittata",
        "fields": ["title^5", "body"],
        "default_operator": "and"
    }
  }
}

simple_query_string 的顶层参数

编辑
query
(必需,字符串)您希望解析并用于搜索的查询字符串。请参阅简单查询字符串语法
fields

(可选,字符串数组)您希望搜索的字段数组。

此字段接受通配符表达式。您还可以使用插入符号(^)表示法来提高特定字段匹配的相关性分数。有关示例,请参阅 fields 参数中的通配符和每个字段的提升

默认为 index.query.default_field 索引设置,其默认值为 ** 值提取所有符合词项查询条件的字段,并过滤元数据字段。如果没有指定 prefix,则将所有提取的字段组合在一起以构建查询。

一次可以查询的字段数量有限制。它由 indices.query.bool.max_clause_count 搜索设置定义,默认值为 1024

default_operator

(可选,字符串)如果未指定运算符,则用于解释查询字符串中文本的默认布尔逻辑。有效值为:

OR (默认)
例如,查询字符串 capital of Hungary 将被解释为 capital OR of OR Hungary
AND
例如,查询字符串 capital of Hungary 将被解释为 capital AND of AND Hungary
analyze_wildcard
(可选,布尔值)如果为 true,则查询会尝试分析查询字符串中的通配符词项。默认为 false
analyzer
(可选,字符串)用于将查询字符串中的文本转换为词条的分析器。默认为为default_field映射的索引时分析器。如果未映射任何分析器,则使用索引的默认分析器。
auto_generate_synonyms_phrase_query
(可选,布尔值)如果为 true,则解析器为每个多位置词条创建match_phrase查询。默认为 true。有关示例,请参阅多位置词条
flags
(可选,字符串)简单查询字符串语法的启用运算符列表。默认为 ALL(所有运算符)。有关有效值,请参阅限制运算符
fuzzy_max_expansions
(可选,整数)查询扩展以进行模糊匹配的最大词项数。默认为 50
fuzzy_prefix_length
(可选,整数)进行模糊匹配时保持不变的起始字符数。默认为 0
fuzzy_transpositions
(可选,布尔值)如果为 true,则模糊匹配的编辑包括两个相邻字符的换位(ab → ba)。默认为 true
lenient
(可选,布尔值)如果为 true,则会忽略基于格式的错误,例如为数值字段提供文本值。默认为 false
minimum_should_match
(可选,字符串)必须匹配的最小子句数才能返回文档。有关有效值和更多信息,请参阅minimum_should_match 参数
quote_field_suffix

(可选,字符串)附加到查询字符串中带引号文本的后缀。

您可以使用此后缀为精确匹配使用不同的分析方法。请参阅混合精确搜索与词干提取

说明

编辑

简单查询字符串语法

编辑

simple_query_string 查询支持以下运算符:

  • + 表示 AND 操作
  • | 表示 OR 操作
  • - 对单个词条求反
  • " 将多个词条包装起来以表示用于搜索的短语
  • 词项末尾的 * 表示前缀查询
  • () 表示优先级
  • 单词后的 ~N 表示编辑距离(模糊性)
  • 短语后的 ~N 表示允许的间隙量

要按字面意思使用这些字符之一,请使用前导反斜杠 (\) 对其进行转义。

这些运算符的行为可能会因 default_operator 值而异。例如:

resp = client.search(
    query={
        "simple_query_string": {
            "fields": [
                "content"
            ],
            "query": "foo bar -baz"
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      simple_query_string: {
        fields: [
          'content'
        ],
        query: 'foo bar -baz'
      }
    }
  }
)
puts response
const response = await client.search({
  query: {
    simple_query_string: {
      fields: ["content"],
      query: "foo bar -baz",
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "simple_query_string": {
      "fields": [ "content" ],
      "query": "foo bar -baz"
    }
  }
}

此搜索仅旨在返回包含 foobar 包含 baz 的文档。但是,由于 default_operatorOR,此搜索实际上会返回包含 foobar 的文档以及任何不包含 baz 的文档。要按预期返回文档,请将查询字符串更改为 foo bar +-baz

限制运算符

编辑

您可以使用 flags 参数来限制简单查询字符串语法支持的运算符。

要仅显式启用特定运算符,请使用 | 分隔符。例如,flags 值为 OR|AND|PREFIX 将禁用除 ORANDPREFIX 之外的所有运算符。

resp = client.search(
    query={
        "simple_query_string": {
            "query": "foo | bar + baz*",
            "flags": "OR|AND|PREFIX"
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      simple_query_string: {
        query: 'foo | bar + baz*',
        flags: 'OR|AND|PREFIX'
      }
    }
  }
)
puts response
const response = await client.search({
  query: {
    simple_query_string: {
      query: "foo | bar + baz*",
      flags: "OR|AND|PREFIX",
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "simple_query_string": {
      "query": "foo | bar + baz*",
      "flags": "OR|AND|PREFIX"
    }
  }
}
有效值
编辑

可用的标志如下:

ALL (默认)
启用所有可选运算符。
AND
启用 + AND 运算符。
ESCAPE
启用 \ 作为转义字符。
FUZZY
启用单词后的 ~N 运算符,其中 N 是表示匹配所允许的编辑距离的整数。请参阅模糊性
NEAR
启用短语后的 ~N 运算符,其中 N 是匹配词条之间允许的最大位置数。与 SLOP 同义。
NONE
禁用所有运算符。
NOT
启用 - NOT 运算符。
OR
启用 \| OR 运算符。
PHRASE
启用用于搜索短语的 " 引号运算符。
PRECEDENCE
启用 () 运算符以控制运算符优先级。
PREFIX
启用 * 前缀运算符。
SLOP
启用短语后的 ~N 运算符,其中 N 是匹配词条之间允许的最大位置数。与 NEAR 同义。
WHITESPACE
启用空格作为拆分字符。

fields 参数中的通配符和每个字段的提升

编辑

可以使用通配符指定字段,例如:

resp = client.search(
    query={
        "simple_query_string": {
            "query": "Will Smith",
            "fields": [
                "title",
                "*_name"
            ]
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      simple_query_string: {
        query: 'Will Smith',
        fields: [
          'title',
          '*_name'
        ]
      }
    }
  }
)
puts response
const response = await client.search({
  query: {
    simple_query_string: {
      query: "Will Smith",
      fields: ["title", "*_name"],
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "simple_query_string" : {
      "query":    "Will Smith",
      "fields": [ "title", "*_name" ] 
    }
  }
}

查询 titlefirst_namelast_name 字段。

可以使用插入符号 (^) 表示法来提升各个字段:

resp = client.search(
    query={
        "simple_query_string": {
            "query": "this is a test",
            "fields": [
                "subject^3",
                "message"
            ]
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      simple_query_string: {
        query: 'this is a test',
        fields: [
          'subject^3',
          'message'
        ]
      }
    }
  }
)
puts response
const response = await client.search({
  query: {
    simple_query_string: {
      query: "this is a test",
      fields: ["subject^3", "message"],
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "simple_query_string" : {
      "query" : "this is a test",
      "fields" : [ "subject^3", "message" ] 
    }
  }
}

subject 字段的重要性是 message 字段的三倍。

多位置词条

编辑

默认情况下,simple_query_string 查询解析器为查询字符串中的每个多位置词条创建match_phrase查询。例如,解析器为多词同义词 ny, new york 创建 match_phrase 查询:

(ny OR ("new york"))

要使用 AND 连接匹配多位置词条,请将 auto_generate_synonyms_phrase_query 设置为 false

resp = client.search(
    query={
        "simple_query_string": {
            "query": "ny city",
            "auto_generate_synonyms_phrase_query": False
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      simple_query_string: {
        query: 'ny city',
        auto_generate_synonyms_phrase_query: false
      }
    }
  }
)
puts response
const response = await client.search({
  query: {
    simple_query_string: {
      query: "ny city",
      auto_generate_synonyms_phrase_query: false,
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "simple_query_string": {
      "query": "ny city",
      "auto_generate_synonyms_phrase_query": false
    }
  }
}

对于上述示例,解析器会创建以下 bool 查询:

(ny OR (new AND york)) city)

bool 查询匹配包含词条 ny 或连接词 new AND york 的文档。