Elasticsearch 提供了丰富的 Query 类型,以满足各种搜索需求。以下列举一些常见的 Query 类型,并分析其区别和应用场景:
一、 几个常用的基本Query
1. Term Query
- 应用场景: 查找包含特定词语的文档,适合精确匹配单个词语的场景。
- 特点: 与其他 Query 相比,Term Query 要求完全匹配目标词语。
- 语法示例:
{ "query": { "term": { "``title``": "apple" } } }
- 该示例将匹配所有
title
字段值为 "apple" 的文档。
- 该示例将匹配所有
2. Match Query
- 应用场景: 查找包含与目标词语相似或相关的词语的文档,适合模糊匹配文本。
- 特点: Match Query 允许部分匹配和词形变化,可以理解为对 Term Query 的扩展。
- 语法示例:
{ "query": { "match": { "title": "iphone" } } }
- 该示例将匹配包含 "iphone"、"iPhones"、"iPhone" 等词语的文档。
3. Match Phrase Query
- 应用场景: 查找包含特定短语的文档,要求短语中的词语顺序必须一致。
- 特点: 不同于 Match Query 允许词序变化,Match Phrase Query 需要精确匹配短语中的所有词语,并保持其顺序。
- 语法示例:
{ "query": { "match_phrase": { "description": "apple iphone 15" } } }
- 该示例将匹配包含 "apple iphone 15" 这个完整短语的文档。
4. Wildcard Query
- 应用场景: 查找包含特定模式的词语的文档,支持使用 "*" 和 "?" 通配符,类似SQL中的LIKE。
- 特点: Wildcard Query 允许使用通配符匹配多个字符,灵活度更高,但这个查询效率比较较低,影响ES的性能,所以非必要是不建议用Wildcard Query的。
- 语法示例:
{ "query": { "wildcard": { "``title``": "app*" } } }
- 该示例将匹配所有以 "app" 开头的
title
字段值,例如 "apple"、"appliance" 等。
- 该示例将匹配所有以 "app" 开头的
5. Prefix Query
- 应用场景: 查找包含以特定前缀开头的词语的文档。
- 特点: Prefix Query 只匹配以特定前缀开头的词语,效率更高。
- 语法示例:
{ "query": { "prefix": { "title": "app" } } }
- 该示例将匹配所有以 "app" 开头的
title
字段值,例如 "apple"、"appliance" 等。
- 该示例将匹配所有以 "app" 开头的
6. Range Query
- 应用场景: 查找满足特定条件的数值或日期范围的文档。
- 特点: Range Query 可以指定数值或日期范围,并使用 "gte"、"gt"、"lte"、"lt" 等参数控制范围。
- 语法示例:
{ "query": { "range": { "price": { "gte": 100, "lte": 200 } } } }
- 该示例将匹配所有 price 字段值在 100 到 200 之间的文档。
二、 复杂查询构造
-
Bool Query: 可以组个多个query,同时使用 "must", "should", "must_not" 构建复杂条件查询,例如查找所有价格在 100 元到 200 元之间且标题为 "
apple
" 的产品。- 语法示例:
{ "query": { "bool": { "must": [ { "range": { "price": { "gte": 100, "lte": 200 } } }, { "term": { "title": "apple" } } ] } } }
-
Exists Query: 检查字段是否存在,查找包含特定字段的文档,例如查找所有包含 "description" 字段的文档。
- 语法示例:
{ "query": { "exists": { "field": "description" } } }
-
Missing Query: 与上面相反检查字段是否不存在,查找不包含特定字段的文档,例如查找所有不包含 "description" 字段的文档。。
- 语法示例:
{ "query": { "missing": { "field": "description" } } }
三、 几个特殊场景的 Query
-
Geo Distance Query: 查找按地理位置距离查找,例如查找距离用户当前位置 10 公里内的商店。
- 语法示例:
{ "query": { "geo_distance": { "distance": "10km", "location": { "lat": 40.7128, "lon": -74.0060 } } } }
-
Nested Query: 对嵌套对象进行查询,例如查询每个用户的订单信息。
- 语法示例:
{ "query": { "nested": { "path": "orders", "query": { "match": { "orders.product": "apple" } } } } }
-
Regexp Query: 使用正则表达式进行匹配,例如下面是一个查找所有包含电子邮件地址的例子。
- 语法示例:
{ "query": { "regexp": { "email": ".+@.+\\..+" } } }
-
Fuzzy Query: 查找包含与目标词语相似或相关的词语的文档,例如查找所有包含 "appl" 或 "apple" 的产品。
- 语法示例:
{ "query": { "fuzzy": { "title": { "value": "iphon", "fuzziness": 1 } } } }
四、 QueryString 和 Simple Query String
这两个query可以根据条件构建定制化的查询条件
-
QueryString Query: 支持使用 Lucene 语法进行复杂查询。
- 语法示例:
{ "query": { "query_string": { "query": "brand:Apple AND price:[100 TO 200]" } } }
- 应用场景: 自定义复杂查询条件,例如使用 "AND" 或 "OR" 连接多个条件。
-
Simple Query String Query: 简化的查询语法,支持基础的逻辑操作。
- 语法示例:
{ "query": { "simple_query_string": { "query": "apple price > 100" } } }
- 应用场景: 简单查询,例如查找包含 "apple" 并且价格大于 100 的产品。
选择合适的 Query 类型取决于具体的搜索需求,建议根据数据结构和搜索目的选择合适的 Query 类型,以提高查询效率和准确性。希望本文能帮助你更好地理解 Elasticsearch 中的 Query 类型,并灵活运用这些 Query 类型进行高效的搜索。