ElasticSearch - DSL查询

总结ES应用场景

基本查询

  • 词条查询。仅匹配在给定字段中含有该词条的文档,而且是确切的、未经分析的词条。

  • 多词条查询。匹配那些在内容中含有某些词条的文档。可以通过设置minimum_match的值来说明想至少保证有多少个词同时被匹配上。

  • match_all查询。匹配索引中的所有的文件。

  • 常用词查询。考虑到查询条件的词越多,查询性能越低。所以将词分为两类: 一类,是重要的词,出现的频率较低;另一类,是出现频率较高,如: ”的”,但不那么重要的词。

  • match查询

  • multi_match查询。基本与match一样,不同的是它不是针对单个字段,而是针对多个字段执行相同的 match 查询。

  • match_phrase。精确匹配一系列单词或者短语 。 比如, 我们想执行这样一个查询,仅匹配同时包含 “rock” 和 “climbing” ,并且二者以短语 “rock climbing” 的形式紧挨着的雇员记录。

  • query_string查询

  • simple_query_string查询

  • 标识符查询

  • 前缀查询。配置与词条查询类似。如: 查询所有的name字段以tom开始的文档。

  • fuzzy_like_this查询

  • fuzzy_like_this_field查询

  • fuzzy查询

  • 通配符查询。允许我们在查询值中使用*和? 等通配符。如“cr*me”,表示字段里以cr开头me结尾的文档。

  • more_like_this查询

  • more_like_this_field查询

  • range 范围查询

    查询某一个字段值在某一个范围里的文档,字段可以是数值型,也可以是基于字符串的。比如找到年龄在20到30之间的学生。

  • 最大分查询

  • 正则表达式查询

  • term 查询。

    查询被用于精确值 匹配,这些精确值可能是数字、时间、布尔或者那些 not_analyzed 的字符串。而无需对查询结果进行评分计算。

  • exists 查询和 missing 查询。

    用于查找那些指定字段中有值 (exists) 或无值 (missing) 的文档。这与SQL中的 IS_NULL (missing) 和 NOT IS_NULL (exists) 在本质上是相同的。

复合查询

  • 布尔查询

在多个字段上查询多种多样的文本,并且根据一系列的标准来过滤,将多查询组合成单一查询。可以用 bool 查询来实现你的需求。

must 文档 必须 匹配这些条件才能被包含进来。
must_not 文档 必须不 匹配这些条件才能被包含进来。
should 如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。
filter 必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。
  • 加权查询
  • constant_score查询
  • 索引查询

过滤器

filter 过滤器不影响评分,只是选择索引中的某个子集。过滤器很容易被缓存,从而进一步提高过滤查询的性能。另外过滤器提供了十几种不同类型,如: 范围过滤器、脚本过滤器等等,可以根据不同场景选择合适的。

深入搜索

https://www.elastic.co/guide/cn/elasticsearch/guide/current/search-in-depth.html 里面提供了多维度、更灵活的搜索场景以及案例。

排序与相关性

相关性得分由一个浮点数进行表示,并在搜索结果中通过 _score 参数返回, 默认排序是 _score 降序。

  • 按单个字段的值排序

  • 多级排序

    比如我们想要结合使用 date 和 _score 进行查询,并且匹配的结果首先按照日期排序,然后按照相关性排序。https://www.elastic.co/guide/cn/elasticsearch/guide/current/_Sorting.html 。多级排序并不一定包含 _score 。你可以根据一些不同的字段进行排序, 如地理距离或是脚本计算的特定值。

基于poi经纬度地理位置的查询

  • 基于距离的排序。按照与给定地点的距离来对结果排序。
  • 边界框过滤。搜索条件提供左上及右下的坐标,搜索被矩形框住的选定区域。
  • 距离的限制。把结果限定为离基准点一个选定的距离之内,比如把结果限定为离巴黎半径500公里以内。