【百度云搜索,搜各種資料:http://bdy.lqkweb.com】
【搜網(wǎng)盤,搜各種資料:http://www.swpan.cn】
1、elasticsearch(搜索引擎)的查詢
elasticsearch是功能非常強(qiáng)大的搜索引擎,使用它的目的就是為了快速的查詢到需要的數(shù)據(jù)
查詢分類:
基本查詢:使用elasticsearch內(nèi)置的查詢條件進(jìn)行查詢
組合查詢:把多個(gè)查詢條件組合在一起進(jìn)行復(fù)合查詢
過濾:查詢同時(shí),通過filter條件在不影響打分的情況下篩選數(shù)據(jù)
2、elasticsearch(搜索引擎)創(chuàng)建數(shù)據(jù)
首先我們先創(chuàng)建索引、表、以及字段屬性、字段類型、添加好數(shù)據(jù)
注意:一般我們中文使用ik_max_word中文分詞解析器,所有在需要分詞建立倒牌索引的字段都要指定,ik_max_word中文分詞解析器
系統(tǒng)默認(rèn)不是ik_max_word中文分詞解析器
ik_max_word中文分詞解析器是elasticsearch(搜索引擎)的一個(gè)插件,在elasticsearch安裝目錄的plugins/analysis-ik文件夾里,版本為5.1.1
更多說明:https://github.com/medcl/elasticsearch-analysis-ik
說明:
#創(chuàng)建索引(設(shè)置字段類型)
#注意:一般我們中文使用ik_max_word中文分詞解析器,所有在需要分詞建立倒牌索引的字段都要指定,ik_max_word中文分詞解析器
#系統(tǒng)默認(rèn)不是ik_max_word中文分詞解析器
PUT jobbole #創(chuàng)建索引設(shè)置索引名稱
{
"mappings": { #設(shè)置mappings映射字段類型
"job": { #表名稱
"properties": { #設(shè)置字段類型
"title":{ #表名稱
"store": true, #字段屬性true表示保存數(shù)據(jù)
"type": "text", #text類型,text類型可以分詞,建立倒排索引
"analyzer": "ik_max_word" #設(shè)置分詞解析器,ik_max_word是一個(gè)中文分詞解析器插件
},
"company_name":{ #字段名稱
"store": true, #字段屬性true表示保存數(shù)據(jù)
"type": "keyword" #keyword普通字符串類型,不分詞
},
"desc":{ #字段名稱
"type": "text" #text類型,text類型可以分詞,但是沒有設(shè)置分詞解析器,使用系統(tǒng)默認(rèn)
},
"comments":{ #字段名稱
"type": "integer" #integer數(shù)字類型
},
"add_time":{ #字段名稱
"type": "date", #date時(shí)間類型
"format":"yyyy-MM-dd" #yyyy-MM-dd時(shí)間格式化
}
}
}
}
}
#保存文檔(相當(dāng)于數(shù)據(jù)庫的寫入數(shù)據(jù))
POST jobbole/job
{
"title":"python django 開發(fā)工程師", #字段名稱:值
"company_name":"美團(tuán)科技有限公司", #字段名稱:值
"desc":"對(duì)django的概念熟悉, 熟悉python基礎(chǔ)知識(shí)", #字段名稱:值
"comments":20, #字段名稱:值
"add_time":"2017-4-1" #字段名稱:值
}
POST jobbole/job
{
"title":"python scrapy redis 分布式爬蟲基礎(chǔ)",
"company_name":"玉秀科技有限公司",
"desc":"對(duì)scrapy的概念熟悉, 熟悉redis基礎(chǔ)知識(shí)",
"comments":5,
"add_time":"2017-4-2"
}
POST jobbole/job
{
"title":"elasticsearch打造搜索引擎",
"company_name":"通訊科技有限公司",
"desc":"對(duì)elasticsearch的概念熟悉",
"comments":10,
"add_time":"2017-4-3"
}
POST jobbole/job
{
"title":"pyhhon打造推薦引擎系統(tǒng)",
"company_name":"智能科技有限公司",
"desc":"熟悉推薦引擎系統(tǒng)算法",
"comments":60,
"add_time":"2017-4-4"
}
** 通過上面可以看到我們創(chuàng)建了索引并且設(shè)置好了字段的屬性、類型、以及分詞解**析器,創(chuàng)建了4條數(shù)據(jù)

3、elasticsearch(搜索引擎)基本查詢
match查詢【用的最多】
會(huì)將我們的搜索詞在當(dāng)前字段設(shè)置的分詞器進(jìn)行分詞,到當(dāng)前字段查找,匹配度越高排名靠前,如果搜索詞是大寫字母會(huì)自動(dòng)轉(zhuǎn)換成小寫
#match查詢
#會(huì)將我們的搜索詞進(jìn)行分詞,到指定字段查找,匹配度越高排名靠前
GET jobbole/job/_search
{
"query": {
"match": {
"title": "搜索引擎"
}
}
}

term查詢
不會(huì)將我們的搜索詞進(jìn)行分詞,將搜索詞完全匹配的查詢
term查詢
#不會(huì)將我們的搜索詞進(jìn)行分詞,將搜索詞完全匹配的查詢
GET jobbole/job/_search
{
"query": {
"term": {
"title":"搜索引擎"
}
}
}

terms查詢
傳遞一個(gè)數(shù)組,將數(shù)組里的詞分別匹配
#terms查詢
#傳遞一個(gè)數(shù)組,將數(shù)組里的詞分別匹配
GET jobbole/job/_search
{
"query": {
"terms": {
"title":["工程師","django","系統(tǒng)"]
}
}
}
控制查詢的返回?cái)?shù)量
from從第幾條數(shù)據(jù)開始
size獲取幾條數(shù)據(jù)
#控制查詢的返回?cái)?shù)量
#from從第幾條數(shù)據(jù)開始
#size獲取幾條數(shù)據(jù)
GET jobbole/job/_search
{
"query": {
"match": {
"title": "搜索引擎"
}
},
"from": 0,
"size": 3
}
match_all查詢,查詢所有數(shù)據(jù)
#match_all查詢,查詢所有數(shù)據(jù)
GET jobbole/job/_search
{
"query": {
"match_all": {}
}
}
match_phrase查詢
短語查詢
短語查詢,會(huì)將搜索詞分詞,放進(jìn)一個(gè)列表如[python,開發(fā)]
然后搜索的字段必須滿足列表里的所有元素,才符合
slop是設(shè)置分詞后[python,開發(fā)]python 與 開發(fā),之間隔著多少個(gè)字符算匹配
間隔字符數(shù)小于slop設(shè)置算匹配到,間隔字符數(shù)大于slop設(shè)置不匹配
#match_phrase查詢
#短語查詢
#短語查詢,會(huì)將搜索詞分詞,放進(jìn)一個(gè)列表如[python,開發(fā)]
#然后搜索的字段必須滿足列表里的所有元素,才符合
#slop是設(shè)置分詞后[python,開發(fā)]python 與 開發(fā),之間隔著多少個(gè)字符算匹配
#間隔字符數(shù)小于slop設(shè)置算匹配到,間隔字符數(shù)大于slop設(shè)置不匹配
GET jobbole/job/_search
{
"query": {
"match_phrase": {
"title": {
"query": "elasticsearch引擎",
"slop":3
}
}
}
}
multi_match查詢
比如可以指定多個(gè)字段
比如查詢title字段和desc字段里面包含python的關(guān)鍵詞數(shù)據(jù)
query設(shè)置搜索詞
fields要搜索的字段
title^3表示權(quán)重,表示title里符合的關(guān)鍵詞權(quán)重,是其他字段里符合的關(guān)鍵詞權(quán)重的3倍
#multi_match查詢
#比如可以指定多個(gè)字段
#比如查詢title字段和desc字段里面包含python的關(guān)鍵詞數(shù)據(jù)
#query設(shè)置搜索詞
#fields要搜索的字段
#title^3表示權(quán)重,表示title里符合的關(guān)鍵詞權(quán)重,是其他字段里符合的關(guān)鍵詞權(quán)重的3倍
GET jobbole/job/_search
{
"query": {
"multi_match": {
"query": "搜索引擎",
"fields": ["title^3","desc"]
}
}
}

stored_fields設(shè)置搜索結(jié)果只顯示哪些字段
注意:使用stored_fields要顯示的字段store屬性必須為true,如果要顯示的字段沒有設(shè)置store屬性那么默認(rèn)為false,如果為false將不會(huì)顯示該字段
#stored_fields設(shè)置搜索結(jié)果只顯示哪些字段
GET jobbole/job/_search
{
"stored_fields": ["title","company_name"],
"query": {
"multi_match": {
"query": "搜索引擎",
"fields": ["title^3","desc"]
}
}
}

通過sort搜索結(jié)果排序
注意:排序的字段必須是數(shù)字或者日期
desc升序
asc降序
#通過sort搜索結(jié)果排序
#注意:排序的字段必須是數(shù)字或者日期
#desc升序
#asc降序
GET jobbole/job/_search
{
"query": {
"match_all": {}
},
"sort": [{
"comments": {
"order": "asc"
}
}]
}
range字段值范圍查詢
查詢一個(gè)字段的值范圍
注意:字段值必須是數(shù)字或者時(shí)間
gte大于等于
ge大于
lte小于等于
lt小于
boost是權(quán)重,可以給指定字段設(shè)置一個(gè)權(quán)重
#range字段值范圍查詢
#查詢一個(gè)字段的值范圍
#注意:字段值必須是數(shù)字或者時(shí)間
#gte大于等于
#ge大于
#lte小于等于
#lt小于
#boost是權(quán)重,可以給指定字段設(shè)置一個(gè)權(quán)重
GET jobbole/job/_search
{
"query": {
"range": {
"comments": {
"gte": 10,
"lte": 20,
"boost": 2.0
}
}
}
}
range字段值為時(shí)間范圍查詢
#range字段值為時(shí)間范圍查詢
#查詢一個(gè)字段的時(shí)間值范圍
#注意:字段值必須是時(shí)間
#gte大于等于
#ge大于
#lte小于等于
#lt小于
#now為當(dāng)前時(shí)間
GET jobbole/job/_search
{
"query": {
"range": {
"add_time": {
"gte": "2017-4-1",
"lte": "now"
}
}
}
}
wildcard查詢,通配符查詢
*代表一個(gè)或者多個(gè)任意字符
#wildcard查詢,通配符查詢
#*代表一個(gè)或者多個(gè)任意字符
GET jobbole/job/_search
{
"query": {
"wildcard": {
"title": {
"value": "py*n",
"boost": 2
}
}
}
}
fuzzy模糊查詢
#fuzzy模糊搜索
#搜索包含詞的內(nèi)容
GET lagou/biao/_search
{
"query": {
"fuzzy": {"title": "廣告"}
},
"_source": ["title"]
}
#fuzziness設(shè)置編輯距離,編輯距離就是把要查找的字段值,編輯成查找的關(guān)鍵詞需要編輯多少個(gè)步驟(插入、刪除、替換)
#prefix_length為關(guān)鍵詞前面不參與變換的長(zhǎng)度
GET lagou/biao/_search
{
"query": {
"fuzzy": {
"title": {
"value": "廣告錄音",
"fuzziness": 2,
"prefix_length": 2
}
}
},
"_source": ["title"]
}