Elasticsearch-Query string query

此查询使用语法根据运算符(例如 ANDNOT)解析和拆分提供的查询字符串。 查询然后在返回匹配文档之前独立分析每个拆分文本。

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

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

需要详细了解每个Query string query细节,可以参考官网API:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html?baymax=rec&rogue=pop-1&elektra=docs

总结一下其中比较重要的几点:

Query string syntax

查询字符串被解析为一系列termsoperators。 一个term可以是单个词 --- quickbrown --- 或被双引号括起来的词组 --- “quick brown” --- ,它以相同的顺序搜索词组中的所有词。

运算符允许您自定义搜索 -- 可用选项如下所述。

Field names

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

  • where the status field contains active
    status:active
  • where the title field contains quick or brown
    title:(quick OR brown)
  • where the author field contains the exact phrase "john smith"
    author:"John Smith"
  • where the first name field contains Alice (note how we need to escape the space with a backslash)
    first\ name:Alice
  • where any of the fields book.title, book.content or book.date contains quick or brown (note how we need to escape the *with a backslash):
    book.\*:(quick OR brown)
  • where the field title has any non-null value:
    _exists_:title

Wildcards

通配符搜索可以使用 ? 替换单个字符,* 替换零个或多个字符:
qu?ck bro*

请注意,通配符查询会占用大量内存并且性能非常差 — 只需考虑需要查询多少个terms才能匹配查询字符串“a* b* c*”.

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

Regular expressions

正则表达式模式可以通过将它们包装在正斜杠(“/”)中来嵌入到查询字符串中:
name:/joh?n(ath[oa]n)/

allow_leading_wildcard 参数对正则表达式没有任何控制。 如下查询字符串将强制 Elasticsearch 访问索引中的每个term/.*n/,谨慎使用!

Fuzziness

我们可以使用“模糊”运算符搜索与我们的搜索词相似但不完全相同的词:quikc~ brwn~ foks~
默认的编辑距离2,但1的编辑距离应该足以捕获所有人类拼写错误的80%。 它可以指定为:
quikc~1

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

Proximity searches

虽然短语查询(例如“john smith”)期望所有词条的顺序完全相同,但邻近查询允许指定的词相距更远或以不同的顺序排列。 与模糊查询可以指定单词中字符的最大编辑距离相同,邻近搜索允许我们指定短语中单词的最大编辑距离:
“fox quick”~5
字段中的文本与查询字符串中指定的原始顺序越接近,则认为该文档越相关。 与上面的示例查询相比,短语“quick fox”将被认为比“quick brown fox”更相关。

Ranges

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

  • All days in 2012:
    date:[2012-01-01 TO 2012-12-31]
  • Numbers 1..5
    count:[1 TO 5]
  • Tags between alpha and omega, excluding alpha and omega:
    tag:{alpha TO omega}
  • Numbers from 10 upwards
    count:[10 TO *]
  • Dates before 2012
    date:{* TO 2012-01-01}
    要将上限和下限与简化语法结合,您需要使用 AND 运算符连接两个子句:
    age:(>=10 AND <20)
    age:(+>=10 +<20)

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

Boolean operators

首选运算符是 +(该术语必须存在)和 -(该术语不得存在)。 所有其他条款都是可选的。 例如,这个查询:
quick brown +fox -news
语义是:

  • fox must be present
  • news must not be present
  • quick and brown are optional — their presence increases the relevance

也支持相似的布尔运算符 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"        }
    }
}

Grouping

多个术语或子句可以用括号组合在一起,形成子查询:
(quick OR brown) AND fox
组可用于定位特定字段,或提升子查询的结果:
status:(active OR pending) title:(full text search)^2

Reserved characters

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

GET /my-index-000001/_search
{
  "query" : {
    "query_string" : {
      "query" : "kimchy\\!",
      "fields"  : ["user.id"]
    }
  }
}

需要转义的字符有:
+ - = && || > < ! ( ) { } [ ] ^ " ~ * ? : \ /

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

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

Whitespaces and empty queries

空格不被视为运算符。如果查询字符串为空或仅包含空格,则查询将产生一个空结果集。

Avoid using the query_string query for nested documents

query_string searches do not return nested documents. To search nested documents, use the nested query.

Search multiple fields

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

对多个字段运行 query_string 查询的想法是将每个查询词扩展为一个 OR 子句,如下所示:
field1:query_term OR field2:query_term | ...
For example, the following query

GET /_search
{
  "query": {
    "query_string": {
      "fields": [ "content", "name" ],
      "query": "this AND that"
    }
  }
}

匹配相同单词是:

GET /_search
{
  "query": {
    "query_string": {
      "query": "(content:this OR name:this) AND (content:that OR name:that)"
    }
  }
}

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

GET /_search
{
  "query": {
    "query_string" : {
      "fields" : ["city.*"],
      "query" : "this AND that OR thus"
    }
  }
}

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

GET /_search
{
  "query": {
    "query_string" : {
      "query" : "city.\\*:(this AND that OR thus)"
    }
  }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容