Elasticsearch 6.x版本全文检索学习之Search API

  • 2019 年 11 月 3 日
  • 笔记

1)、Search API,实现对es中存储的数据进行查询分析,endpoind为_search,如下所示。

  方式一、GET /_search,对es中所有的数据进行查询。   方式二、GET /my_index/_search,针对单个索引的数据进行查询。   方式三、GET /my_index1,my_index2/_search,针对两个索引的数据进行查询。   方式四、GET /my_*/_search,指定索引查询,可以一次查询多个。

2)、查询的主要有两种形式。

  形式一、URI Search。a、优点,操作简便,方便通过命令行测试。b、缺点,仅包含部分查询语法。案例如下:

GET /test_search_index/_search?q=username:al*

  形式二、Request Body Search。a、es提供完备的查询语法Query DSL语法(Domain Specific Language)。案例如下:

GET /test_search_index/_search  {    "query": {      "term": {        "username": {          "value": "alfred"        }      }    }  }

1、URI Search。通过url query参数来实现搜素,常用参数如下。

1)、q指定查询的语句,语法为Query String Syntas。q是关键字,后面跟的是查询的内容。 term与phrase词语。语法一、alfred way这种term查询等效于alfred OR way。语法二、"alfred way"这种phrase词语查询,要求先后顺序。 泛查询。alfred等效于在所有字段去匹配该term。 指定字段。name:alfred。 2)、df q中不指定字段时候默认查询的字段,如果不指定,es会查询所有字段。 3)、sort排序。 4)、timeout指定超时时间,默认不超时。 5)、from,size用于分页。 6)、Group分组设定,使用括号指定匹配的规则。括号的概念,是将值做一个分组,OR和AND是布尔操作符。括号制定了匹配的优先级。   (quick OR brown) AND fox。这个方式的意思是值先判断前面括号内的,再判断后面的。   status:(active OR pending)。括号的另一个概念,就是将关键字作为一个整体,返回status是active或者pending的所有文档。 status:active OR pending。如果不加括号的意思是,status的值是active的,或者所有文档有pending值的文档。   title:(full text search)。类比上面即可。 7)、GET /test_search_index/_search?q=alfred&df=username&sort=age:asc&from=1&size=10&timeout=1s   解释:查询username字段包含alfred的文档,结果按照age升序排列,返回第1~3个文档,如果超过1s没有结束,则以超时结束。

泛查询的使用如下所示:

根据指定字段进行查询、term与phrase词语、Group分组设定。

2、布尔操作符。

a、AND(&&)、OR(||)、NOT(!)。操作符必须,注意大写,不能小写。 举例:name:(tom NOT lee)。name里面不要有lee的,但是可以包含tom的。 b、+、-分别对应must和must_not。+在url中会被解析为空格,要使用encode后的结果才可以,为%2B。 举例:name:(tom +lee -alfred)。返回,一定包含lee,一定不包含alfred,可以包含tom的文档。   name:((lee && !alfred) || (tom && lee && !alfred))。和上面一样效果的。

3、范围查询,支持数值和日期。

a、区分写法,闭区间用[],开区间用{}。 举例如下所示。 age:[1 TO 10],意为1<=age<=10。 age:[1 TO 10},意为1<=age<10。 age:[1 TO * ],意为age>=1。 age:[* TO 10],意为age<=10。 b、算数符合写法。 举例如下所示。 age:>1 age:(>=1&&<=10)或者age:(+>=1 +<=10)。

4、通配符查询。

a、?代表1个字符,*代表0或者多个字符。 举例如下所示。 name:t?m。 name:tom*。 name:t*m。 b、通配符匹配执行效率低,且占用较多内存,不建议使用,如果无特殊需求,不要将?/*放在最前面。 c、正则表达式匹配。 举例如下所示。 name:/[mb]oat/。返回所有包含moat的文档或者包含boat的文档。

5、模糊匹配fuzzy query、近似度查询proximity search。

a、模糊匹配fuzzy query。 举例如下所示。 name:roam~1。 匹配与roam差1个character的词,比如foam、roams等等。 b、近似度查询proximity search。 举例如下所示。 "fox quick"~5。 以term为单位进行差异比较,比如"quick fox"、"quick brown fox"都会被匹配。

6、Request Body Search,将查询语句通过http request body发送到es,主要包含如下参数。query符合Query DSL语法的查询语句。包含query、from、size、timeout、sort等等关键查询参数。

1)、基于JSON定义的查询语句,主要包含如下两种类型。   a、字段类查询,如term(针对词的查询)、match(针对全文检索的查询)、range(针对范围的查询)等等,只针对某一个字段进行查询。   b、复合查询,如bool查询(符合查询关键字)等等,包含一个或者多个字段类查询或者复合查询语句。 2)、字段类查询主要包含以下两类。   a、全文匹配,针对text类型的字段进行全文检索,会对查询语句先进行分词处理,然后拿着分词结果去es中存倒排索引的term匹配,如match、match_phrase(词语查询)等等query类型。   b、单词匹配,不会对查询语句做分词处理,直接拿着查询语句的内容去匹配字段的倒排索引,如term、terms、range等等类型。 3)、Query DSL复合查询,复合查询是指包含字段类查询或者复合查询的类型,主要包括以下几类。 方式一、constant_score query。   该查询将其内部的查询结果文档得分都设定为1或者boost的值。多用于结合bool查询实现自定义得分。 方式二、bool query。   布尔查询由一个或者多个布尔子句组成,主要包含如下4个。     a、filter只过滤符合条件的文档,不计算相关性得分。     b、must文档必须符合must中的所有条件,会影响相关性得分。     c、must_not文档必须不符合must_not中的所有条件。     d、should文档可以符合should中的条件,会影响相关性得分。 方式三、dis_max query。 方式四、function_score query。 方式五、boosting query。

Match Phrase Query(词语类查询,与Match Query的区别就是待查询的语句分词以后,es去匹配的时候,对分词后的term即词语有顺序要求的),对字段作检索,有顺序要求,API示例如下所示:

Query String Query,类似于URI Search中的q参数查询。

Simple Query String Query,类似Query String,但是会忽略错误的查询语法,并且仅支持部分查询语法。其常用的逻辑符号,不能使用AND、OR、NOT等关键词。可以使用+代指AND、|代指OR、-代指NOT。

Term Query,Terms Query,将查询语句作为整个单词进行查询,即不对查询语句做分词处理。

Range Query,范围查询主要针对数值和日期类型。

针对日期提供的一种更友好的计算方式。 a、now – 1d。基准日期,也可以是具体的日期,比如2019-01-01,使用具体日期的时候要用||做隔离。 计算公式,主要有如下3种方式。+1h是加1个小时。-1d是减1天。/d是将时间舍入到天。 b、单位主要有如下几种。 y是years,M是months,w是weeks,d是days,h是hours,m是minues,s是seconds。

7、Query DSL复合查询,复合查询是指包含字段类查询或者复合查询的类型,主要包括以下几类。

1)、constant_score query。 该查询将其内部的查询结果文档得分都设定为1或者boost的值。多用于结合bool查询实现自定义得分。 2)、bool query。 布尔查询由一个或者多个布尔子句组成,主要包含如下4个。 a、filter只过滤符合条件的文档,不计算相关性得分。 b、must文档必须符合must中的所有条件,会影响相关性得分。 c、must_not文档必须不符合must_not中的所有条件。 d、should文档可以符合should中的条件,会影响相关性得分。 3)、dis_max query。 4)、function_score query。 5)、boosting query。

constant_score query。该查询将其内部的查询结果文档得分都设定为1或者boost的值。多用于结合bool查询实现自定义得分。

bool query。布尔查询由一个或者多个布尔子句组成,主要包含如下4个。

filter、must、must_not、should,支持数组的,可以传条件进去,match query,term query,terms query,score query等等查询方式。

must_not,关键词,查询job中包含java关键词,但不包含ruby关键词的文档列表。

should,关键词,should使用分两种情况。 a、bool查询中只包含should,不包含must查询。只包含should时,文档必须满足至少一个条件。

  minimum_should_match可以控制满足条件的个数或者百分比。

b、bool查询中同时包含should和must的查询。

  同时包含should和must的时候,文档不必满足should中的条件,但是如果满足条件,会增加相关性得分。

bool查询中同时包含should和must的查询,同时包含should和must的时候,文档不必满足should中的条件,但是如果满足条件,会增加相关性得分。

Query Context和Filter Context的区别。当一个查询语句位于Query或者Filter上下文时,es执行的结果会不同。

must下的query上下文,会进行相关性算分。需要做相关性算分、需要做全文检索的的可以放到query里面。

filter下的filter上下文,不会影响算分,只会过滤符合条件的文档。不需要做相关性算分的可以放到filter里面,

8、count api,获取符合条件的文档数,endpoint为_count。Source Filter过滤返回结果中_source中的字段,可以减少网络IO,主要有如下几种方式。