ElasticSearch学习笔记(二)

Search API

在es中进行搜索有两种方式,第一种是uri中使用查询参数,第二种是Request Body Search,使用第二种方式可以实现各种高级搜索

1.uri search

“GET 索引名(可以加通配符)/_search”:参数“q”,指定查询字符串,使用Query String Syntax。参数“df”,指定查询的字段。

Query String Syntax有这几种情况

指定字段/泛查询(查询所有的字段,除非指定df):q=user:mike/q=mike

Term查询/Phrase查询:q=(a b)即包含a或是b的都会计入结果/q=“a b”即必须同时包含a b且顺序一致

布尔操作(必须大写):上面的q=(a b)可以等价为q=(a OR b)

+/- :即增加must或must not的条件 如q=(a +b)即理解为should a must b

接下来主要介绍Request Body Search

2.基于词项查询和基于全文查询

a.term查询属于是基于词项的查询,es不会对查询条件做分词处理,比如下面的查询就无法查出fullname有Eddie的数据,而将条件改为“eddie”后就可以查到结果了


查询条件改为eddie后返回数据

原因是因为默认的分词器在索引时会将大写转换为小写,所以term查询不会将查询条件进行分词处理,就没办法在es中索引到数据。

一般可以使用t对字段的keyword进行term查询来进行字段的精确匹配

b.而match,match phrase,query string都属于全文查询,会对搜索条件进行分词处理

如这个查询条件就可以查询出上面那条数据

而match和match phrase的区别在于,match phrase会将用于查询的字符串作为一个短语,即搜索结果中必须同时有match phrase条件中出现的所有词汇且顺序也一样且不能在中间插入多余的字符(可以设置slop参数以放宽条件)

3.query context & filter context  bool查询

区别在于query context会进行相关性算分而filter context不会,所以filter context的性能更好且可以使用缓存,

bool查询即must,should,must not,filter四种查询条件,通过bool查询可以将多种查询条件组合在一起,每个查询字句的评分会合并到总的相关性评分中,但后面两种就属于filter context不会影响算分。

bool同一层级的查询条件权重一样,而查询可以进行嵌套,而嵌套内的查询算分权重会比外层查询条件低

4.Dis max query与单字符串多字段搜索

都知道在ES中进行搜索是会根据结果和搜索条件的匹配程度进行相关性算分并根据算分进行排序的,这样可以尽量将相关度更高的结果排列在前面,但在单字符串多字段搜索的时候默认的相关性算分得出的结果不一定是我们想要的那样。比如现在有两个文档

第一个文档:{“title”:“a fool boy”, "content”:“he seems laike very fool”}

第二个文档:{“title”:“do not be a fool man”, “content”:“this should be a reality”}

如果使用bool查询对title和content同时进行"fool man"的should match查询即

{

    “query”:{

        "bool"{

            "should":[

                {"match":{"content":"fool man"}},

                {"match":{"titile":"fool man"}}

            ]

        }

    }

}

按常理来说很明显第二个文档与我们预期的搜索结果更匹配,但实际结果可能却是将第一个文档排在最前面,因为在计算相关性算分时,should中的两个条件对相关性算分贡献的权重是一致的,而第一个文档两个字段都出现了fool,第二个文档只有title字段出现了fool man。所以经过相加后第一个文档的相关性算分更高了。这个时候为了得到更符合预期的结果,我们可以使用Disjunction max query,

{

    “query”:{

        "dis_max"{

            "querys":[

                {"match":{"content":"fool man"}},

                {"match":{"titile":"fool man"}}

            ]

        }

    }

}

这个查询的作用就是将单字符串多字段查询的时候不会将每个字段的相关性算分进行简单相加,而是取算分最高的子段的分作为结果,这样就可以查出更符合我们预期的结果。

你可能感兴趣的:(ElasticSearch学习笔记(二))