Elasticsearch入門(2)-search API/URI search/Request Body Query

這篇主要介紹:java

  1. Search API
  2. URI Search詳解
  3. Request Body與Query DSL
  4. Query String & Simple Query String查詢

Search API

elasticsearch的搜索API可分爲兩大類python

  • URI Search
    • 在URL中使用查詢參數
  • Request Body Search
    • 使用Elasticsearch提供的,基於JSON格式的更加完備的Query domain Specific Language(DSL)

1.指定查詢的索引

語法 範圍
/_search 集羣上全部的索引
/index1/_search index1
/index1,index2/_search index1和index2
/index*/_search 以index開頭的索引

2.URI查詢

  • 使用「q」,指定查詢字符串
  • 「query string syntax」,KV鍵值對

例子: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

uri

3.搜索的相關性relevance

  • 搜索是用戶和搜索引擎的對話
  • 用戶關心的是搜索結果的相關性
    • 是否已經找到全部相關內容
    • 不相關的返回內容有多少
    • 文檔的打分是否合理
    • 結合業務需求,平衡結果排名

web搜索

  • Page Rank算法
    • 不單單是內容
    • 更重要的是內容的可信度

電商搜索

  • 搜索引擎角色-銷售
    • 提升用戶購物體驗
    • 提高網站銷售業績
    • 去庫存

4.衡量相關性

  • Informatica Retrieval
    • Precision(查準率) - 儘量返回較少的無關文檔
    • Recall(查全率) - 儘可能返回較多的相關文檔
    • Ranking - 是否可以按照相關度進行排序

Precision & recall

  • Precision準確率
    • 準確率針對預測結果而言,表示的是預測爲正的樣本中所少是真正的正樣本。因此說預測爲正就有兩種可能,一種是把正預測爲正(true positive),另外一種就是把負類預測爲正類(false positive)
    • 表達式:P = (TP) / (TP+FP)
  • Recall 召回率
    • 召回率針對原有樣本而言,表示的是樣本中的正例有多少本預測正確了。也有兩種可能,一種是把原來的正類預測爲正類(true positive),另外一種是把原來的正類預測爲負類(false nagative)。
    • 表達式:R = (TP) / (TP+FN)

precison_recall

在elasticsearch中,提供了不少查詢和相關的參數改善搜索的Precision和Recall算法

URI search

顧名思義,URI search就是經過URI進行查詢shell

經過URI query實現搜索json

GET /movies/_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout=1szhibash

  • q 指定查詢語句,使用 Query String Syntax
  • df 默認字段,不指定時候,會對全部字段進行查詢
  • Sort 排序 ,能夠指定 from 和 size 用於分頁
  • Profile 能夠查看查詢如何執行的

1.指定字段 v.s 泛查詢

  • q=title:2012 / q=2012
# 指定字段查詢,加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)"
                }
                ]
}

複製代碼

2.Term v.s Phrase

  • Term : Beautiful Mind 等效於 Beautiful OR Mind
  • Phrase : 查詢語句要用引號引發來,「Beautiful Mind」,等效於 Beautiful AND Mind。Phrase查詢,還要求先後順序要保持一致
# Term query
GET /movies/_search?q=title:Beautiful Mind
{
  "profile": "true"
}

# Phrase query
GET /movies/_search?q=title:"Beautiful Mind"
{
  "profile": "true"
}

複製代碼

分組與引號app

  • title:(Beautiful AND Mind),當你去查詢一個term query時,要用括號把查詢內容括起來
# 分組
GET /movies/_search?q=title:(Beautiful Mind)
{
  "profile": "true"
}
複製代碼
  • 若是是phrase query 就用引導,title="Beautiful Mind"

3.布爾操做

  • AND/OR/NOT 或者 && / || / !
    • 必須大寫
    • 例如:tile:{matrix NOT reloaded}

4.分組

  • + 表示 must
  • - 表示 must_not
  • title:{+matrix -reloaded}

舉例:less

  1. 查找美麗心靈,指定分組和布爾操做AND

AND

  1. 查找美麗心靈,指定分組和布爾操做NOT

NOT

  1. 查找美麗心靈,分組+,必需要有mind

mind

5.範圍查詢

  • 區間表示:[] 閉區間,{} 開區間
    • year:{2019 TO 2018}
    • year:[* TO 2018]

算數符號

  • year:>2010
  • year:(>2010 && <=2018)
  • year:(+>2010 +<=2018)
# 範圍查詢,區間寫法 / 數學寫法
GET /movies/_search?q=year:>=1980
{
  "profile": "true"
}
複製代碼

6.通配符查詢

通配符查詢效率低,佔用內存大,不建議使用。特別是放在前面限制

  • ?表明一個字符,*表明0或者多個字符
    • title:mi?d
    • title:be*
  • 正則表達
    • title:[bt]oy
  • 模糊匹配與近似查詢
    • title:befutifl~1
    • title:"lord rings"~2
# 通配符查詢,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"
}
複製代碼

近似度

Request Body 和Query DSL

在elasticsearch中,一些高階的使用方法只能經過Request Body Search實現

舉例:

  • 將查詢語句經過 HTTP Request Body發送給Elasticsearch
  • Query DSL
POST /movies,404_idx/_search?ignore_unavailable=true
{
  "profile": "true",
  "query": {
    "match_all": {}
  }
}
複製代碼

1.分頁

能夠在request body中加入from和size達到一個分頁的效果

POST /kibana_sample_data_ecommerce/_search
{
  "from": 10,
  "size": 20,
  "query": {
    "match_all": {}
  }
}
複製代碼
  • from從10開始,默認返回10個結果
  • 獲取靠後的分頁成本較高

2.排序

可在request請求中加入 sort 參數用於排序。

  1. 最好在「數字型」與「日期型」字段上排序
  2. 由於對於多值類型或分析過的字段排序,系統會選一個值,沒法得知該值
GET kibana_sample_data_ecommerce/_search
{
  "sort": [
    {
      "order_date": "desc"
    }
  ],
  "from": 10,
  "size": 5,
  "query": {
    "match_all": {}
  }
  
}
複製代碼

3._source filtering

好比說文檔很大,不少類型的字段並不須要,那就能夠在request中加入 _source 對查詢字段進行過濾,加上你須要查詢的字段信息便可。

  • 若是 _source 沒有存儲,那就只返回匹配的文檔的元數據
  • _source 只支持使用通配符 _source["name*","desc*"]
GET kibana_sample_data_ecommerce/_search
{
  "_source": ["order_date"], 
  "from": 10,
  "size": 5,
  "query": {
    "match_all": {}
  }
  
}
複製代碼

source

4.腳本字段

腳本字段就是能夠用elasticsearch的 painless 腳本去計算出一個結果出來

  • 例子:對order_date字段進行處理,加後綴_hello
GET kibana_sample_data_ecommerce/_search
{
  "script_fields": {
    "new_field": {
      "script": {
        "lang": "painless",
        "source": "doc['order_date'].value+'_hello'"
      }
    }
  },
  "query": {
    "match_all": {}
  }
  
}
複製代碼

SHELL

5.使用查詢表達式-Match

在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"
      }
    }
  }
}
複製代碼

6.短語搜索-Match Phrase

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

Query String & Simple Query String查詢

1.Query String

在URI中是能夠使用query string的,那一樣在DSL中也支持query String的使用

2.Simple Query String Query

  • 相似於Query String,可是會忽略錯誤的語法,同時只支持部分查詢語法
  • 不支持 AND OR NOT ,會當作字符串處理
  • Term 之間默認的關係是OR,能夠指定Operator
  • 支持部分邏輯
    • + 替代 AND
    • | 替代 OR
    • - 替代 NOT

3.舉例演示

# 插入用戶1
PUT /users/_doc/1
{
  "name":"Zhang San",
  "about":"java,elasticsearch,product"
}
# 插入用戶2
PUT /users/_doc/2
{
  "name":"Li San",
  "about":"python,golang"
}
複製代碼

SIMPLE QUERY STRING

總結

request body DSL中包含了不少很是高級強大的用法,更精彩的部分在接下來的提升文檔中介紹。本篇主要是講述了elasticsearch的search API,對URI search和Request Body DSL的操做,用法作了介紹。實操部分較多,還需多多練習


以爲不錯,請點個贊吧

zan
相關文章
相關標籤/搜索