目录
1、结构化查询 和 结构化过滤
结构化查询,需要传递 query 参数:
GET /_search
{
"query": 各种查询参数
}
查询与过滤的差异:
一条过滤语句会询问每个文档的字段值是否包含着特定值:
- 是否 created 的日期范围在 2013 到 2014 ?
- 是否 status字段中包含单词 “published” ?
- 是否 lat_lon 字段中的地理位置与目标点相距不超过 10km?
查询语句会询问每个文档的字段值与特定值的匹配程序如何?
- 查找与 full text search 这个词语最佳匹配的文档
- 查找包含单词 run,但是也包含 runs,running,jog 或 其他的文档
- 同时包含着 quick,brown 和 fox 单词间离得越近,该文档的相关性越高
- 标识着 Lucene,search 或 java 等标识词越多,该文档的相关性越高。
一条查询语句会计算每个文档与查询语句的相关性,会给出一个相关性评分 _score,并且 按照相关性 对匹配到的文档进行排序。
原则上来说,使用查询语句做全文本搜索或其他需要进行相关性评分的时候,剩下的全部用过滤语句。
2、常用查询过滤语句
term 过滤
term 主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型):
{"term": {"age": 26}}
terms 过滤
terms 允许指定多个匹配条件。如果某个字段指定了多个值,那么文档需要一起去做匹配。
{"terms": {"age": [26, 27, 28]}}
range 过滤
range 过滤允许我们按照指定范围查找一批数据:
{
“range”: {
“age”: {
“gte”: 20,
“lt”: 30
}
}
}
gt: 大于; gte:大于等于; lt : 小于; lte : 小于等于;
exists 和 missing 过滤
用于查找文档是否包含指定字段或没有某个字段,类似于 SQL 语句中的 IS_NULL 条件
bool 过滤
用来合并多个过滤条件查询结果的布尔逻辑:
must:多个查询条件的完全匹配,相当于 and。
must_not: 多个查询条件的相反匹配,相当于 not;
should:至少有一个查询条件匹配,相当于 or;
match_all 查询
使用 match_all 可以查询到所有文档,是没有查询条件下的默认语句。
match 查询
是一个标准查询,不管你需要全文本查询还是精确查询基本上都要用到它。
multi_match 查询
multi_match 查询允许你做 match 查询的基础上同事搜索多个字段:
bool 查询
bool 查询 与 bool 过滤相似,用于合并多个查询子句。不同的是,bool 过滤可以直接给出匹配成功,而 bool 查询要计算每一个查询子句的 _score (相关性分值)。
must:查询指定文档一定要被包含。
must_not:查询指定文档一定不要被包含。
should:查询指定文档,有则可以为文档相关性加分。
3、验证查询
验证一条查询语句是否合法。
GET /index/type/_validate/query
{
"query": {
...
}
}
查询错误信息
GET /index/type/_validate/query?explain
{
"query": {
...
}
}
explain 查询语句
帮助了解查询语句在 ES中是如何执行的:
GET /index/type/_validate/query?explain
{
"query": {
...
}
}