Elasticsearch的URI Search(简单查询字符串)是一种直接在HTTP请求的URL中指定查询条件的查询方式,适用于快速测试和简单的查询场景。以下是如何使用URI Search进行简单查询字符串查询的实战示例:
基本结构
URI Search的基本结构如下:
GET /<index>/_search?q=<query_string>
其中:
-
<index>
:要查询的Elasticsearch索引名,可以是单个索引名或索引名的逗号分隔列表。 -
<query_string>
:包含查询条件的字符串,遵循特定的查询语法。
查询字符串语法
查询字符串支持多种查询表达式,包括:
词语查询(Term Query)
查询单个词或短语,多个词之间默认采用逻辑“或”(OR)连接:
GET /movies/_search?q=action adventure
此查询会返回标题中包含“action”或“adventure”的电影文档。
精确短语查询(Phrase Query)
查询连续的短语,用双引号包围:
GET /movies/_search?q="star wars"
此查询会返回标题中包含完整短语“star wars”的电影文档。
布尔运算
使用AND
、OR
、NOT
(或+
、-
、|
)进行布尔逻辑组合:
GET /movies/_search?q=title:(action AND adventure) NOT science-fiction
或
GET /movies/_search?q=title:(+action +adventure -science-fiction)
此查询会返回标题中同时包含“action”和“adventure”,但不包含“science-fiction”的电影文档。
字段限定
通过字段名前缀指定查询字段:
GET /movies/_search?q=title:action OR description:action
此查询会返回标题中包含“action”或描述中包含“action”的电影文档。
通配符与模糊查询
使用*
作为通配符,~
进行模糊查询:
GET /movies/_search?q=title:batt*
此查询会返回标题以“batt”开头的所有电影文档。
GET /movies/_search?q=title:batman~1
此查询会返回标题与“batman”相差不超过一个字符的电影文档。
分组与优先级
使用小括号()
进行分组,改变查询的优先级:
GET /movies/_search?q=(superhero OR superheroine) AND (action OR adventure)
此查询会返回同时包含“superhero”或“superheroine”,以及“action”或“adventure”的电影文档,确保两个条件都满足。
其他参数
除了查询字符串q
,URI Search还可以配合其他参数进一步定制查询行为:
df
:默认字段(default field),当查询字符串中没有明确指定字段时,查询将作用于此字段。例如:
GET /movies/_search?q=matrix&df=title
如果查询字符串中不含字段名前缀,此查询将在“title”字段中查找“matrix”。
analyzer
:指定查询字符串使用的分析器,影响查询词汇如何被解析和匹配:
GET /movies/_search?q=matrix&analyzer=english
使用“english”分析器处理查询字符串。
示例总结
使用Elasticsearch的URI Search进行简单查询字符串查询时,只需在HTTP请求的URL中构造符合查询语法的查询字符串。这种方式直观易用,适合快速测试和简单查询。然而,对于复杂的查询逻辑、排序、聚合等功能,建议使用更强大的Request Body Search(即通过请求体提交JSON查询DSL)。