44、Python快速開發(fā)分布式搜索引擎Scrapy精講—elasticsearch(搜索引擎)的基本查詢

百度云搜索,搜各種資料: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ù)

image

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": "搜索引擎"
    }
  }
}
image

term查詢
不會(huì)將我們的搜索詞進(jìn)行分詞,將搜索詞完全匹配的查詢

term查詢

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

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"]
    }
  }
}
image

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"]
    }
  }
}
image

通過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"]
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容