ElasticSearch DSL语言.

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,加速性能。

总结

  1. Query查询上下文中,查询操作会根据查询的结果进行相关性分值计算,用于确定相关性。分值越高,返回的结果越靠前。

  2. Filter过滤器上下文中,查询不会计算相关性分值,也不会对结果进行排序。

  3. 过滤器上下文中,查询的结果可以被缓存。

matchquery, match_parsequery分词
wildcardquery: 模糊匹配

参考:
https://www.cnblogs.com/xing901022/p/4975931.html

猜你喜欢

转载自blog.csdn.net/yangsnow_rain_wind/article/details/80825010