查询字符串语法

查询字符串语法 #

Easysearch 的 query_stringsimple_query_string 查询底层使用 Lucene 查询解析器(Query Parser)将查询字符串解析为查询对象。本页详细描述查询解析器支持的完整语法。

相关指南 #


词项(Terms) #

查询字符串由词项操作符组成。词项有两种类型:

  • 单个词项:一个单词,如 testhello
  • 短语:用双引号包围的一组词,如 "hello dolly"

多个词项可以通过布尔操作符组合成更复杂的查询。

注意:查询字符串中的词项和短语会经过索引时使用的相同分析器处理。因此,选择不会干扰查询词项的分析器非常重要。


字段(Fields) #

Easysearch 支持按字段搜索。搜索时可以指定字段名,也可以使用默认字段。

语法为字段名后跟冒号 :,然后是要搜索的词项:

title:"The Right Way" AND content:go

上面的查询在 title 字段中查找短语 “The Right Way”,在 content 字段中查找词 “go”。

注意:字段指示符仅对其直接前面的词项有效。例如:

title:Do it right

只有 “Do” 在 title 字段中搜索,“it” 和 “right” 将在默认字段中搜索。


词项修饰符 #

通配符搜索 #

支持单字符和多字符通配符:

通配符含义示例
?匹配任意单个字符te?t → 匹配 testtext
*匹配零个或多个字符test* → 匹配 testteststester

通配符可以出现在词项中间:

te*t

注意:不能将 *? 作为搜索词的第一个字符(性能原因)。如果需要左通配符匹配,考虑使用 通配符字段类型(Wildcard)

模糊搜索 #

模糊搜索基于 Damerau-Levenshtein 编辑距离算法,能找到拼写相似的词项。在词项末尾加波浪号 ~ 即可启用:

roam~

这会匹配 foamroams 等拼写相近的词。

可以指定编辑距离参数(0~2),值越大匹配越宽松:

roam~1

默认编辑距离为 2。

邻近搜索 #

邻近搜索查找彼此在指定距离内的词。在短语末尾加 ~ 和距离值:

"jakarta apache"~10

这会查找 “jakarta” 和 “apache” 在 10 个词距离内出现的文档。

范围搜索 #

范围搜索匹配字段值在指定上下界之间的文档:

语法含义示例
[min TO max]包含边界(闭区间)date:[2020-01-01 TO 2020-12-31]
{min TO max}排除边界(开区间)title:{Aida TO Carmen}
[min TO max}左闭右开count:[1 TO 100}
{min TO max]左开右闭count:{0 TO 100]

范围搜索不限于日期字段,也适用于数值和字符串字段:

age:[18 TO 65]
title:{Alpha TO Omega}

使用通配符表示无上限或无下限:

age:[18 TO *]
age:{* TO 65]

权重提升(Boosting) #

使用 ^ 符号和提升因子来控制词项的相关性权重:

jakarta^4 apache

这会使包含 “jakarta” 的文档更相关。短语也可以提升权重:

"jakarta apache"^4 "Apache Lucene"

默认提升因子为 1。提升因子必须为正数,但可以小于 1(如 0.2)。


布尔操作符 #

布尔操作符用于组合多个词项的逻辑关系。

注意:布尔操作符关键字必须全部大写

OR(默认操作符) #

OR 是默认的连接操作符。如果两个词项之间没有布尔操作符,则使用 OR。可以用 || 替代:

"jakarta apache" jakarta
"jakarta apache" OR jakarta

匹配包含任意一个词项的文档。

AND #

AND 操作符要求两个词项都存在于文档中。可以用 && 替代:

"jakarta apache" AND "Apache Lucene"

NOT #

NOT 操作符排除包含指定词项的文档。可以用 ! 替代:

"jakarta apache" NOT "Apache Lucene"

注意NOT 不能单独使用。以下查询不会返回任何结果:

NOT "jakarta apache"

必须出现(+) #

+ 操作符要求其后的词项必须存在于文档中:

+jakarta lucene

匹配必须包含 “jakarta”、可选包含 “lucene” 的文档。

必须不出现(-) #

- 操作符排除包含其后词项的文档:

"jakarta apache" -"Apache Lucene"

操作符总结 #

操作符等价符号含义
OR\|\|任一词项匹配即可(默认)
AND&&所有词项都必须匹配
NOT!排除包含该词项的文档
+该词项必须出现
-该词项必须不出现

分组(Grouping) #

使用括号 () 对子句进行分组,控制布尔逻辑的优先级:

(jakarta OR apache) AND website

这确保 “website” 必须存在,同时 “jakarta” 或 “apache” 至少存在一个。

字段分组 #

对同一字段的多个子句进行分组:

title:(+return +"pink panther")

这会在 title 字段中查找同时包含 “return” 和 “pink panther” 的文档。


转义特殊字符 #

以下字符在查询语法中有特殊含义,如果要按字面值匹配,需要用反斜杠 \ 转义:

+ - && || ! ( ) { } [ ] ^ " ~ * ? : \

例如,搜索 (1+1):2

\(1\+1\)\:2

在 Easysearch 中使用 #

query_string 查询 #

GET articles/_search
{
  "query": {
    "query_string": {
      "default_field": "content",
      "query": "title:(Easysearch AND 教程) AND date:[2025-01-01 TO 2025-12-31]"
    }
  }
}

simple_query_string 查询 #

simple_query_string 使用简化的语法,不会因语法错误而报错:

操作符query_stringsimple_query_string
ANDAND&&+
OROR\|\|\|
NOTNOT!-
短语"...""..."
前缀term*term*
模糊term~Nterm~N
邻近"..."~N"..."~N
分组(...)(...)
字段指定field:term❌ 不支持
范围[min TO max]❌ 不支持
正则/pattern/❌ 不支持
提升term^N❌ 不支持

常用查询示例 #

# 多字段搜索
title:Easysearch AND content:"搜索引擎"

# 模糊匹配 + 邻近搜索
serach~1 AND "全文 搜索"~3

# 范围 + 通配符
date:[2025-01-01 TO *] AND author:张*

# 必须/可选/排除
+Easysearch +搜索 -Elasticsearch

# 分组 + 权重提升
(title:搜索引擎^3 OR content:搜索引擎) AND status:published

注意事项 #

注意项说明
大小写布尔操作符(ANDORNOT)必须全大写,否则被当作普通词项
分析器查询字符串中的词项会经过字段的分析器处理,确保分析器配置正确
默认操作符默认使用 OR,可以通过 default_operator 参数改为 AND
错误处理query_string 对语法错误严格报错,面向终端用户建议使用 simple_query_string
性能避免前导通配符(*keyword),会触发全量词项扫描
嵌套文档query_string 不会返回嵌套文档,需使用 nested 查询