DSL 是基于json风格的查询语句,用json描述我们的查询条件,然后发送给es服务,es服务根据这些查询条件返回结果。
1.1 DSL Query的分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括:
1.2 查询的基本语法:
2.1 全文检索(full text)查询: 利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如: match_query multi_match_query 2.2 查询的基本语法:
3.1 精确查询: 根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如: ids range:根据数值范围查询,可以是数值、日期的范围 term:根据词条精确匹配,一般搜索keyword类型、数值类型、布尔类型、日期类型字段 3.2 查询的基本语法:
4.1 地理(geo)查询: 根据经纬度查询。例如: geo_distance:查询到指定中心点小于某个距离值的所有文档 geo_bounding_box:查询geo_point值落在某个矩形范围的所有文档 4.2 查询的基本语法:
5.1 复合(compound)查询: 复合查询可以将上述各种查询条件组合起来,合并查询条件。例如: bool function_score:算分函数查询,可以控制文档相关性算分,控制文档排名 5.2 相关性得分算法: ES5.0版本以前:使用TF-IDF算法 ES5.0版本以后:使用BM25算法 5.3 手动干预相关性得分:
5.4 bool复合查询: 布尔查询是一个或多个查询子句的组合。子查询的组合方式有: must:必须匹配每个子查询,类似“与” should:选择性匹配子查询,类似“或” must_not:必须不匹配,不参与算分,类似“非” filter:必须匹配,不参与算分,尽量使用这个而不使用must,因为参与算分会降低查询的性能;
1.1 elasticsearch排序: 支持对搜索结果排序,默认是根据相关度算分(_score)来排序。可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。使用指定字段,则es会放弃打分,从而提升一些查询效率。 1.2 语法格式:
2.1 es分页规则: elasticsearch 默认情况下只返回top10的数据。而如果要查询更多数据就需要修改分页参数了。 elasticsearch中通过修改from、size参数来控制要返回的分页结果: 2.2 es分页语法: 2.3 es分页存在的问题以及解决方案: 由于es是采用倒排索引,它的结构是不利于做分页的,所以它采用的是逻辑分页,也就是比如说查询990-1000的数据,则是先查前1000的数据,然后截取最后10条数据。这种在单点环境下还行得通,但是如果是集群部署,es则会对数据进行拆分,放到不同的机器上,如下图:针对深度分页,ES提供了两种解决方案: search after: 分页时需要排序,原理是从上一次的排序值开始,查询下一页数据。官方推荐使用的方式。 scroll: 原理将排序数据形成快照,保存在内存。官方已经不推荐使用。
一般会从业务层面禁止深度分页。如最多查询100页。
3.1 高亮状态: 就是在搜索结果中把搜索关键字突出显示 原理:
3.2 高亮语法格式:
查询的基本步骤是:
RestAPI中其中构建DSL是通过HighLevelRestClient中的resource()来实现的,其中包含了查询、排序、分页、高亮等所有功能: RestAPI中其中构建查询条件的核心部分是由一个名为QueryBuilders的工具类提供的,其中包含了各种查询方法:
全文检索的match和multi_match查询与match_all的API基本一致。差别是查询条件,也就是query的部分。同样是利用QueryBuilders提供的方法:
精确查询常见的有term查询和range查询,同样利用QueryBuilders实现:
所有搜索DSL的构建,记住一个API:SearchRequest的source()方法。
搜索结果的排序和分页是与query同级的参数,对应的API如下:
可以给需要置顶的文档添加一个标记,然后利用function score 给带有标记的文档增加权重;