查询字符串查询编辑

此页面包含有关 query_string 查询类型的相关信息。有关在 Elasticsearch 中运行搜索查询的信息,请参阅 搜索 API

根据提供的查询字符串返回文档,使用具有严格语法的解析器。

此查询使用 语法 来解析和拆分提供的查询字符串,根据运算符(如 ANDNOT)进行拆分。然后,查询 分析 每个拆分的文本,然后再返回匹配的文档。

可以使用 query_string 查询来创建复杂的搜索,包括通配符字符、跨多个字段搜索等。虽然功能多样,但查询很严格,如果查询字符串包含任何无效语法,则会返回错误。

由于它会对任何无效语法返回错误,因此我们不建议将 query_string 查询用于搜索框。

如果您不需要支持查询语法,请考虑使用 match 查询。如果您需要查询语法的功能,请使用 simple_query_string 查询,它不太严格。

示例请求编辑

在运行以下搜索时,query_string 查询将 (new york city) OR (big apple) 拆分为两部分:new york citybig apple。然后,content 字段的分析器会独立地将每个部分转换为标记,然后再返回匹配的文档。由于查询语法不使用空格作为运算符,因此 new york city 会按原样传递给分析器。

resp = client.search(
    body={
        "query": {
            "query_string": {
                "query": "(new york city) OR (big apple)",
                "default_field": "content",
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      query_string: {
        query: '(new york city) OR (big apple)',
        default_field: 'content'
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "query_string": {
	      "query": "(new york city) OR (big apple)",
	      "default_field": "content"
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
GET /_search
{
  "query": {
    "query_string": {
      "query": "(new york city) OR (big apple)",
      "default_field": "content"
    }
  }
}

query_string 的顶级参数编辑

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

(可选,字符串) 如果查询字符串中未提供字段,则要搜索的默认字段。支持通配符 (*)。

默认为 index.query.default_field 索引设置,其默认值为 ** 值会提取所有适合术语查询的字段,并过滤元数据字段。如果未指定 prefix,则会将所有提取的字段组合起来构建查询。

跨所有符合条件的字段进行搜索不包括 嵌套文档。使用 nested 查询 来搜索这些文档。

对于具有大量字段的映射,跨所有符合条件的字段进行搜索可能会很昂贵。

一次可以查询的字段数乘以术语数存在限制。它由 indices.query.bool.max_clause_count 搜索设置 定义,其默认值为 4096。

allow_leading_wildcard
(可选,布尔值) 如果为 true,则允许通配符字符 *? 作为查询字符串的第一个字符。默认为 true
analyze_wildcard
(可选,布尔值) 如果为 true,则查询会尝试分析查询字符串中的通配符项。默认为 false
analyzer
(可选,字符串) 用于将查询字符串中的文本转换为标记的 分析器。默认为为 default_field 映射的 索引时分析器。如果未映射分析器,则使用索引的默认分析器。
auto_generate_synonyms_phrase_query
(可选,布尔值) 如果为 true,则会自动为多项同义词创建 匹配短语 查询。默认为 true。请参阅 同义词和 query_string 查询 以获取示例。
boost

(可选,浮点数) 用于降低或提高查询 相关性评分 的浮点数。默认为 1.0

提升值相对于 1.0 的默认值。提升值介于 01.0 之间会降低相关性评分。大于 1.0 的值会提高相关性评分。

default_operator

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

OR (默认)
例如,查询字符串 capital of Hungary 被解释为 capital OR of OR Hungary
AND
例如,查询字符串 capital of Hungary 被解释为 capital AND of AND Hungary
enable_position_increments
(可选,布尔值) 如果为 true,则在从 query_string 搜索构建的查询中启用位置增量。默认为 true
fields

(可选,字符串数组) 要搜索的字段数组。支持通配符 (*)。

可以使用此参数查询来跨多个字段进行搜索。请参阅 搜索多个字段

fuzziness
(可选,字符串) 允许的模糊匹配最大编辑距离。有关模糊语法,请参阅 模糊性
fuzzy_max_expansions
(可选,整数) 查询为模糊匹配扩展到的最大术语数。默认为 50
fuzzy_prefix_length
(可选,整数) 为模糊匹配保留不变的开头字符数。默认为 0
fuzzy_transpositions
(可选,布尔值) 如果为 true,则模糊匹配的编辑包括两个相邻字符的转置 (ab → ba)。默认为 true
lenient
(可选,布尔值) 如果为 true,则会忽略基于格式的错误,例如为 数字 字段提供文本值。默认为 false
max_determinized_states

(可选,整数) 查询所需的 自动机状态 最大数量。默认为 10000

Elasticsearch 在内部使用 Apache Lucene 来解析正则表达式。Lucene 会将每个正则表达式转换为包含一定数量确定性状态的有限自动机。

可以使用此参数来防止该转换意外消耗过多资源。您可能需要增加此限制才能运行复杂的正则表达式。

minimum_should_match
(可选,字符串) 为了使文档返回,必须匹配的子句的最小数量。请参阅 minimum_should_match 参数 以获取有效值和更多信息。请参阅 如何使用 minimum_should_match 以获取示例。
quote_analyzer

(可选,字符串) 用于将查询字符串中的引号文本转换为标记的 分析器。默认为为 default_field 映射的 search_quote_analyzer

对于引号文本,此参数会覆盖在 analyzer 参数中指定的分析器。

phrase_slop
(可选,整数) 允许匹配标记之间存在的最大位置数。默认为 0。如果为 0,则需要完全匹配短语。转置项的松弛度为 2
quote_field_suffix

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

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

rewrite
(可选,字符串) 用于重写查询的方法。有关有效值和更多信息,请参阅 rewrite 参数
time_zone

(可选,字符串) 用于将查询字符串中的 date 值转换为 UTC 的 协调世界时 (UTC) 偏移量IANA 时区

有效值为 ISO 8601 UTC 偏移量,例如 +01:00 或 -08:00,以及 IANA 时区 ID,例如 America/Los_Angeles

time_zone 参数 不会 影响 now日期数学 值。 now 始终是 UTC 中的当前系统时间。但是,time_zone 参数会转换使用 now日期数学舍入 计算的日期。例如,time_zone 参数会转换 now/d 的值。

注释编辑

查询字符串语法编辑

查询字符串“迷你语言”由 查询字符串search API 中的 q 查询字符串参数使用。

查询字符串被解析成一系列的术语运算符。术语可以是一个单词,例如quickbrown,也可以是一个短语,用双引号括起来,例如"quick brown",它会搜索短语中的所有单词,并且顺序相同。

运算符允许您自定义搜索,下面将解释可用的选项。

字段名称edit

您可以在查询语法中指定要搜索的字段

  • 其中status字段包含active

    status:active
  • 其中title字段包含quickbrown

    title:(quick OR brown)
  • 其中author字段包含确切的短语"john smith"

    author:"John Smith"
  • 其中first name字段包含Alice(注意,我们需要用反斜杠转义空格)

    first\ name:Alice
  • 其中任何字段book.titlebook.contentbook.date包含quickbrown(注意,我们需要用反斜杠转义*

    book.\*:(quick OR brown)
  • 其中title字段具有任何非空值

    _exists_:title
通配符edit

可以使用?替换单个字符,使用*替换零个或多个字符,对单个术语进行通配符搜索

qu?ck bro*

请注意,通配符查询可能会使用大量的内存,并且性能非常差,只需考虑一下要匹配查询字符串"a* b* c*"需要查询多少个术语。

纯通配符\*将被重写为exists查询,以提高效率。因此,通配符"field:*"将匹配具有空值的文档,例如以下文档

{
  "field": ""
}

...并且如果字段缺失或设置为显式空值,则不会匹配,例如以下文档

{
  "field": null
}

允许在单词开头使用通配符(例如"*ing")特别繁重,因为需要检查索引中的所有术语,以防它们匹配。可以通过将allow_leading_wildcard设置为false来禁用前导通配符。

仅应用在字符级别运行的分析链部分。例如,如果分析器同时执行小写化和词干提取,则仅应用小写化:对缺少某些字母的单词执行词干提取将是错误的。

通过将analyze_wildcard设置为true,以*结尾的查询将被分析,并且将通过确保前N-1个标记的精确匹配以及最后一个标记的前缀匹配来构建不同的标记的布尔查询。

正则表达式edit

可以通过将正则表达式模式用正斜杠("/")括起来,将其嵌入查询字符串中

name:/joh?n(ath[oa]n)/

支持的正则表达式语法在正则表达式语法中解释。

allow_leading_wildcard参数对正则表达式没有任何控制。以下查询字符串将强制Elasticsearch访问索引中的每个术语

/.*n/

谨慎使用!

模糊性edit

您可以使用~运算符运行fuzzy查询

quikc~ brwn~ foks~

对于这些查询,查询字符串将被规范化。如果存在,则仅应用分析器中的某些过滤器。有关适用过滤器的列表,请参见规范器

该查询使用Damerau-Levenshtein距离来查找最多有两个更改的所有术语,其中更改是指插入、删除或替换单个字符,或转置两个相邻字符。

默认的编辑距离2,但编辑距离为1应该足以捕获80%的人类拼写错误。它可以指定为

quikc~1

避免将模糊性与通配符混合使用

混合使用模糊通配符运算符不支持。混合使用时,不会应用其中一个运算符。例如,您可以搜索app~1(模糊)或app*(通配符),但搜索app*~1不会应用模糊运算符(~1)。

邻近搜索edit

虽然短语查询(例如"john smith")期望所有术语都以完全相同的顺序出现,但邻近查询允许指定的单词相距更远或以不同的顺序出现。与模糊查询可以为单词中的字符指定最大编辑距离的方式相同,邻近搜索允许我们为短语中的单词指定最大编辑距离

"fox quick"~5

字段中的文本越接近查询字符串中指定的原始顺序,该文档的相关性就越高。与上面的示例查询相比,短语"quick fox"将被认为比"quick brown fox"更相关。

范围edit

可以为日期、数字或字符串字段指定范围。包含范围用方括号[min TO max]指定,排除范围用花括号{min TO max}指定。

  • 2012 年的所有日期

    date:[2012-01-01 TO 2012-12-31]
  • 数字 1..5

    count:[1 TO 5]
  • 介于alphaomega之间的标签,不包括alphaomega

    tag:{alpha TO omega}
  • 从 10 开始的数字

    count:[10 TO *]
  • 2012 年之前的日期

    date:{* TO 2012-01-01}

花括号和方括号可以组合使用

  • 从 1 到 5(不包括 5)的数字

    count:[1 TO 5}

具有一个无界限侧的范围可以使用以下语法

age:>10
age:>=10
age:<10
age:<=10

要使用简化语法组合上限和下限,您需要使用AND运算符连接两个子句

age:(>=10 AND <20)
age:(+>=10 +<20)

查询字符串中范围的解析可能很复杂且容易出错。使用显式的range查询更可靠。

提升edit

使用提升运算符^使一个术语比另一个术语更相关。例如,如果我们要查找有关狐狸的所有文档,但我们特别感兴趣的是快速狐狸

quick^2 fox

默认的boost值为 1,但可以是任何正浮点数。介于 0 和 1 之间的提升会降低相关性。

提升也可以应用于短语或组

"john smith"^2   (foo bar)^4
布尔运算符edit

默认情况下,所有术语都是可选的,只要有一个术语匹配即可。搜索foo bar baz将找到包含foobarbaz中的一个或多个的任何文档。我们已经讨论过上面的default_operator,它允许您强制所有术语都是必需的,但还有布尔运算符,它们可以在查询字符串本身中使用,以提供更多控制。

首选的运算符是+(此术语必须存在)和-(此术语不能存在)。所有其他术语都是可选的。例如,此查询

quick brown +fox -news

说明

  • fox必须存在
  • news不能存在
  • quickbrown是可选的,它们的存在会提高相关性

熟悉的布尔运算符ANDORNOT(也写成&&||!)也受支持,但请注意,它们不遵守通常的优先级规则,因此在同时使用多个运算符时应使用括号。例如,前面的查询可以改写为

((quick AND fox) OR (brown AND fox) OR fox) AND NOT news
此形式现在正确地复制了原始查询中的逻辑,但相关性评分与原始查询几乎没有相似之处。

相反,使用match查询改写的相同查询将如下所示

{
    "bool": {
        "must":     { "match": "fox"         },
        "should":   { "match": "quick brown" },
        "must_not": { "match": "news"        }
    }
}
分组edit

可以使用括号将多个术语或子句组合在一起,形成子查询

(quick OR brown) AND fox

组可用于定位特定字段,或提升子查询的结果

status:(active OR pending) title:(full text search)^2
保留字符edit

如果您需要在查询本身(而不是作为运算符)中使用任何用作运算符的字符,则应使用前导反斜杠对其进行转义。例如,要搜索(1+1)=2,您需要将查询写成\(1\+1\)\=2。当使用 JSON 作为请求主体时,需要两个前导反斜杠(\\);反斜杠是 JSON 字符串中保留的转义字符。

response = client.search(
  index: 'my-index-000001',
  body: {
    query: {
      query_string: {
        query: 'kimchy\\!',
        fields: [
          'user.id'
        ]
      }
    }
  }
)
puts response
GET /my-index-000001/_search
{
  "query" : {
    "query_string" : {
      "query" : "kimchy\\!",
      "fields"  : ["user.id"]
    }
  }
}

保留字符为:+ - = && || > < ! ( ) { } [ ] ^ " ~ * ? : \ /

未能正确转义这些特殊字符可能会导致语法错误,从而阻止您的查询运行。

<> 无法转义。防止它们尝试创建范围查询的唯一方法是完全从查询字符串中删除它们。

空格和空查询edit

空格不被视为运算符。

如果查询字符串为空或仅包含空格,则查询将产生空结果集。

避免对嵌套文档使用 query_string 查询edit

query_string 搜索不会返回 嵌套 文档。要搜索嵌套文档,请使用 nested 查询

搜索多个字段edit

您可以使用 fields 参数在多个字段上执行 query_string 搜索。

对多个字段运行 query_string 查询的想法是将每个查询词扩展到一个 OR 子句,如下所示

field1:query_term OR field2:query_term | ...

例如,以下查询

resp = client.search(
    body={
        "query": {
            "query_string": {
                "fields": ["content", "name"],
                "query": "this AND that",
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      query_string: {
        fields: [
          'content',
          'name'
        ],
        query: 'this AND that'
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "query_string": {
	      "fields": [
	        "content",
	        "name"
	      ],
	      "query": "this AND that"
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
GET /_search
{
  "query": {
    "query_string": {
      "fields": [ "content", "name" ],
      "query": "this AND that"
    }
  }
}

与以下查询匹配相同单词

resp = client.search(
    body={
        "query": {
            "query_string": {
                "query": "(content:this OR name:this) AND (content:that OR name:that)"
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      query_string: {
        query: '(content:this OR name:this) AND (content:that OR name:that)'
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "query_string": {
	      "query": "(content:this OR name:this) AND (content:that OR name:that)"
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
GET /_search
{
  "query": {
    "query_string": {
      "query": "(content:this OR name:this) AND (content:that OR name:that)"
    }
  }
}

由于从各个搜索词生成多个查询,因此使用 dis_max 查询和 tie_breaker 自动组合它们。例如(name 使用 ^5 符号提升了 5 倍)

resp = client.search(
    body={
        "query": {
            "query_string": {
                "fields": ["content", "name^5"],
                "query": "this AND that OR thus",
                "tie_breaker": 0,
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      query_string: {
        fields: [
          'content',
          'name^5'
        ],
        query: 'this AND that OR thus',
        tie_breaker: 0
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "query_string": {
	      "fields": [
	        "content",
	        "name^5"
	      ],
	      "query": "this AND that OR thus",
	      "tie_breaker": 0
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
GET /_search
{
  "query": {
    "query_string" : {
      "fields" : ["content", "name^5"],
      "query" : "this AND that OR thus",
      "tie_breaker" : 0
    }
  }
}

简单的通配符也可以用于搜索文档中特定内部元素“内部”。例如,如果我们有一个带有几个字段(或带有字段的内部对象)的 city 对象,我们可以自动搜索所有“city”字段

resp = client.search(
    body={
        "query": {
            "query_string": {
                "fields": ["city.*"],
                "query": "this AND that OR thus",
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      query_string: {
        fields: [
          'city.*'
        ],
        query: 'this AND that OR thus'
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "query_string": {
	      "fields": [
	        "city.*"
	      ],
	      "query": "this AND that OR thus"
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
GET /_search
{
  "query": {
    "query_string" : {
      "fields" : ["city.*"],
      "query" : "this AND that OR thus"
    }
  }
}

另一种选择是在查询字符串本身中提供通配符字段搜索(正确转义 * 符号),例如:city.\*:something

resp = client.search(
    body={
        "query": {
            "query_string": {"query": "city.\\*:(this AND that OR thus)"}
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      query_string: {
        query: 'city.\\*:(this AND that OR thus)'
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "query_string": {
	      "query": "city.\\*:(this AND that OR thus)"
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
GET /_search
{
  "query": {
    "query_string" : {
      "query" : "city.\\*:(this AND that OR thus)"
    }
  }
}

由于 \(反斜杠)是 json 字符串中的特殊字符,因此需要转义它,因此上面的 query_string 中有两个反斜杠。

fields 参数还可以包含基于模式的字段名称,允许自动扩展到相关字段(包括动态引入的字段)。例如

resp = client.search(
    body={
        "query": {
            "query_string": {
                "fields": ["content", "name.*^5"],
                "query": "this AND that OR thus",
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      query_string: {
        fields: [
          'content',
          'name.*^5'
        ],
        query: 'this AND that OR thus'
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "query_string": {
	      "fields": [
	        "content",
	        "name.*^5"
	      ],
	      "query": "this AND that OR thus"
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
GET /_search
{
  "query": {
    "query_string" : {
      "fields" : ["content", "name.*^5"],
      "query" : "this AND that OR thus"
    }
  }
}
多字段搜索的附加参数edit

在对多个字段运行 query_string 查询时,支持以下附加参数。

type

(可选,字符串) 确定查询匹配和评分文档的方式。有效值为

best_fields (默认)
查找与任何字段匹配的文档,并使用任何匹配字段的最高 _score。见 best_fields
bool_prefix
在每个字段上创建一个 match_bool_prefix 查询,并组合每个字段的 _score。见 bool_prefix
cross_fields
将具有相同 analyzer 的字段视为一个大字段。在 任何 字段中查找每个单词。见 cross_fields
most_fields
查找与任何字段匹配的文档,并组合每个字段的 _score。见 most_fields
phrase
在每个字段上运行 match_phrase 查询,并使用最佳字段的 _score。见 phrasephrase_prefix
phrase_prefix
在每个字段上运行 match_phrase_prefix 查询,并使用最佳字段的 _score。见 phrasephrase_prefix

注意:根据 type 值,可能可以使用其他顶级 multi_match 参数。

同义词和 query_string 查询edit

query_string 查询支持使用 synonym_graph token 过滤器进行多词同义词扩展。使用此过滤器时,解析器会为每个多词同义词创建一个短语查询。例如,以下同义词:ny, new york 将产生

(ny OR ("new york"))

也可以使用连词匹配多词同义词

$params = [
    'body' => [
        'query' => [
            'query_string' => [
                'default_field' => 'title',
                'query' => 'ny city',
                'auto_generate_synonyms_phrase_query' => false,
            ],
        ],
    ],
];
$response = $client->search($params);
resp = client.search(
    body={
        "query": {
            "query_string": {
                "default_field": "title",
                "query": "ny city",
                "auto_generate_synonyms_phrase_query": False,
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      query_string: {
        default_field: 'title',
        query: 'ny city',
        auto_generate_synonyms_phrase_query: false
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "query_string": {
	      "default_field": "title",
	      "query": "ny city",
	      "auto_generate_synonyms_phrase_query": false
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
const response = await client.search({
  body: {
    query: {
      query_string: {
        default_field: 'title',
        query: 'ny city',
        auto_generate_synonyms_phrase_query: false
      }
    }
  }
})
console.log(response)
GET /_search
{
   "query": {
       "query_string" : {
           "default_field": "title",
           "query" : "ny city",
           "auto_generate_synonyms_phrase_query" : false
       }
   }
}

上面的示例创建了一个布尔查询

(ny OR (new AND york)) city

它匹配包含 ny 项或 new AND york 连词的文档。默认情况下,参数 auto_generate_synonyms_phrase_query 设置为 true

minimum_should_match 的工作原理edit

query_string 在每个运算符周围拆分查询,以创建整个输入的布尔查询。您可以使用 minimum_should_match 来控制结果查询中应该匹配多少个“should”子句。

resp = client.search(
    body={
        "query": {
            "query_string": {
                "fields": ["title"],
                "query": "this that thus",
                "minimum_should_match": 2,
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      query_string: {
        fields: [
          'title'
        ],
        query: 'this that thus',
        minimum_should_match: 2
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "query_string": {
	      "fields": [
	        "title"
	      ],
	      "query": "this that thus",
	      "minimum_should_match": 2
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
GET /_search
{
  "query": {
    "query_string": {
      "fields": [
        "title"
      ],
      "query": "this that thus",
      "minimum_should_match": 2
    }
  }
}

上面的示例创建了一个布尔查询

(title:this title:that title:thus)~2

它匹配在单个字段 title 中至少包含两个词 thisthatthus 的文档。

minimum_should_match 在多个字段上的工作原理edit

resp = client.search(
    body={
        "query": {
            "query_string": {
                "fields": ["title", "content"],
                "query": "this that thus",
                "minimum_should_match": 2,
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      query_string: {
        fields: [
          'title',
          'content'
        ],
        query: 'this that thus',
        minimum_should_match: 2
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "query_string": {
	      "fields": [
	        "title",
	        "content"
	      ],
	      "query": "this that thus",
	      "minimum_should_match": 2
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
GET /_search
{
  "query": {
    "query_string": {
      "fields": [
        "title",
        "content"
      ],
      "query": "this that thus",
      "minimum_should_match": 2
    }
  }
}

上面的示例创建了一个布尔查询

((content:this content:that content:thus) | (title:this title:that title:thus))

它匹配在字段 titlecontent 上进行 disjunction max 的文档。这里无法应用 minimum_should_match 参数。

resp = client.search(
    body={
        "query": {
            "query_string": {
                "fields": ["title", "content"],
                "query": "this OR that OR thus",
                "minimum_should_match": 2,
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      query_string: {
        fields: [
          'title',
          'content'
        ],
        query: 'this OR that OR thus',
        minimum_should_match: 2
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "query_string": {
	      "fields": [
	        "title",
	        "content"
	      ],
	      "query": "this OR that OR thus",
	      "minimum_should_match": 2
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
GET /_search
{
  "query": {
    "query_string": {
      "fields": [
        "title",
        "content"
      ],
      "query": "this OR that OR thus",
      "minimum_should_match": 2
    }
  }
}

添加显式运算符会强制将每个词视为单独的子句。

上面的示例创建了一个布尔查询

((content:this | title:this) (content:that | title:that) (content:thus | title:thus))~2

它匹配至少包含三个“should”子句中的两个的文档,每个子句都是每个词的字段上的 disjunction max。

minimum_should_match 在跨字段搜索中的工作原理edit

type 字段中的 cross_fields 值表示在分析输入时,具有相同分析器的字段将分组在一起。

resp = client.search(
    body={
        "query": {
            "query_string": {
                "fields": ["title", "content"],
                "query": "this OR that OR thus",
                "type": "cross_fields",
                "minimum_should_match": 2,
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      query_string: {
        fields: [
          'title',
          'content'
        ],
        query: 'this OR that OR thus',
        type: 'cross_fields',
        minimum_should_match: 2
      }
    }
  }
)
puts response
res, err := es.Search(
	es.Search.WithBody(strings.NewReader(`{
	  "query": {
	    "query_string": {
	      "fields": [
	        "title",
	        "content"
	      ],
	      "query": "this OR that OR thus",
	      "type": "cross_fields",
	      "minimum_should_match": 2
	    }
	  }
	}`)),
	es.Search.WithPretty(),
)
fmt.Println(res, err)
GET /_search
{
  "query": {
    "query_string": {
      "fields": [
        "title",
        "content"
      ],
      "query": "this OR that OR thus",
      "type": "cross_fields",
      "minimum_should_match": 2
    }
  }
}

上面的示例创建了一个布尔查询

(blended(terms:[field2:this, field1:this]) blended(terms:[field2:that, field1:that]) blended(terms:[field2:thus, field1:thus]))~2

它匹配至少包含三个每个词混合查询中的两个的文档。

允许昂贵的查询edit

查询字符串查询可以在内部转换为 prefix query,这意味着如果前缀查询被禁用,如 此处 所述,则查询将不会执行,并且会抛出异常。