Easysearch 提供了一种名为查询领域特定语言 (DSL) 的搜索语言,您可以使用它来搜索数据。查询 DSL 是一种灵活的语言,具有 JSON 接口。
使用查询 DSL,你需要在搜索的 query 参数中指定查询。Easysearch 中最简单的搜索之一是使用 match_all 查询,它匹配索引中的所有文档:
GET testindex/_search
{
"query": {
"match_all": {
}
}
}
一个查询可以由多个查询子句组成。您可以组合查询子句来生成复杂的查询。
广义上,您可以将查询分为两类 - 叶子查询和复合查询 :
叶子( Leaf )查询 :叶查询用于在一个或多个特定字段中搜索指定值。您可以单独使用叶查询。它们包括以下查询类型:
全文检索 :使用全文检索来搜索文本文档。对于已分析的文本字段搜索,全文检索会使用与字段索引时相同的分析器将查询字符串拆分为多个术语。对于精确值搜索,全文检索会查找指定的值,而不应用文本分析。
精确查询 :使用精确查询在文档中搜索精确词,例如 ID 或值范围。精确查询不会分析搜索词,也不会按相关性得分对结果进行排序。
地理查询和 xy 查询 :使用地理查询搜索包含地理数据的文档。使用 xy 查询搜索包含二维坐标系中的点和形状的文档。
关联查询:使用关联查询来搜索嵌套字段或返回与特定查询匹配的父文档和子文档。关联查询的类型包括 nested 、 has_child 、 has_parent 和 parent_id 查询。
Span 查询 :使用 Span 查询执行精确的位置搜索。Span 查询是低级、特定的查询,可以控制指定查询词的顺序和接近度。它们主要用于搜索法律文件。
专门查询 :专门查询包括所有其他查询类型( distance_feature 、 more_like_this 、 percolate 、 rank_feature 、 script 、 script_score 和 wrapper )。
复合查询 :复合查询可作为多个叶级子句或复合子句的包装器,用于合并其结果或修改其行为。它们包括布尔值、析取最大值、常量得分、函数得分和提升查询类型。要了解更多信息,请参阅复合查询 。
昂贵的查询 #
昂贵的查询( Expensive queries )可能会消耗大量内存,并导致集群性能下降。以下查询可能会消耗资源:
- fuzzy 查询
- prefix 查询
- text 和 keyword 字段的 range 查询
- regexp 查询
- wildcard 查询
- query_string 查询在内部转换为前缀查询
要禁止昂贵的查询,您可以按如下方式禁用 search.allow_expensive_queries 集群设置:
PUT _cluster/settings
{
"persistent": {
"search.allow_expensive_queries": false
}
}