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

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

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是关键字,后面跟的是查询的内容。

  a)、term单词查询与phrase词语查询。语法一、比如,alfred way这种term查询等效于alfred OR way,包含两个单词中的一个就说明此文档是符合查询需求的。语法二、比如,如果要做词语查询,需要使用双引号将单词包含起来,"alfred way"这种phrase词语查询,要求先后顺序。
  b)、泛查询。案例,alfred等效于在所有字段去匹配该term。
  c)、指定字段。案例,name:alfred。

2)、df q中不指定字段时候默认查询的字段,如果不指定,es会查询所有字段。

3)、sort排序。

4)、timeout指定超时时间,默认不超时。

5)、from,size用于分页。

6)、Group分组设定,使用括号指定匹配的规则。括号的概念,是将值做一个分组,OR和AND是布尔操作符。括号制定了匹配的优先级。

  a)、案例,(quick OR brown) AND fox。这个方式的意思是值先判断前面括号内的,再判断后面的。

  b)、案例,status:(active OR pending)。括号的另一个概念,就是将关键字作为一个整体,返回statusactive或者pending的所有文档。

  c)、案例,status:active OR pending。如果不加括号的意思是,status的值是active的,或者所有文档有pending值的文档。

  d)、案例,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、elasticsearch的布尔操作符。

a、AND(&&)、OR(||)、NOT(!)。操作符必须,注意大写,不能小写。

  举例:name:(tom NOT lee)。name里面不要有lee的,但是可以包含tom的。

b、+、-分别对应must和must_not。+在url中会被解析为空格,要使用encode后的结果才可以,为%2B,使用%2B一定是must的查询。

  举例:name:(tom + lee - alfred)。返回,一定包含lee,一定不包含alfred,可以包含tom的文档。
             name:((lee && !alfred) || (tom && lee && !alfred))。和上面一样效果的。

 

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

1)、区分写法,闭区间用[],开区间用{}。

  举例如下所示。
         a)、age:[1 TO 10],意为1<=age<=10。
         b)、age:[1 TO 10},意为1<=age<10。
         c)、age:[1 TO * ],意为age>=1。
         d)、age:[* TO 10],意为age<=10。

2)、算数符合写法。

  举例如下所示。
         age:>1
         age:(>=1&&<=10)或者age:(+>=1 +<=10)。

 

4、elasticsearch的通配符查询。

1)、?代表1个字符,*代表0或者多个字符。

  举例如下所示。
         name:t?m。
         name:tom*。
         name:t*m。

2)、通配符匹配执行效率低,且占用较多内存,不建议使用。如果无特殊需求,不要将?/*放在最前面,如果放到最前面,可能会导致系统崩溃。

3)、正则表达式匹配。

  举例如下所示:name:/[mb]oat/。返回所有包含moat的文档或者包含boat的文档。

 

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

1)、模糊匹配fuzzy query。

  举例如下所示。
         name:roam~1,含义是,匹配与roam差1个character的词,比如foam、roams等等。
2)、近似度查询proximity search。

  举例如下所示。
         "fox quick"~5,含义是,以term为单位进行差异比较,比如"quick fox"、"quick brown fox"都会被匹配。

 

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

1)、基于JSON定义的查询语句,主要包含如下两种类型。

  a、字段类查询,如term(针对词的查询)、match(针对全文检索的查询)、range(针对范围的查询)等等,只针对某一个字段进行查询。

  b、复合查询,如bool查询(符合查询关键字)等等,包含一个或者多个字段类查询或者复合查询语句。

2)、字段类查询主要包含以下两类,进行查询操作的时候,可以使用Get,也可以使用Post。

  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,主要有如下几种方式。

 

作者:别先生

博客园:https://www.cnblogs.com/biehongli/

如果您想及时得到个人撰写文章以及著作的消息推送,可以扫描上方二维码,关注个人公众号哦。

posted on 2019-10-31 14:53  别先生  阅读(1308)  评论(0编辑  收藏  举报