本文是query-string-syntax的翻译。
关于query string语法
在搜索API中,可以使用query string进行查询,整个query string在API中,做为一个参数
一个query string可以被分解成多个条件和操作符,一个条件可以是一个词语,短语,或者是由"包起来的全字匹配的字符串。
通过操作符组合条件,我们可以进行各种复杂的查询
过滤Document的字段
可以通过以下示例的语句,过滤指定的字段
- 要求
status字段包含active
status:active
- 要求
title字段包含quick或者brown
title:(quick OR brown)
- 要尔
author字段包括有john smith这个整体,单独包含John或者Smith都不算
author:"John Smith"
- 要求
first name字段包含Alice(注意我们处时字段中有空格时的场景,使用 \ 做转义)
first\ name:Alice
- 元素
book下的字段,如book.title,book.content或者book.date包含有quickorbrown(请注意,我们使用\来转义*):
book.\*:(quick OR brown)
- 要求字段的字不是null,即有这个字段
_exists_:title
通配符
在搜索term时,可以使用?来表示存在一个字符串,或者\*来表示一个或多个字符串。示例如下:
qu?ck bro*
通配符的使用,会增加内存消耗,并大大的降底程序的查询效率,想像一相,但我们查询"a* b* c*"时,需要匹配多term
Pure wildcards * are rewritten to exists queries for efficiency. As a consequence, the wildcard “field:*” would match documents with an empty value like the following:
{ "field": "" }`… and would not match if the field is missing or set with an explicit null value like the following: { “field”: null }
模糊搜索
我们有需要搜索一些相似的词,而不是精确的包含,这时可以使用“fuzzy”operator。
比如:
quikc~ brwn~ foks~
ElasticSearch使用 Damerau-Levenshtein distance 来确认2个词语的不同点,最多只能有2个不一致。
默认的编辑距离是2,不过如果编辑距离是1,我们能处理80%的人为拼写错误产生的模糊搜索。
比如把quick拼错成quikc
不要在模糊搜索中使用通配符 当模糊搜索遇到通配符时,只有一个操作生效, 比如, 你可以搜索
app~1(模糊搜索) 或者app*(通配符), 但搜索app*~1不会触发模糊搜索 .
区间搜索
区间可以作用于日期,数字,或者字符串字段。区间包括边界时通过[和]将最小值与最大值包围起来,其格式为[最小值 TO 最大值],当不包括边界时,使用{最小值 TO 最大值}表示。
具体示例如下:
- 表示2012年的所有天:
date:[2012-01-01 TO 2012-12-31]
- 从1到5的数字:
count:[1 TO 5]
- 从alpha 到 omega 的标签,但不包括alpha 和 omega:
tag:{alpha TO omega}
- 大于10的数字:
count:[10 TO *]
- 2012以前的日期:
date:{* TO 2012-01-01}
[,]与{,}混合使用:
Numbers from 1 up to but not including 5
count:[1 TO 5}
- 对于只限制一个边界的区域,可以使用如下的方式表达:
age:>10
age:>=10
age:<10
age:<=10
同时支持多个查询条件
使用OR, AND将多个查询条件连接,可以支持或与与的联合查询,
如下查询表示:level字段为info或者warning,并且msg字段的内容,包括有Success
(level:info OR level:warning) AND msg:Success