Elasticsearch 入門實戰(8)--REST API 使用二(Search API)

且行且码發表於2024-07-21

本文繼續上文(Elasticsearch 入門實戰(3)--REST API 使用一(CAT,Index,Document,Ingest API))介紹 Elasticsearch REST API,相關的環境及軟體資訊如下:CentOS 7.6.1810、Elasticsearch 8.13.4。

1、Search APIs

1.1、Count API(查詢文件數量)

語法:

GET /<target>/_count

樣例:

curl -X GET 'http://10.49.196.33:9200/poet-index/_count'             #查詢該索引的所有文件數量

curl -X GET 'http://10.49.196.33:9200/poet-index/_count?q=name:杜甫' #透過 Lucene 查詢語法指定條件

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.33:9200/poet-index/_count' -d ' #透過 "Query DSL" 指定條件 
{
  "query": {
    "term": {
      "name.keyword": {
        "value": "杜甫"
      }
    }
  }
}'

1.2、Search API(查詢文件)

語法:

GET /<target>/_search
GET /_search
POST /<target>/_search
POST /_search

1.2.1、query

1.2.1.1、term/terms 查詢

term 查詢不會對輸入的內容進行分詞處理,而是作為一個整體來查詢。

A、查詢單個詞

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "term": {
      "name": {
        "value": "李白"
      }
    }
  }
}'

B、查詢多個詞

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "terms": {
      "name": ["李白", "杜甫"]
    }
  }
}'

1.2.1.2、range 查詢

按照範圍查詢。

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "range": {
      "age": {
        "gte": 20,
        "lte": 35
      }
    }
  }
}'

1.2.1.3、exists 查詢

查詢對應欄位不為空的資料。

curl -X GET -H 'Content-Type:application/json' 'http://10.1.101.64:9200/poet-index/_search' -d '
{
  "query": {
    "exists": {
      "field": "poems"
    }
  }
}'

1.2.1.4、match 相關查詢

A、match

對輸入的內容進行分詞處理,再根據分詞查詢。

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "match": {
      "success": "理想主義"
    }
  },
  "from": 0,
  "size": 10,
  "sort": [{
    "name": {
      "order": "asc"
    }
  }]
}'

B、multi_match

多欄位進行匹配。

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "multi_match": {
      "query": "太白",
      "fields": ["about", "success"]
    }
  }
}'

C、match_phrase

類似 match,需要滿足以下條件:

1.文件的分詞列表要包含所有的搜尋分詞列表
2.搜尋分詞次序要和文件分詞次序一致
3.slop 引數控制著匹配到的文件分詞最大間距,預設為1(匹配到分詞要緊挨著)

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "match_phrase": {
      "success": "文學作家"
    }
  }
}'

D、match_all

查詢所有文件。

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "match_all": {
     }
  }
}'

不加請求體,也是一樣的效果,查詢所有文件。

curl -X GET 'http://10.49.196.11:9200/poet-index/_search'

E、match_none

與 match_all 相反,返回 0 個文件。

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "match_none": {
     }
  }
}'

1.2.1.5、query_string 查詢

query_string 可以同時實現前面幾種查詢方法。

A、類似 match

curl -X GET  -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "query_string": {
      "default_field": "success",
      "query": "古典文學"
    }
  }
}'

B、類似 mulit_match

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "query_string": {
      "query": "古典文學",
      "fields": ["about", "success"]
    }
  }
}'

C、類似 match_phrase

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "query_string": {
      "default_field": "success",
      "query": "\"古典文學\""
    }
  }
}'

D、帶運算子查詢,運算子兩邊的詞不再分詞

1、查詢同時包含 ”文學“ 和 ”偉大“ 的文件

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "query_string": {
      "default_field": "success",
      "query": "文學 AND 偉大"
    }
  }
}'

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "query_string": {
      "fields": ["success"],
      "query": "文學 偉大",
      "default_operator": "AND"
    }
  }
}'

2、查詢 name 或 success 欄位包含"文學"和"偉大"這兩個單詞,或者包含"李白"這個單詞的文件。

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "query_string": {
      "query": "(文學 AND 偉大) OR 李白",
      "fields": ["name", "success"]
    }
  }
}'

1.2.1.6、simple_query_string 查詢

類似 query_string,主要區別如下:

1、不支援AND OR NOT ,會當做字元處理;使用 + 代替 AND,| 代替OR,- 代替 NOT
2、會忽略錯誤的語法

查詢同時包含 ”文學“ 和 ”偉大“ 的文件:

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "simple_query_string": {
      "fields": ["success"],
      "query": "文學 + 偉大"
    }
  }
}'

1.2.1.7、fuzzy 查詢

模糊查詢時使用的引數:

fuzziness

允許的最大編輯距離,預設不開啟模糊查詢,相當於 fuzziness=0。支援的格式

1、可以是數字(0、1、2)代表固定的最大編輯距離

2、自動模式,AUTO:[low],[high]

查詢詞長度在 [0-low)範圍內編輯距離為 0(即強匹配)

查詢詞長度在 [low, high) 範圍內允許編輯 1 次

查詢詞長度 >high 允許編輯 2 次

prefix_length

控制兩個字串匹配的最小相同的字首大小,也就是前 n 個字元不允許編輯,必須與查詢詞相同,預設是 0,大於 0 時可以顯著提升查詢效能

max_expansions

產生的最大模糊選項

transpositions

相鄰位置字元互換是否算作 1 次編輯距離,全文查詢不支援該引數

A、全文查詢時使用模糊引數

先分詞再計算模糊選項。

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "match": {
       "success": {
         "query": "古典文化",
         "fuzziness": 1,
         "prefix_length": 0,
         "max_expansions": 5
       }
    }
  }
}'

B、使用 fuzzy query

對輸入不分詞,直接計算模糊選項。

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "fuzzy": {
      "success": {
        "value": "理想",
        "fuzziness": 1,
        "prefix_length": 0,
        "transpositions": true
      }
    }
  }
}'

1.2.1.8、wildcard 查詢

wildcard 查詢類似 SQL 語句中的 like;? 匹配一個字元,* 匹配多個字元。對於使用 wildcard 查詢的欄位建議欄位型別設為 wildcard 型別。

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "wildcard": {
      "name": "李*"
    }
  }
}'

1.2.1.9、bool 查詢

組合查詢使用 bool 來組合多個查詢條件。

條件 說明
must 同時滿足
should 滿足其中任意一個
must_not 同時不滿足
filter 過濾搜尋,不計算得分

A、查詢 success 包含 “思想” 且 age 在 [20-40] 之間的文件:

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "bool": {
      "must": [{
        "simple_query_string": {
          "query": "思想",
          "fields": ["success"]
        }
      }, {
        "range": {
          "age": {
            "gte": 20,
            "lte": 40
          }
        }
      }]
    }
  }
}'

B、過濾出 success 包含 “思想” 且 age 在 [20-40] 之間的文件,不計算得分:

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "bool": {
      "filter": [{
        "simple_query_string": {
          "query": "思想",
          "fields": ["success"]
        }
      }, {
        "range": {
          "age": {
            "gte": 20,
            "lte": 40
          }
        }
      }]
    }
  }
}'

1.2.2、aggs 查詢

聚合查詢類似 SQL 中的 group by 分組查詢。

A、求和,類似 select sum(age) from poet-index

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "aggs": {
    "age_sum": {
      "sum": {
        "field": "age"
      }
    }
  }
}'

B、類似 select count distinct(age) from poet-index

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/test-index/_search' -d '
{
  "aggs": {
    "age_count": {
      "cardinality": {
        "field": "age"
      }
    }
  }
}'

C、數量、最大、最小、平均、求和

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "aggs": {
    "age_stats": {
      "stats": {
        "field": "age"
      }
    }
  },
  "size": 0
}'

D、類似 select name,count(*) from poet-index group by name

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "aggs": {
    "name_terms": {
      "terms": {
        "field": "name"
      }
    }
  },
  "size": 0
}'

E、類似 select name,age, count(*) from poet-index group by name,age

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "aggs": {
    "name_terms": {
      "terms": {
        "field": "name"
      },
      "aggs": {
        "age_terms": {
          "terms": {
            "field": "age"
          }
        }
      }
    }
  },
  "size": 0
}'

F、類似 select avg(age) from poet-indexwhere name='李白'

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "bool": {
      "filter": {
        "term": {
          "name": "李白"
        }
      }
    }
  },
  "aggs": {
    "age_avg": {
      "avg": {
        "field": "age"
      }
    }
  },
  "size": 0
}'

1.2.3、suggest 查詢

如果希望 Elasticsearch 能夠根據我們的搜尋內容給一些推薦的搜尋選項,可以使用推薦搜尋。

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "suggest": {
    "success_suggest": {
      "text": "思考",
      "term": {
        "field": "success",
        "analyzer": "ik_max_word",
        "suggest_mode": "always",
        "min_word_length":2
      }
    }
  }
}'

推薦模式 suggest_mode:

推薦模式 說明
popular 推薦詞頻更高的一些搜尋
missing 當沒有要搜尋的結果的時候才推薦
always 無論什麼情況下都進行推薦

1.2.4、highlight

對搜尋結果中的關鍵字高亮顯示。

curl -X GET -H 'Content-Type:application/json' 'http://10.49.196.11:9200/poet-index/_search' -d '
{
  "query": {
    "match": {
      "success": "思想"
    }
  },
  "highlight": {
    "pre_tags": "<span color='red'>",  
    "post_tags": "</span>",        
    "fields": {            
      "success": {}
    }
  }
}'

詳細的 Elasticsearch REST API 使用說明,請參考官網文件:https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html。

相關文章