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

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

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

  方式1、GET /_search,对es中全部的数据进行查询。
  方式2、GET /my_index/_search,针对单个索引的数据进行查询。
  方式3、GET /my_index1,my_index2/_search,针对两个索引的数据进行查询。
  方式4、GET /my_*/_search,指定索引查询,能够一次查询多个。
api

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

  形式1、URI Search。a、优势,操做简便,方便经过命令行测试。b、缺点,仅包含部分查询语法。案例以下:ruby

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

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

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

一、URI Search。经过url query参数来实现搜素,经常使用参数以下。学习

1)、q指定查询的语句,语法为Query String Syntas。q是关键字,后面跟的是查询的内容。
    term与phrase词语。语法1、alfred way这种term查询等效于alfred OR way。语法2、"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)。括号的另外一个概念,就是将关键字做为一个总体,返回statusactive或者pending的全部文档。ui

  status:active OR pending。若是不加括号的意思是,status的值是active的,或者全部文档有pending值的文档。url

  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分组设定。

二、布尔操做符。

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))。和上面同样效果的。

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

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)。

四、通配符查询。

a、?表明1个字符,*表明0或者多个字符。
    举例以下所示。
        name:t?m。
        name:tom*。
        name:t*m。
b、通配符匹配执行效率低,且占用较多内存,不建议使用,若是无特殊需求,不要将?/*放在最前面。

c、正则表达式匹配。
    举例以下所示。
        name:/[mb]oat/。返回全部包含moat的文档或者包含boat的文档。

五、模糊匹配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"都会被匹配。

 六、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复合查询,复合查询是指包含字段类查询或者复合查询的类型,主要包括如下几类。

方式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。

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。

七、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里面,

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

 

做者:别先生

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

若是您想及时获得我的撰写文章以及著做的消息推送,能够扫描上方二维码,关注我的公众号哦。

相关文章
相关标签/搜索