一、DSL
在 ElasticSearch 中,提供了功能十分丰富、多种表现形式的查询语言—— DSL 查询。
Query DSL 又叫结构化查询,使用 JSON 格式的请求体 与 ElasticSearch 交互,使查询语句更灵活、更精确、更易读且易调试。
使用结构化查询,你需要传递 query
参数:
GET /_search
{
"query": YOUR_QUERY_HERE
}
主要包含两种类型的查询语句:叶子查询语句和复合查询语句。
1.1、叶子查询语句
这种查询可以单独使用,针对指定的字段查询指定的值,例如:match, term, range 等。
一个叶子查询语句一般使用这种结构:
{
QUERY_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
或指向一个指定的字段:
{
QUERY_NAME: {
FIELD_NAME: {
ARGUMENT: VALUE,
ARGUMENT: VALUE,...
}
}
}
例如,可以使用 match
查询子句用来找寻在 tweet
字段中找寻包含 elasticsearch
的成员:
GET /_search
{
"query": {
"match": {
"tweet": "elasticsearch"
}
}
}
1.2、复合查询语句
这种查询可以合并其他的叶子查询或复合查询,从而实现非常复杂的查询逻辑。
例如,bool
子句允许合并其他的合法子句,must
,must_not
或者 should
:
{
"bool": {
"must": { "match": { "tweet": "elasticsearch" }},
"must_not": { "match": { "name": "mary" }},
"should": { "match": { "tweet": "full text" }}
}
}
二、Query DSL 和 Filter DSL
Elasticsearch 使用的查询语言(DSL) 拥有一套查询组件,这些组件可以以无限组合的方式进行搭配。这套组件可以在以下两种情况下使用:查询情况 query context
和过滤情况 filtering context
,也即结构化查询 Query DSL
和结构化过滤 Filter DSL
。
查询与过滤语句非常相似,但是它们由于使用目的不同而稍有差异。
2.1、Query DSL
在上下文查询语境中,查询语句会询问文档与查询语句的匹配程度,它会判断文档是否匹配并计算相关性评分(_score)的值。
例如:
- 查找与
full text search
这个词语最佳匹配的文档 - 查找包含单词
run
,但是也包含runs
,running
,jog
或sprint
的文档 - 同时包含着
quick
,brown
和fox
— 单词间离得越近,该文档的相关性越高 - 标识着
lucene
,search
或java
— 标识词越多,该文档的相关性越高
一条查询语句会计算每个文档与查询语句的相关性,然后给出一个相关性评分 _score
,并且按照相关性对匹配到的文档进行排序。
2.2、Filter DSL
在上下文过滤语境中,查询语句主要解决文档是否匹配的问题,而不会在意匹配程度(相关性评分)。
例如:
created
的日期范围是否在2013
到2014
?status
字段中是否包含单词 “published” ?lat_lon
字段中的地理位置与目标点相距是否不超过10km ?
2.3、比较
相关度:
filter
—— 只根据搜索条件过滤出符合的文档,将这些文档的评分固定为1,忽略 TF/IDF 信息,不计算相关度分数;query
—— 先查询符合搜索条件的文档, 然后计算每个文档对于搜索条件的相关度分数,再根据评分倒序排序。
性能:
filter
性能更好,无排序 —— 不计算相关度分数&#