這篇主要介紹:java
- Search API
- URI Search詳解
- Request Body與Query DSL
- Query String & Simple Query String查詢
elasticsearch的搜索API可分爲兩大類python
- URI Search
- 在URL中使用查詢參數
- Request Body Search
- 使用Elasticsearch提供的,基於JSON格式的更加完備的Query domain Specific Language(DSL)
語法 | 範圍 |
---|---|
/_search | 集羣上全部的索引 |
/index1/_search | index1 |
/index1,index2/_search | index1和index2 |
/index*/_search | 以index開頭的索引 |
例子:golang
curl -XGET "http://192.168.74.112:9200/kibana_sample_data_ecommerce/_search?q=customer_first_name:Eddie" -H 'Content-Type:application/json' -d'
{
"query":{
"match_all":{}
}
}'
# 支持GET POST
# kibana_sample_data_ecommerce是須要操做的索引名
# _search表示執行搜索
# q用來表示查詢內容,搜索叫作Eddie的客戶
# query表示查詢
# match_all表示返回全部的文檔
複製代碼
搜索查詢結果以下:web
在elasticsearch中,提供了不少查詢和相關的參數改善搜索的Precision和Recall算法
顧名思義,URI search就是經過URI進行查詢shell
經過URI query實現搜索json
GET /movies/_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout=1s
zhibash
- q 指定查詢語句,使用 Query String Syntax
- df 默認字段,不指定時候,會對全部字段進行查詢
- Sort 排序 ,能夠指定 from 和 size 用於分頁
- Profile 能夠查看查詢如何執行的
# 指定字段查詢,加profile查看查詢如何執行的
GET /movies/_search?q=title:2012
{
"profile": "true"
}
# 查詢結果profile中的部分信息,可看出查詢類型是termQuery,參數是title:2012
{"query" : [
{
"type" : "TermQuery",
"description" : "title:2012"
}
]
}
複製代碼
# 泛查詢,針對_all,全部字段
GET /movies/_search?q=2012
{
"profile": "true"
}
# 查詢結果profile中的部分信息,使用DisjunctionMaxQuery,對全部字段查詢,性能較差
{"query" : [
{
"type" : "DisjunctionMaxQuery",
"description" : "(title.keyword:2012 | id.keyword:2012 | year:[2012 TO 2012] | genre:2012 | @version:2012 | @version.keyword:2012 | id:2012 | genre.keyword:2012 | title:2012)"
}
]
}
複製代碼
# Term query
GET /movies/_search?q=title:Beautiful Mind
{
"profile": "true"
}
# Phrase query
GET /movies/_search?q=title:"Beautiful Mind"
{
"profile": "true"
}
複製代碼
分組與引號app
# 分組
GET /movies/_search?q=title:(Beautiful Mind)
{
"profile": "true"
}
複製代碼
AND
/OR
/NOT
或者 &&
/ ||
/ !
+
表示 must-
表示 must_not舉例:less
[]
閉區間,{}
開區間
算數符號
# 範圍查詢,區間寫法 / 數學寫法
GET /movies/_search?q=year:>=1980
{
"profile": "true"
}
複製代碼
通配符查詢效率低,佔用內存大,不建議使用。特別是放在前面限制
# 通配符查詢,title有b的查詢出來
GET /movies/_search?q=title:b*
{
"profile": "true"
}
複製代碼
# 模糊匹配&近似度匹配
# 經過近似度匹配的查詢方式,即使是輸錯了一個字母,beautiful有關title也能夠查詢出來
GET /movies/_search?q=title:beautifl~2
{
"profile": "true"
}
複製代碼
GET /movies/_search?q=title:"Lord Rings"~2
{
"profile": "true"
}
複製代碼
在elasticsearch中,一些高階的使用方法只能經過Request Body Search實現
舉例:
- 將查詢語句經過 HTTP Request Body發送給Elasticsearch
- Query DSL
POST /movies,404_idx/_search?ignore_unavailable=true
{
"profile": "true",
"query": {
"match_all": {}
}
}
複製代碼
能夠在request body中加入from和size達到一個分頁的效果
POST /kibana_sample_data_ecommerce/_search
{
"from": 10,
"size": 20,
"query": {
"match_all": {}
}
}
複製代碼
可在request請求中加入 sort
參數用於排序。
GET kibana_sample_data_ecommerce/_search
{
"sort": [
{
"order_date": "desc"
}
],
"from": 10,
"size": 5,
"query": {
"match_all": {}
}
}
複製代碼
好比說文檔很大,不少類型的字段並不須要,那就能夠在request中加入 _source
對查詢字段進行過濾,加上你須要查詢的字段信息便可。
_source
沒有存儲,那就只返回匹配的文檔的元數據_source
只支持使用通配符 _source["name*","desc*"]
GET kibana_sample_data_ecommerce/_search
{
"_source": ["order_date"],
"from": 10,
"size": 5,
"query": {
"match_all": {}
}
}
複製代碼
腳本字段就是能夠用elasticsearch的 painless
腳本去計算出一個結果出來
GET kibana_sample_data_ecommerce/_search
{
"script_fields": {
"new_field": {
"script": {
"lang": "painless",
"source": "doc['order_date'].value+'_hello'"
}
}
},
"query": {
"match_all": {}
}
}
複製代碼
在URI search有Term Search和Phrase Search,那的request body search中,是經過 query match
的方式進行實現的
例子:
# last OR christmas,相似於Term查詢,match中填寫字段:限定值
POST /movies/_search
{
"query":{
"match":{
"title":"Last Christams"
}
}
}
# last AND christmas,相似於phrase查詢,在operator中指定
GET /movies/_search
{
"query":{
"match":{
"title": {
"query":"Last Christams",
"operator":"AND"
}
}
}
}
複製代碼
在phrase查詢中,query中的詞必須是按照順序出現的,纔會有命中結果,slop=1
表明query中間能夠由1個其餘的字符進去,進行模糊命中
GET /movies/_search
{
"query":{
"match_phrase":{
"title":{
"query":"one love",
"slop":1
}
}
}
}
複製代碼
![match phrase](E:\學習\elasticSearch\ES2\Elasticsearch入門2.assets\match phrase.png)
在URI中是能夠使用query string的,那一樣在DSL中也支持query String的使用
+
替代 AND
|
替代 OR
-
替代 NOT
# 插入用戶1
PUT /users/_doc/1
{
"name":"Zhang San",
"about":"java,elasticsearch,product"
}
# 插入用戶2
PUT /users/_doc/2
{
"name":"Li San",
"about":"python,golang"
}
複製代碼
request body DSL中包含了不少很是高級強大的用法,更精彩的部分在接下來的提升文檔中介紹。本篇主要是講述了elasticsearch的search API,對URI search和Request Body DSL的操做,用法作了介紹。實操部分較多,還需多多練習
以爲不錯,請點個贊吧