Es搜索
一、搜搜请求的结构
1、确定搜索的范围
a、搜索整个集群
b、搜索某个指定的索引
c、搜索某个索引中的某个类型
d、在搜索时可以同时指定多个索引和多个类型
e、搜索时可以使用+,-,* 等通配符过滤索引和类型范围
二、搜索请求的基本模块
1、query
2、size
3、from 从第几条数据开始搜索
4、_source 过滤返回的字段,可以使用通配符过滤字段,使用include显示某些字段和exclude屏蔽某些字段
5、sort指定排序字段、可以多个,不指定sort默认按_score降序排列,注意:text类型不能排序
三、查询和过滤器DSL
3.1、match查询和term过滤器
注意:查询会为特定的字条计算得分,搜索的过滤器只是为文档是否匹配这个查询,返回简单的 "是" 或 "否" 答案,因此过滤器会比普通的查询快;过滤器查询 “filtered”在高版本5.0之后被弃用*
3.2、常用的基础查询和过滤器
a、match_all查询
使用场景:1、你希望使用过滤器可能完全不关心文档的得分而不是查询的时。2、希望返回被搜索的索引和类型中全部的文档
b、query_string查询
1、默认查询将会搜索_all字段(所有字段组合而成),如需修改:
a、通过查询query来设置字段
b、通过请求来设置default_field
2、允许使用and 和 or 以及其他比较复杂的符号,如通配符、位符号、+、-等
建议使用term、terms、match、multi_match查询替换或者使用simple_query_string替换(+, - , and , or)
c、term查询和term过滤器
term查询精确匹配词条,计算得分
d、terms查询,搜索文档中的多个词条
可以使用mininum_should_match来限定每一篇文档中匹配的最小数量
3.3、match查询
a、布尔查询行为,查询字段值由多个词条组成,可以指定操作符and和or
b、phrase_prefix查询
和词组中最后一个词条进行前缀匹配,常用于搜索框中的自动完成功能
3.4、使用multi_match来匹配多个字段
3.5、组合查询和复合查询
a、bool查询:允许在单独的查询中组合任意数量的查询
must 必须匹配 and等价
must_not 不能匹配 and等价
should 应该匹配 or等价
3.6、超越match查询
a、range查询
b、prefix查询
c、wildcard查询
3.7、为任务选择合适的查询
四、代码案例
1、普通获取
/**
* 普通获取
* @return array
*/
public static function get()
{
return [
'index' => self::$index,
'type' => self::$type,
'body' => [
'from' => 0,
'size' => 10,
'_source' => [
"goods_id","goods_name",
],
],
];
}
2、
/**
* @return array
*/
public static function match()
{
return [
'index' => self::$index,
'type' => self::$type,
'body' => [
'query' => [
'match' => [
'goods_name' => "Pear",
],
],
'from' => 0,
'size' => 10,
'sort' => [
["goods_id" => 'desc'],
"_score", //最终按相关性得分
],
],
];
}
3、 过滤器查询,5.0版本之后已被弃用
/**
* 过滤器查询,5.0版本之后已被弃用
* 使用bool / must / filter查询
*
* match查询和term过滤器
* match查询会为特定的词条计算得分,搜索的过滤器只是为“文档是否匹配这个查询”,返回简单的“是”或“否”答案
* 因此过滤器会比普通的查询快,
*
* @return array
*/
public static function filtered()
{
return [
'index' => self::$index,
'type' => self::$type,
'body' => [
'query' => [
'filtered' => [
//原始查询
'query' => [
'match' => [
"goods_name" => 'Pear',
],
],
//过滤器
'filter' => [
"term" => [
"goods_id" => 80457
],
],
],
],
],
];
}
4、 query_string查询
/**
* query_string查询
* 1、默认将会搜索_all字段[由所有字段组合而成],如需修改:a、通过query查询来设置字段,b、通过请求来设置default_field
* 2、允许使用and、or、+、-、及其他比较复杂的符号,如通配符,位符号等
* 3、建议使用term、terms、match、multi_match查询替换
*
* @return array
*/
public static function queryString()
{
return [
'index' => self::$index,
'type' => self::$type,
'body' => [
'query' => [
'query_string' => [
"default_field" => "goods_name",
'query' => "pear and a"
],
],
],
];
}
5、term查询
/**
* 计算得分,词条精确匹配
* @return array
*/
public static function term()
{
return [
'index' => self::$index,
'type' => self::$type,
'body' => [
'query' => [
'term' => [
'goods_name' => 'apricot'
],
],
'_source' => [
'goods_name'
],
],
];
}
6、terms查询
/**
* 搜索某个文档中的多个词条
* @return array
*/
public static function terms()
{
return [
'index' => self::$index,
'type' => self::$type,
'body' => [
'query' => [
'terms' => [
'goods_name' => [
'apricot','guava',
],
],
],
'_source' => [
'goods_name'
],
],
];
}
7、 match查询中的布尔查询
/**
* match查询
* 默认布尔查询行为,默认or
* @return array
*/
public static function matchBool()
{
return [
'index' => self::$index,
'type' => self::$type,
'body' => [
'query' => [
'match' => [
'goods_name' => [
'query' => 'pear apple',
'operator' => 'and'
],
],
],
],
];
}
8、 match查询中的词组查询
/**
* match查询
* 词组查询行为,slop
*
* @return array
*/
public static function mathcPhrase()
{
return [
'index' => self::$index,
'type' => self::$type,
'body' => [
'query' => [
'match' => [
'goods_name' => [//匹配 pear ××× apple
'type' => 'phrase',
'query' => 'pear apple',
'slop' => 1 //设置余地,为大于或等于1的整数
],
],
],
],
];
}
9、词组查询,指定前缀扩展数量
/**
* 常用于搜索框里的自动完成功能提示
* @return array
*/
public static function phrasePrefix()
{
return [
'index' => self::$index,
'type' => self::$type,
'body' => [
'query' => [
'match' => [
'goods_name' => [//匹配 pear ××× apple
'type' => 'phrase_prefix',
'query' => 'pear apple',
'max_expansions' => 1 //指定最大的前缀扩展数量
],
],
],
],
];
}
10、multi_match查询
/**
* 搜索多个字段中的值
* @return array
*/
public static function multiMatch()
{
return [
'index' => self::$index,
'type' => self::$type,
'body' => [
'query' => [
'multi_match' => [
'query' => 'pear apple',
'fileds' => [
'goods_name','descriptions',
],
],
],
],
];
}
11、bool查询
/**
* 可以组合任意数量的查询
* @return array
*/
public static function bool()
{
return [
'index' => self::$index,
'type' => self::$type,
'body' => [
'query' => [
'bool' => [
'must' => [
[
'term' => [
'goods_name' => "pear",
],
],
],
'should' => [
[
'term' => [
'goods_id' => "pear",
],
],
],
'must_not' => [
[
'term' => [
'goods_descriptions' => "pear",
],
],
],
],
],
],
];
}
12、range查询
/**
* range 范围查询
* @return array
*/
public static function range()
{
return [
'index' => self::$index,
'type' => self::$type,
'body' => [
'query' => [
'range' => [
'goods_id' => [
'gt' => 1000,
'lt' => 100,
],
],
],
],
];
}
13、prefix查询,根据给定的前缀来搜说词条
/**
* 根据给定的前缀来搜说词条
* @return array
*/
public static function prefix()
{
return [
'index' => self::$index,
'type' => self::$type,
'body' => [
'query' => [
'prefix' => [
'goods_name' => 'pea'
],
],
],
];
}
14、wildcard查询
/**
* 通过正则表达式的方式【通配符】搜索词条
* @return array
*/
public static function wildcard()
{
return [
'index' => self::$index,
'type' => self::$type,
'body' => [
'query' => [
'wildcard' => [
'goods_name' => [
'wildcard'=> 'pe*r'
],
],
],
],
];
}
网友评论