EC的农地辣麽大,作物辣麽多,来认真找作物了(1)ES的逐一说文解字-搜寻

来到第28天了,却觉得头很痛
ES的收寻知识点有点大,要细讲自己也讲不清楚
要粗讲,可能又讲的不清楚

我的老天那


最後几篇,文思枯竭,那麽我们就直接开始罗~

本篇参考文章

ES小农经过小小的到处东找西查,最後还是觉得官网最详细,只可惜大量英文....
(中文版只有更新到2.x...看过就觉得直接打上来,可能很多都废弃了)

官网基本将ES的收寻简单分成了五个单元
今天小农就依照这五个单元简单一次就入门吧~

1. 搜寻基础

参考文档

1.1 query context
    * 会对搜寻进行算分(_score)
    * 使用query关键包裹词语
      1. must: 必须符合
      2. should: 选择性符合
      3. must_not: 必须不符合 
2.2 filter context
    * 不会对搜寻进行算分,但能够利用暂存更快速取得资料
      1. 必须符合

范例语句:

GET /{index}/_search
{
    "query":{
        "bool":{
            //1. 必须住在新北市
            "must":{
                "term":{
                    "city":"New Taipei City"
                }
            },
            //2. 年纪必须大於等於35
            "must_not":[
                {
                    "range":{
                        "age":{
                            "gte":"30"
                        }
                    }
                }
            ],
            //3. 名字中有Tsai,Jolin,之中一个即可,符合越多分数越高
            "should":[
                {
                    "term":{
                        "name":"Tsai",
                    }
                },
                {
                    "term":{
                        "name":"Jolin",
                    }
                }
            ],
            //4. 必须爲女性
             "filter":{
                "term":{
                    "sex":"women"
                }
            }
        }
    }
}

2. 分词(Full text queries)

参考文档

2.1. match 
    * 将搜索语句经过分词後进行"OR"查询
2.2. match_phrase 
    * 将搜索语句经过分词後,按照分词顺讯进行"and"搜寻,且可使用slop容许分词间中间间格几个词
     (就是分词全要有,且顺序要对)
2.3. match_phrase_prefix 
    * 对最後一个分词进行通配符搜索,并且可使用max_expansions来设定馍糊比对数控制
      其中 max_expansions 最小爲1
2.4. multi_match
    * match的多组版本,将每组内容都进行分词後进行"OR"查询
2.5. common terms
    * 对不常见的指定分词给与更高的算分
2.6. query_string
    * 允许在单个查询字串中使用and,or,not进行多字段搜索
2.7. simple_query_string
    * 像前面单元的lucene,直接将语句进行搜寻

三个很像的来点小栗子吧

我们假设资料爲以下

{ "id" : 1,"content":"国庆快乐,我爱台湾" }
{ "id" : 2,"content":"我爱台湾,国庆快乐" }
{ "id" : 3,"content":"爱台湾,国庆快乐" }
{ "id" : 4,"content":"国庆快乐,全国爱台湾" }

match

{
  "query":{
    "match":{
      "content.ik_smart_analyzer":"国庆快乐"
    }
  }
}
==
mysql where keyWork = 国庆 or keyWork = 快乐

match_phrase

{
    "query": {
        "match_phrase": {
            "content.ik_smart_analyzer": {
            	"query": "快乐我爱",
            	"slop":1
            }
        }
    }
}
==
mysql where keyWork = 国庆 and 国庆_Position=0 and keyWork = 我爱 and 我爱_Position=1

match_phrase_prefix

{
  "query": {
    "match_phrase_prefix": {
      "content.ik_smart_analyzer": {
        "query": "台",
        "max_expansions": 1
      }
    }
  }
}
===
mysql where keyWord = 台 or keyWord like “台?”

3. 精确比对(Term-level queries)

将搜寻语句进行"分词"的完全配对搜索

{ "id" : 1,"content":"国庆快乐,我爱台湾" }
{ "id" : 2,"content":"我爱台湾,国庆快乐" }
{ "id" : 3,"content":"爱台湾,国庆快乐" }
{ "id" : 4,"content":"国庆快乐,全国爱台湾" }

参考文档

3.1. term 
    搜索词不会被分词,必须完全符合
//查无资料因爲没有分词:国庆快乐,我爱台湾
{
  "query": {
    "term" : { "content" : "国庆快乐,我爱台湾" }
  }
}
//id:1~4皆会查出
{
  "query": {
    "term" : { "content" : "台湾" }
  }
}
3.2. terms 
    等於mysql "in" 将所有该属性符合配对都找出
//id:1~4皆会查出
{
  "query": {
    "terms" : { "content" : ["国庆","台湾"]}
  }
}
3.3. terms_set
    至少符合一个或多个分词字段
3.4. range 
    ## //第29篇 基础搜寻的进阶说明
3.5. exists 
    查询某个属性不爲空的资料
"query": {
    "exists" : { "field" : "content" }
}
3.6. prefix 
    直接搜寻以某字段开头的资料
"query": {
    "prefix" : { "content": "国" }
}
//==sql where content like "国%”
3.7. wildcard
"query": {
    "wildcard" : { "content": "*国" }
}
//==sql where content like "%国”
"query": {
    "wildcard" : { "content": "国?" }
}
//where author like "国_”
3.8. regexp 
3.9. fuzzy 
    拼字错误或容错查询
"query": {
    "fuzzy" : {
        "author": {
            "value": "我碍台湾",
            "fuzziness": 1,//最大错别字长度
            "prefix_length": 1,//开头至少要对几个字
            "max_expansions": 100//最多搜寻结果
        }
    }
}
3.10. type 
    7.x被弃用,可能以後被删除
3.11. ids 
    依据多个id[]来检索文档

原本想将五类都打完
明天来详讲range的花式用法
bool到底是什麽
然後一些常用api吧~


对於文章中的任何用词与专业字或都可以在下面留言提问

梗图看不懂也行

蔽农会带着谦卑爲怀的心情竭尽所能回覆与说明的


<<:  菜鸡用 Phaser 拾起童年游戏 30

>>:  Day28 bash与history

10.需要克服系统差异的大小事 - 变更单

本节说明我在变更单遇到的大小事 1.变更的作法 在AgilePLM中,发起的变更单从新建立时,就可以...

D10 - 「数位×IN×OUT」

电子助教:「这个标题...我闻到了停刊的味道... (́⊙◞౪◟⊙‵)」 这个章节开始我们要建立「数...

[Day 23] -『 GO语言学习笔记』- 复合型别 - 阵列(Array) (I)

以下笔记摘录自『 The Go Workshop 』。接下来会依序介绍到Golang的集合型别,「阵...

Gloud IAM 是什麽?

IAM 简介 经过昨天已经设定好了的GCP SDK後,可以开始进入云端世界上的正题溜,首先开始使用G...

[Day 9] Leetcode 917. Reverse Only Letters (C++)

前言 今天的daily challenge题目是917. Reverse Only Letters,...