根据查询字符串进行查询,Elasticsearch使用严格语法进行解析。查询字符串基于操作符(如AND,OR)对提供的查询字符串进行分割、解析,接着对每一个分割文本进行分析,最后组合作为条件进行查询。
1. 查询字符串介绍
可以使用query_string
查询创建复杂查询,包括通配符字符,跨多个字段查询等。功能非常强大,但如果提供的语法无效会返回错误。
query_string
示例如下:
GET /_search
{
"query": {
"query_string": {
"query": "(new york city) OR (big apple)",
"default_field": "content"
}
}
}
该查询首先分割(new york city) OR (big apple)
为两个部分new york city
和 big apple
。
content
字段分析器然后分别把它们转换为多个分词(token)。最终根据这些分词组合条件进行查询返回结果。
2. 查询字符串语法
下面介绍常用的语法。
2.1 根据字段名称查询
status
包含"active"单词:
status:active
title
字段包括"quick" 或 “brown”。如果你忽略OR操作符,则使用缺省操作。缺省操作即或操作。
title:(quick OR brown)
title:(quick brown)
title:(quick AND brown)
author
字段包含完整词组"John Smith":
author:"John Smith"
三个字段 “book.title”, “book.content” , “book.date” 中任何一个包括 quick 或 brown (注意这里*号可能需要转义符\
):
book.*:(quick brown)
查找 “title” 字段缺失值的文档 (或没有该字段):
_missing_:title
查找 “title” 字段没有空值的文档:
_exists_:title
2.2 模糊查询
模糊查询可用于单个词组,使用?
表示单个字符,*
表示零个或多个字符:
qu?ck bro*
注意:模糊查询需要使用大量内存,执行效率低。
2.3 正则查询
可以在查询字符串中嵌入正则表达式,需要使用 ("/")包裹表达式:
name:/joh?n(ath[oa]n)/
2.4 分组查询
多个单词或子句可以使用圆括号进行分组形成子查询:
(quick OR brown) AND fox
分组可用于特定字段,或提升子查询的评分:
status:(active OR pending) title:(full text search)^2
2.5 范围查询
可以对date, numeric 或 string 字段进行范围查询。
包括边界使用方括号:[min TO max] ,排除边界使用花括号:{min TO max}.
查询 2012年所有填:
date:[2012-01-01 TO 2012-12-31]
查询数值 1…5
count:[1 TO 5]
查询alpha 和 omega之间的tag,不包括两者:
tag:{alpha TO omega}
查询10以上的范围:
count:[10 TO *]
查询2012年之前的日期:
date:{* TO 2012-01-01}
查询1到5,但不包括5:
count:[1 TO 5}
2.6 布尔操作
- (该单词必须存在) - (该单词必须不存在)
所有其他的单词可选:
quick brown +fox -news
3. 简单查询字符串
简单查询字符串的语法是查询字符串的限制版本,且对于无效语法不返回错误信息,它忽略查询字符串中无效部分。
示例:
GET /_search
{
"query": {
"simple_query_string" : {
"query": "\"fried eggs\" +(eggplant | potato) -frittata",
"fields": ["title^5", "body"],
"default_operator": "and"
}
}
}
详细语法可参考官方文档。
4. 总结
利用查询字符串可以创建强大的高级查询,但语法较为复杂,如果不需要支持查询语法,可以考虑使用match查询。如果需要查询语法的特性,可以使用simple_query_string查询,它没有严格要求。
本文参考链接:https://blog.csdn.net/neweastsun/article/details/113804235