## 应用场景

---


### 基本查询

* 词条查询。仅匹配在给定字段中含有该词条的文档，而且是确切的、未经分析的词条。
* 多词条查询。匹配那些在内容中含有某些词条的文档。可以通过设置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
里面提供了多维度、更灵活的搜索场景以及案例。

![image](img/13.png)


### 排序与相关性

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

* 按单个字段的值排序

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


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

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

