標籤:obb 注意 轉換 分詞 ras 指定欄位 返回 source pos
1、elasticsearch(搜尋引擎)的查詢
elasticsearch是功能非常強大的搜尋引擎,使用它的目的就是為了快速的查詢到需要的資料
查詢分類:
基本查詢:使用elasticsearch內建的查詢條件進行查詢
組合查詢:把多個查詢條件組合在一起進行複合查詢
過濾:查詢同時,通過filter條件在不影響打分的情況下篩選資料
2、elasticsearch(搜尋引擎)建立資料
首先我們先建立索引、表、以及欄位屬性、欄位類型、添加好資料
注意:一般我們中文使用ik_max_word中文分詞解析器,所有在需要分詞建立倒牌索引的欄位都要指定,ik_max_word中文分詞解析器
系統預設不是ik_max_word中文分詞解析器
ik_max_word中文分詞解析器是elasticsearch(搜尋引擎)的一個外掛程式,在elasticsearch安裝目錄的plugins/analysis-ik檔案夾裡,版本為5.1.1
更多說明:https://github.com/medcl/elasticsearch-analysis-ik
說明:
#建立索引(設定欄位類型)#注意:一般我們中文使用ik_max_word中文分詞解析器,所有在需要分詞建立倒牌索引的欄位都要指定,ik_max_word中文分詞解析器#系統預設不是ik_max_word中文分詞解析器PUT jobbole #建立索引設定索引名稱{ "mappings": { #設定mappings映射欄位類型 "job": { #表名稱 "properties": { #設定欄位類型 "title":{ #表名稱 "store": true, #欄位屬性true表示儲存資料 "type": "text", #text類型,text類型可以分詞,建立倒排索引 "analyzer": "ik_max_word" #設定分詞解析器,ik_max_word是一個中文分詞解析器外掛程式 }, "company_name":{ #欄位名稱 "store": true, #欄位屬性true表示儲存資料 "type": "keyword" #keyword一般字元串類型,不分詞 }, "desc":{ #欄位名稱 "type": "text" #text類型,text類型可以分詞,但是沒有設定分詞解析器,使用系統預設 }, "comments":{ #欄位名稱 "type": "integer" #integer數字類型 }, "add_time":{ #欄位名稱 "type": "date", #date時間類型 "format":"yyyy-MM-dd" #yyyy-MM-dd時間格式化 } } } }}
#儲存文檔(相當於資料庫的寫入資料)POST jobbole/job{ "title":"python django 開發工程師", #欄位名稱:值 "company_name":"美團科技有限公司", #欄位名稱:值 "desc":"對django的概念熟悉, 熟悉python基礎知識", #欄位名稱:值 "comments":20, #欄位名稱:值 "add_time":"2017-4-1" #欄位名稱:值}POST jobbole/job{ "title":"python scrapy redis 分布式爬蟲基礎", "company_name":"玉秀科技有限公司", "desc":"對scrapy的概念熟悉, 熟悉redis基礎知識", "comments":5, "add_time":"2017-4-2"}POST jobbole/job{ "title":"elasticsearch打造搜尋引擎", "company_name":"通訊科技有限公司", "desc":"對elasticsearch的概念熟悉", "comments":10, "add_time":"2017-4-3"}POST jobbole/job{ "title":"pyhhon打造Recommendation Engine系統", "company_name":"智能科技有限公司", "desc":"熟悉Recommendation Engine系統演算法", "comments":60, "add_time":"2017-4-4"}
通過上面可以看到我們建立了索引並且設定好了欄位的屬性、類型、以及分詞解析器,建立了4條資料
3、elasticsearch(搜尋引擎)基本查詢
match查詢【用的最多】
會將我們的搜尋字詞在當前欄位設定的分詞器進行分詞,到當前欄位尋找,匹配度越高排名靠前,如果搜尋字詞是大寫字母會自動轉換成小寫
#match查詢#會將我們的搜尋字詞進行分詞,到指定欄位尋找,匹配度越高排名靠前GET jobbole/job/_search{ "query": { "match": { "title": "搜尋引擎" } }}
term查詢
不會將我們的搜尋字詞進行分詞,將搜尋字詞完全符合的查詢
#term查詢#不會將我們的搜尋字詞進行分詞,將搜尋字詞完全符合的查詢GET jobbole/job/_search{ "query": { "term": { "title":"搜尋引擎" } }}
terms查詢
傳遞一個數組,將數組裡的詞分別匹配
#terms查詢#傳遞一個數組,將數組裡的詞分別匹配GET jobbole/job/_search{ "query": { "terms": { "title":["工程師","django","系統"] } }}
控制查詢的返回數量
from從第幾條資料開始
size擷取幾條資料
#控制查詢的返回數量#from從第幾條資料開始#size擷取幾條資料 GET jobbole/job/_search{ "query": { "match": { "title": "搜尋引擎" } }, "from": 0, "size": 3}
match_all查詢,查詢所有資料
#match_all查詢,查詢所有資料GET jobbole/job/_search{ "query": { "match_all": {} }}
match_phrase查詢
短語查詢
短語查詢,會將搜尋字詞分詞,放進一個列表如[python,開發]
然後搜尋的欄位必須滿足列表裡的所有元素,才符合
slop是設定分詞後[python,開發]python 與 開發,之間隔著多少個字元算匹配
佔空間字元數小於slop設定算匹配到,佔空間字元數大於slop設定不匹配
#match_phrase查詢#短語查詢#短語查詢,會將搜尋字詞分詞,放進一個列表如[python,開發]#然後搜尋的欄位必須滿足列表裡的所有元素,才符合#slop是設定分詞後[python,開發]python 與 開發,之間隔著多少個字元算匹配#佔空間字元數小於slop設定算匹配到,佔空間字元數大於slop設定不匹配GET jobbole/job/_search{ "query": { "match_phrase": { "title": { "query": "elasticsearch引擎", "slop":3 } } }}
multi_match查詢
比如可以指定多個欄位
比如查詢title欄位和desc欄位裡麵包含python的關鍵詞資料
query設定搜尋字詞
fields要搜尋的欄位
title^3表示權重,表示title裡符合的關鍵詞權重,是其他欄位裡符合的關鍵詞權重的3倍
#multi_match查詢#比如可以指定多個欄位#比如查詢title欄位和desc欄位裡麵包含python的關鍵詞資料#query設定搜尋字詞#fields要搜尋的欄位#title^3表示權重,表示title裡符合的關鍵詞權重,是其他欄位裡符合的關鍵詞權重的3倍GET jobbole/job/_search{ "query": { "multi_match": { "query": "搜尋引擎", "fields": ["title^3","desc"] } }}
stored_fields設定搜尋結果只顯示哪些欄位
注意:使用stored_fields要顯示的欄位store屬性必須為true,如果要顯示的欄位沒有設定store屬性那麼預設為false,如果為false將不會顯示該欄位
#stored_fields設定搜尋結果只顯示哪些欄位GET jobbole/job/_search{ "stored_fields": ["title","company_name"], "query": { "multi_match": { "query": "搜尋引擎", "fields": ["title^3","desc"] } }}
通過sort搜尋結果排序
注意:排序的欄位必須是數字或者日期
desc升序
asc降序
#通過sort搜尋結果排序#注意:排序的欄位必須是數字或者日期#desc升序#asc降序GET jobbole/job/_search{ "query": { "match_all": {} }, "sort": [{ "comments": { "order": "asc" } }]}
range欄位值範圍查詢
查詢一個欄位的值範圍
注意:欄位值必須是數字或者時間
gte大於等於
ge大於
lte小於等於
lt小於
boost是權重,可以給指定欄位設定一個權重
#range欄位值範圍查詢#查詢一個欄位的值範圍#注意:欄位值必須是數字或者時間#gte大於等於#ge大於#lte小於等於#lt小於#boost是權重,可以給指定欄位設定一個權重GET jobbole/job/_search{ "query": { "range": { "comments": { "gte": 10, "lte": 20, "boost": 2.0 } } }}
range欄位值為時間範圍查詢
#range欄位值為時間範圍查詢#查詢一個欄位的時間值範圍#注意:欄位值必須是時間#gte大於等於#ge大於#lte小於等於#lt小於#now為目前時間GET jobbole/job/_search{ "query": { "range": { "add_time": { "gte": "2017-4-1", "lte": "now" } } }}
wildcard查詢,萬用字元查詢
*代表一個或者多個任一字元
#wildcard查詢,萬用字元查詢#*代表一個或者多個任一字元GET jobbole/job/_search{ "query": { "wildcard": { "title": { "value": "py*n", "boost": 2 } } }}
fuzzy模糊查詢
#fuzzy模糊搜尋#搜尋包含詞的內容GET lagou/biao/_search{ "query": { "fuzzy": {"title": "廣告"} }, "_source": ["title"]}#fuzziness設定編輯距離,編輯距離就是把要尋找的欄位值,編輯成尋找的關鍵詞需要編輯多少個步驟(插入、刪除、替換)#prefix_length為關鍵詞前面不參與變換的長度GET lagou/biao/_search{ "query": { "fuzzy": { "title": { "value": "廣告錄音", "fuzziness": 2, "prefix_length": 2 } } }, "_source": ["title"]}
四十四 Python分布式爬蟲打造搜尋引擎Scrapy精講—elasticsearch(搜尋引擎)的基本查詢