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”的电影文档。

布尔运算

使用ANDORNOT(或+-|)进行布尔逻辑组合:

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)。