美文网首页
四、Es搜索,_search

四、Es搜索,_search

作者: yongfutian | 来源:发表于2018-12-30 11:08 被阅读0次

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'
                    ],
                ],
            ],
        ],
    ];
}

相关文章

网友评论

      本文标题:四、Es搜索,_search

      本文链接:https://www.haomeiwen.com/subject/noamlqtx.html