ES支持一种JSON格式的查询,叫做DSL,domain specific language。这门语言刚开始比较难理解,因此通过几个简单的例子开始:
下面的命令,可以搜索全部的文档:
套bool多条件检索DSL模板
GET /bank/_search?pretty
{
"query": {
"bool": {
"must": [],
"must_not": [],
"should": []
}
},
"aggs": {
"my_agg": {
"terms": {
"field": "user",
"size": 10
}
}
},
"highlight": {
"pre_tags": [
"<em>"
],
"post_tags": [
"</em>"
],
"fields": {
"body": {
"number_of_fragments": 1,
"fragment_size": 20
},
"title": {}
}
},
"size": 20,
"from": 100,
"_source": [
"title",
"id"
],
"sort": [
{
"_id": {
"order": "desc"
}
}
]
}
Elasticsearch DSL中Query与Filter的不同
Query
在查询上下文中,查询会回答这个问题 –这个文档匹不匹配这个查询,它的相关度高么
,
如何验证匹配很好理解,如何计算相关度呢?之前说过,ES中索引的数据都会存储一个_score分值,分值越高就代表越匹配。另外关于某个搜索的分值计算还是很复杂的,因此也需要一定的时间。
查询上下文 是在 使用query进行查询时的执行环境,比如使用search的时候。
Filter
在过滤器上下文中,查询会回答这个问题——“这个文档匹不匹配?”
答案很简单,是或者不是。它不会去计算任何分值,也不会关心返回的排序问题,因此效率会高一点
。
Filter过滤器主要用于过滤结构化数据,例如:
1. 时间戳范围是否在2015-2016之间?
2. status字段是否被设置成”published”?
3. 另外,常用的过滤器会自动缓存Elasticsearch,加速性能。
总结
Query查询上下文中,查询操作会根据查询的结果进行相关性分值计算,用于确定相关性。分值越高,返回的结果越靠前。
Filter过滤器上下文中,查询不会计算相关性分值,也不会对结果进行排序。
- 过滤器上下文中,查询的结果可以被缓存。
matchquery, match_parsequery分词
wildcardquery: 模糊匹配