体彩天津11选5开奖结果:魯智深不花 - 天津11选5中奖结果 //www.ebzvaz.com.cn 略懂php_JavaScript_python編程 Tue, 05 Nov 2019 06:47:54 +0000 zh-CN hourly 1 https://wordpress.org/?v=4.8.11 crontab定時任務執行scrapyd爬蟲 - 天津11选5中奖结果 //www.ebzvaz.com.cn/python/scrapy/crontab-scrapyd.html //www.ebzvaz.com.cn/python/scrapy/crontab-scrapyd.html#respond Thu, 10 Oct 2019 11:56:02 +0000 //www.ebzvaz.com.cn/?p=4437 crontab系統自帶的調度命令,通過crontab命令,我們可以在固定的間隔時間執行指定的系統指令或 shell script腳本。時間間隔的單位可以是分鐘、小時、日、月、周及以上的任意組合。這個命令非常適合周期性的日志分析或數據備份等工作。

mac 查看 crontab 是否啟動

1
sudo launchctl list | grep cron

crontab服務的重啟關閉,開啟

mac系統下

1
2
3
sudo /usr/sbin/cron start
sudo /usr/sbin/cron restart
sudo /usr/sbin/cron stop

ubuntu:

1
2
3
$sudo /etc/init.d/cron start
$sudo /etc/init.d/cron stop
$sudo /etc/init.d/cron restart

這里用它來完成scrapyd部署爬蟲定時任務推送功能。

crontab命令

1
crontab [-u user] file crontab [-u user] [ -e | -l | -r ]

命令參數

-u user:用來設定某個用戶的crontab服務;
file:file是命令文件的名字,表示將file做為crontab的任務列表文件并導入crontab。如果在命令行中沒有指定這個文件,crontab命令將接受標準輸入(鍵盤)上鍵入的命令,并將它們載入crontab。
-e:編輯某個用戶的crontab文件內容。如果不指定用戶,則表示編輯當前用戶的crontab文件。
-l:顯示某個用戶的crontab文件內容,如果不指定用戶,則表示顯示當前用戶的crontab文件內容。
-r:從/var/spool/cron目錄中刪除某個用戶的crontab文件,如果不指定用戶,則默認刪除當前用戶的crontab文件。
-i:在刪除用戶的crontab文件時給確認提示。

使用-l參數列出crontab文件

1
crontab -l

使用-r參數刪除crontab文件

1
crontab -r

刪除文件后,定時任務不會在執行

crontab的文件格式

基本格式 :
*  *  *  *  *  command
分  時  日  月  周  命令

第1列分鐘0~59

第2列小時0~23(0表示子夜)

第3列日1~31

第4列月1~12

第5列星期0~7(0和7表示星期天)

第6列要運行的命令

追加 crontab 定時任務,每分鐘觸發,會已vim方式呈現

1
crontab -e

執行scrapyd爬蟲命令

1
* * * * * curl //localhost:6800/schedule.json -d project=xinchen -d spider=douban_spider

再次查看定時任務列表,可以看到定時任務已經添加

1
crontab -l
1
2
3
4
bash-3.2$ crontab -l
* * * * * curl //localhost:6800/schedule.json -d project=xinchen -d spider=douban_spider
* * * * * curl //localhost:6800/schedule.json -d project=xinchen -d spider=douban_tv_spider
* * * * * curl //localhost:6800/schedule.json -d project=xinchen -d spider=douban_variety_show

更多例子:

1、每分鐘執行一次
* * * * *

2、每隔一小時執行一次
00 * * * *
or
* */1 * * * (/表示頻率)

3、每小時的15和30分各執行一次
15,45 * * * * (,表示并列)

4、在每天上午 8- 11時中間每小時 15 ,45分各執行一次
15,45 8-11 * * * command (-表示范圍)

5、每個星期一的上午8點到11點的第3和第15分鐘執行
3,15 8-11 * * 1 command

6、每隔兩天的上午8點到11點的第3和第15分鐘執行
3,15 8-11 */2 * * command

導入預先編好的腳本文件

一般來說,crontab用-e調出vi來編寫,但是在實際工作中經常有這種情況是,編程好了crontab文件,需要導入到生產機器上去。

1
crontab filename

更多命令

名稱 : crontab

使用權限 : 所有使用者

使用方式 :

crontab file [-u user]-用指定的文件替代目前的crontab。

crontab-[-u user]-用標準輸入替代目前的crontab.

crontab-1[user]-列出用戶目前的crontab.

crontab-e[user]-編輯用戶目前的crontab.

crontab-d[user]-刪除用戶目前的crontab.

crontab-c dir- 指定crontab的目錄。

更多關于crontab的內容

]]>
//www.ebzvaz.com.cn/python/scrapy/crontab-scrapyd.html/feed 0
Scrapyd部署 - 天津11选5中奖结果 //www.ebzvaz.com.cn/python/scrapyd-deploy.html //www.ebzvaz.com.cn/python/scrapyd-deploy.html#respond Tue, 24 Sep 2019 08:04:56 +0000 //www.ebzvaz.com.cn/?p=4431 Scrapyd 是一個server,是scrapy官方推薦的部署管理spider的服務,以及通過http json控制spider。

首先先安裝scrapyd

scrapyd的安裝必須在能運行scrapy項目的虛擬環境中

1
pip install scrapyd

運行Scrapyd

1
scrapyd

2019-09-24T15:11:05+0800 [-] Loading /home/atguigu/Envs/crawler-PlsRPGJ5/lib/python3.6/site-packages/scrapyd/txapp.py…
2019-09-24T15:11:05+0800 [-] Scrapyd web console available at //127.0.0.1:6800/
2019-09-24T15:11:05+0800 [-] Loaded.
2019-09-24T15:11:05+0800 [twisted.scripts._twistd_unix.UnixAppLogger#info] twistd 19.7.0 (/home/atguigu/Envs/crawler-PlsRPGJ5/bin/python3.6 3.6.8) starting up.
2019-09-24T15:11:05+0800 [twisted.scripts._twistd_unix.UnixAppLogger#info] reactor class: twisted.internet.epollreactor.EPollReactor.
2019-09-24T15:11:05+0800 [-] Site starting on 6800
2019-09-24T15:11:05+0800 [twisted.web.server.Site#info] Starting factory
2019-09-24T15:11:05+0800 [Launcher] Scrapyd 1.2.1 started: max_proc=16, runner=’scrapyd.runner’

啟動了Scrapyd,發現Scrapyd是一個服務器,那我們需要一個Scrapyd-client客戶端發送爬蟲代碼到Scrapyd服務中去。

這里先修改一下Scrapyd服務地址,默認scrapyd啟動是通過scrapyd就可以直接啟動,bind綁定的ip地址是127.0.0.1端口是:6800,這里為了其他主機可以訪問,需將ip地址設置為0.0.0.0

即將

1
bind_address = 127.0.0.1

改為

1
bind_address = 0.0.0.0

scrapyd的配置文件(pipenv環境路徑)

1
/home/atguigu/Envs/crawler-PlsRPGJ5/lib/python3.6/site-packages/scrapyd

訪問地址

1
//192.168.153.166:6800/

這樣我們就可以在其他主機通過瀏覽器訪問了

安裝scrapyd-client

有了scrapyd服務,下面就要用scrapyd-client打包scrapy成egg文件發送到scrapyd服務中。

1
pip install scrapyd-client

無需在虛擬環境中,任何環境下安裝即可,只是負責打包的任務

首先cd進入項目的根目錄,然后可以使用以下內容部署項目:測試運行

1
scrapyd-deploy

返回 Unknown target: default

部署項目

檢查配置, 列出當前可用的服務器

1
scrapyd-deploy -l

xinchen_server //localhost:6800/

列出服務器上所有的項目, 需要確保服務器上的scrapyd命令正在執行,否則會報連接失敗.首次運行的話,可以看到只有一個default項目

1
2
$ scrapyd-deploy -L xinchen_server
default

打開//localhost:6800/, 可以看到Available projects: default

打包你的當前項目

1
scrapyd-deploy xinchen_server -p xinchen

我們也可以把項目信息寫入到配置文件中,部署時就不用指定項目信息,編輯scrapy.cfg文件,添加項目信息

1
2
3
4
5
6
7
[settings]
default = xinchen.settings

[deploy:xinchen_server]
url = //localhost:6800/
username = root
password =

下次部署可以直接執行

1
scrapyd-deploy

運行爬蟲

1
curl //localhost:6800/schedule.json -d project=xinchen -d spider=douban_film_comment

停止爬蟲

1
curl //localhost:6800/cancel.json -d project=xinchen -d job=94bd8ce041fd11e6af1a000c2969bafd
]]>
//www.ebzvaz.com.cn/python/scrapyd-deploy.html/feed 0
pycharm中運行nosetests測試用例 - 天津11选5中奖结果 //www.ebzvaz.com.cn/python/nosetests-test-case-in-pycharm.html //www.ebzvaz.com.cn/python/nosetests-test-case-in-pycharm.html#respond Thu, 20 Dec 2018 15:51:38 +0000 //www.ebzvaz.com.cn/?p=4402 1、配置 pycharm 調試文件

2、添加 nosetets 文件

3、直接ok確定

4、設置默認啟動的測試工具(框架)

5、tools里面選擇Python Intergated Tools

6、選擇nosetets,ok確定退出

5、在py代碼頁面右鍵,啟動測試用例,發現現在默認通過nosetets工具調試

]]>
//www.ebzvaz.com.cn/python/nosetests-test-case-in-pycharm.html/feed 0
我為自家大閘蟹代言 - 天津11选5中奖结果 //www.ebzvaz.com.cn/csqw/dazhaxie.html //www.ebzvaz.com.cn/csqw/dazhaxie.html#respond Mon, 08 Oct 2018 15:51:26 +0000 //www.ebzvaz.com.cn/?p=4394 淘寶:鏈接

]]>
//www.ebzvaz.com.cn/csqw/dazhaxie.html/feed 0
python腳本調用youtube-dl實現視頻下載 - 天津11选5中奖结果 //www.ebzvaz.com.cn/python/python-youtube-dl.html //www.ebzvaz.com.cn/python/python-youtube-dl.html#respond Thu, 02 Aug 2018 18:29:36 +0000 //www.ebzvaz.com.cn/?p=4284 youtube-dl是一個命令行程序,用于從YouTube.com和更多網站下載視頻。它需要Python解釋器,版本2.6,2.7或3.2+,并且支持Unix,Windows或Mac OS X中運行。而且它提供了自定義添加視頻解釋并發布到github上,這意味著可以對其進行修改,重新分發。

ubuntu系統安裝youtube-dl

1
sudo pip install youtube-dl

更新包

1
sudo -H pip install --upgrade youtube-dl

或者

1
pip install --upgrade youtube-dl

youtube-dl在大多數網站上都可以正常工作。但是,如果您想轉換視頻/音頻,視頻音頻合成,則需要avconv或ffmpeg

1
2
3
4
5
6
7
8
# 添加軟件源
$ sudo add-apt-repository ppa:jonathonf/ffmpeg-3

# 更新并安裝
$ sudo apt update && sudo apt install ffmpeg libav-tools x264 x265

# 卸載官方源的2.8版本
$ sudo apt autoremove

先來一段簡單的python腳本代碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from os import rename
import youtube_dl

def download(youtube_url):
    # 定義某些下載參數
    ydl_opts = {
        # outtmpl 格式化下載后的文件名,避免默認文件名太長無法保存
        'outtmpl': '%(id)s%(ext)s'
    }

    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        ydl.download([youtube_url])

if __name__ == '__main__':
    download('https://www.youtube.com/watch?v=VUOAszEiR8I')

代碼執行youtube網站視頻頁鏈接,交給dowload下載,字典 ydl_opts 自定義了一些下載參數。

重命名視頻文件

當你運行代碼后,發現下載的視頻文件命名不是你想要的樣子,這里了 youtube-dl 提供了一個鉤子函數進行自定義功能,代碼是這樣的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class GetItem(object):

    def rename_hook(self,d):
        # 重命名下載的視頻名稱的鉤子
        if d['status'] == 'finished':
            file_name = 'video/{}.mp4'.format(int(time.time()))
            rename(d['filename'], file_name)
            print('下載完成{}'.format(file_name))

    def download(self,youtube_url):
        # 定義某些下載參數
        ydl_opts = {
            'progress_hooks': [self.rename_hook],
            # 格式化下載后的文件名,避免默認文件名太長無法保存
            'outtmpl': '%(id)s%(ext)s',
        }
        with youtube_dl.YoutubeDL(ydl_opts) as ydl:
            # 下載給定的URL列表
            result = ydl.download([youtube_url])

if __name__ == '__main__':
    getItem =  GetItem()
    getItem.download('https://www.youtube.com/watch?v=VUOAszEiR8I')

代碼 d[‘status’] == ‘finished’執行,說明了當視頻下載完成后,執行重命名文件名

自定義下載格式

在定義下載下載參數時可以寫入format:”格式” 來控制下載的格式,youtube-dl給到了以下這些默認的格式

best:選擇具有視頻和音頻的單個文件所代表的最佳質量格式。

worst:選擇具有視頻和音頻的單個文件所代表的最差質量格式。

bestvideo:選擇最佳質量的僅視頻格式(例如DASH視頻)??贍芪薹ㄊ褂?。

worstvideo:選擇質量最差的純視頻格式??贍芪薹ㄊ褂?。

bestaudio:選擇質量最佳的音頻格式??贍芪薹ㄊ褂?。

worstaudio:選擇質量最差的音頻格式??贍芪薹ㄊ褂?。

我們也可以通過視頻原有的格式來下載

在終端輸入 : youtube-dl -F 視頻地址

shell 命令查看參數

shell 命令查看參數

可以看到有h5 ,1,h3 三種格式,所以代碼可以這樣寫:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class GetItem(object):

    def rename_hook(self,d):
        # 重命名下載的視頻名稱的鉤子
        if d['status'] == 'finished':
            file_name = 'video/{}.mp4'.format(int(time.time()))
            rename(d['filename'], file_name)
            print('下載完成{}'.format(file_name))

    def download(self,youtube_url):
        # 定義某些下載參數
        ydl_opts = {
            # 我指定了要下載 “1” 這個格式,也可以填寫 best/worst/worstaudio 等等
            'format' : '1'
            'progress_hooks': [self.rename_hook],
            # 格式化下載后的文件名,避免默認文件名太長無法保存
            'outtmpl': '%(id)s%(ext)s',
        }
        with youtube_dl.YoutubeDL(ydl_opts) as ydl:
            # 下載給定的URL列表
            result = ydl.download([youtube_url])

if __name__ == '__main__':
    getItem =  GetItem()
    getItem.download('https://www.youtube.com/watch?v=VUOAszEiR8I')

日志打印

如果要打印youtube-dl的輸出logs,請設置一個logger對象。 同自定義格式一樣,配置參數’logger’: MyLogger(),如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class MyLogger(object):
    def debug(self, msg):
        pass

    def warning(self, msg):
        pass

    def error(self, msg):
        print(msg)

class GetItem(object):

    def rename_hook(self,d):
        # 重命名下載的視頻名稱的鉤子
        if d['status'] == 'finished':
            file_name = 'video/{}.mp4'.format(int(time.time()))
            rename(d['filename'], file_name)
            print('下載完成{}'.format(file_name))

    def download(self,youtube_url):
        # 定義某些下載參數
        ydl_opts = {
            # 我指定了要下載 “1” 這個格式,也可以填寫 best/worst/worstaudio 等等
            'format' : '1'
            'progress_hooks': [self.rename_hook],
            # 格式化下載后的文件名,避免默認文件名太長無法保存
            'outtmpl': '%(id)s%(ext)s',
            # 打印日志
            'logger': MyLogger()
        }
        with youtube_dl.YoutubeDL(ydl_opts) as ydl:
            # 下載給定的URL列表
            result = ydl.download([youtube_url])

if __name__ == '__main__':
    getItem =  GetItem()
    getItem.download('https://www.youtube.com/watch?v=VUOAszEiR8I')

提取視頻的json信息打印

現在有一個需求是:不需要下載視頻,我想要得到當前頁視頻網站的數據,可以用 extract_info 不用 download 去下載

1
2
3
4
5
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
   # extract_info 提取信息
   result = ydl.extract_info(youtube_url, download=False)

print(result)

合并音頻+視頻

可以先用youtube-dl -F “視頻地址”查看format信息,在選擇對應的格式代號如(’format’: ‘134+m4a’,)合成,但是合成視頻音頻是必須先安裝ffmpeg,文章開頭已經介紹過,不然會報錯如下:

WARNING: You have requested multiple formats but ffmpeg or avconv are not installed. The formats won’t be merged.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import youtube_dl

def download(url):

    ydl_opts = {
        'format': '134+m4a',
        'outtmpl': '%(id)s%(ext)s'
    }

    with youtube_dl.YoutubeDL(ydl_opts) as ydl:
        result = ydl.extract_info(url, download=True)

if __name__ == '__main__':
    download('https://www.youtube.com/watch?v=-5r9oswhnY4')
]]>
//www.ebzvaz.com.cn/python/python-youtube-dl.html/feed 0
Fiddler突然不能抓手機端請求 被windows10防火墻屏蔽 - 天津11选5中奖结果 //www.ebzvaz.com.cn/python/scrapy/fiddler_windows10.html //www.ebzvaz.com.cn/python/scrapy/fiddler_windows10.html#respond Mon, 30 Jul 2018 17:55:50 +0000 //www.ebzvaz.com.cn/?p=4278 fiddler 簡單介紹

fiddler 是一款免費的抓包工具,功能強大就不必多說了,其原理是截獲客戶端發送給瀏覽器的request,并發送給瀏覽器,在截獲瀏覽器返回 response 返回給客戶端。

數據傳遞流程

數據傳遞流程

突然不能抓手機端請求
用的好好的,手機端就突然就不能抓包了?pc端一切正常

遇到問題就要解決問題,發現原來是 widinow10 的防火墻,將 fiddler 屏蔽。

開始—》設置

pc設置

pc設置

更新安全 —》 防火墻?;ず屯?—》 允許應用通過防火墻

設置

設置

簡單粗暴,直接都打上“勾”就可以了

更改配置

更改配置

]]>
//www.ebzvaz.com.cn/python/scrapy/fiddler_windows10.html/feed 0
Elasticsearch DSL創建索引時報錯’str’ object has no attribute ‘get_analysis_definition’ - 天津11选5中奖结果 //www.ebzvaz.com.cn/python/elasticsearch-bug.html //www.ebzvaz.com.cn/python/elasticsearch-bug.html#comments Sun, 13 May 2018 16:31:41 +0000 //www.ebzvaz.com.cn/?p=4272 在定義Completion自動搜索建議字段運行報錯,應該是由于Elasticsearch DSL源代碼存在問題,所以需要去自定義一個get_analysis_definition函數。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
from datetime import datetime
from elasticsearch_dsl import DocType, Date, Nested, Boolean, \
    analyzer, InnerDoc, Completion, Keyword, Text,Integer

from elasticsearch_dsl.analysis import CustomAnalyzer as _CustomAnalyzer

from elasticsearch_dsl.connections import connections
connections.create_connection(hosts=["localhost"])

#elasticsearch程序存在問題,這段代碼避免報錯
class CustomAnalyzer(_CustomAnalyzer):
    def get_analysis_definition(self):
        return {}

#filter=["lowercase"]大小寫轉換
ik_analyzer = CustomAnalyzer("ik_max_word", filter=["lowercase"])

class ArticleType(DocType):
    #jobbole的文章類型
    suggest = Completion(analyzer="ik_analyzer")#需要完成自動補全,就需要在mapping設置字段
    h1 = Text(analyzer="ik_max_word")
    create_time = Date()
    likes = Integer()
    match_bookmark = Integer()
    comments_bookmark = Integer()
    category_tag_itme = Text()
    img_url = Keyword()
    img_url_path = Keyword()
    detail_url = Keyword()

    class Meta:
        index = "jobbole"
        doc_type = "article"

if __name__ == '__main__':
    ArticleType.init()

生成這樣字段索引

1
2
3
4
5
6
"suggest": {
"max_input_length": 50,
"analyzer": "ik_max_word",
"preserve_position_increments": true,
"type": "completion",
"preserve_separators": true

關于Completion suggest的內容可以查看文檔鏈接

]]>
//www.ebzvaz.com.cn/python/elasticsearch-bug.html/feed 4
elasticsearch-dsl-py實現python對接 - 天津11选5中奖结果 //www.ebzvaz.com.cn/python/elasticsearch-dsl-py.html //www.ebzvaz.com.cn/python/elasticsearch-dsl-py.html#comments Sun, 13 May 2018 13:29:20 +0000 //www.ebzvaz.com.cn/?p=4270 Elasticsearch DSL是一個高級庫,其目的是幫助編寫和運行針對Elasticsearch的查詢。它建立在官方低級客戶端(elasticsearch-py)之上。

它提供了一種更方便和習慣的方式來編寫和操作查詢。它接近Elasticsearch JSON DSL,反映了它的術語和結構。它直接使用定義的類或類似查詢集的表達式來暴露從Python的DSL的整個范圍。

它還提供了一個可選的包裝器,用于將文檔作為Python對象進行處理:定義映射,檢索和保存文檔,將文檔數據封裝在用戶定義的類中。github地址

要使用其他Elasticsearch API(例如,集群運行狀況),只需使用底層客戶端即可。

上面是elasticsearch-dsl-py的介紹,如果有用過django的框架,那么理解elasticsearch-dsl-py也是非常容易的。

下面我們嘗試編寫py文件mapping一個索引到Elasticsearch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from datetime import datetime
from elasticsearch_dsl import DocType, Date, Nested, Boolean, \
    analyzer, InnerDoc, Completion, Keyword, Text,Integer

from elasticsearch_dsl.connections import connections
connections.create_connection(hosts=["localhost"])

class ArticleType(DocType):
    #jobbole的文章類型
    h1 = Text(analyzer="ik_max_word")
    create_time = Date()
    likes = Integer()
    match_bookmark = Integer()
    comments_bookmark = Integer()
    category_tag_itme = Text()
    img_url = Keyword()
    img_url_path = Keyword()
    detail_url = Keyword()

    class Meta:
        index = "jobbole"
        doc_type = "article"

if __name__ == '__main__':
    ArticleType.init()

orm映射機制幾乎和django一模一樣,mate中定義了數據庫index和表type

elasticsearch-head

elasticsearch-head

在elasticsearch-head中就能查看到數據索引信息

]]>
//www.ebzvaz.com.cn/python/elasticsearch-dsl-py.html/feed 3
elasticsearch布爾查詢 - 天津11选5中奖结果 //www.ebzvaz.com.cn/java/elasticsearch-bool.html //www.ebzvaz.com.cn/java/elasticsearch-bool.html#respond Sat, 12 May 2018 19:20:40 +0000 //www.ebzvaz.com.cn/?p=4267 開始我們組合查詢中布爾查詢的學習!

bool查詢包括must,should,must_not,filter來完成

bool的寫法

1
2
3
4
5
6
bool{
"filter":[],#過濾,不支持權重打分
"must":[],#數組中的查詢必須滿足
"shoul":[],#數組中的查詢滿足一個或者多個
"must_not":[]#數組中一個都不能滿足
}

通過過濾查找salary_min字段等于1800數據,需要查詢某些精確的值建議用term完成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GET jobbole/job/_search
{
  "query": {
    "bool": {
      "must": {
          "match_all": {}
        },
      "filter":{
        "term":{
          "salary_min":1800
        }
      }
    }
  }
}

查詢多個并且過濾

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GET jobbole/job/_search
{
  "query": {
    "bool": {
      "must": {
          "match_all": {}
        },
      "filter":{
        "terms":{
          "salary_min":["1800",1700]
        }
      }
    }
  }
}

這里如果terms查詢過濾條件test字段類型的數據,必須小寫,因為text文檔會被elasticsearch入庫的時候全部改成小寫,match就不會存在這樣問題。

查看分析器解析的內容

1
2
3
4
5
6
7
8
9
10
11
GET _analyze
{
  "analyzer": "ik_max_word",
  "text": "pyton網絡開發工程師"
}

GET _analyze
{
  "analyzer": "ik_smart",
  "text": "pyton網絡開發工程師"
}

結果顯示ik_max_word比ik_smart分詞更加細致,具體看文檔github

查詢工資大于1700或者工作python web開發,排除工作1800

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
GET jobbole/job/_search
{
  "query": {
    "bool": {
      "should": [
        {"term": {
          "salary_min": {
            "value": "1700"
          }
        }},
        {"term": {
            "title": {
              "value": "python web開發"
            }
          }
        }
        ],
      "must_not":{
        "term":{
          "salary_min":1800
        }
      }
    }
  }
}

嵌套查詢,bool里面嵌套bool,查詢title為游戲 or(title為python and salary_min為1500)的數據

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
GET jobbole/job/_search
{
  "query": {
    "bool": {
      "should": [
        {"term": {
          "title": {
            "value": "游戲"
          }
        }},
        {"bool": {
          "must": [
            {"term": {
              "title": {
                "value": "python"
              }
            }},
            {"term": {
              "salary_min": {
                "value": "1500"
              }
            }}
          ]
        }}
      ]
    }
  }
}

查詢非null的數據,如果數據存在null,我們需要過濾掉這些數據,語法如下:

1
2
3
4
5
6
7
8
9
10
11
12
GET jobbole/job/_search
{
  "query": {
    "bool": {
      "filter": {
        "exists": {
          "field": "title"
        }
      }
    }
  }
}

查詢null的數據,反過來,我們需要查詢某個字段為null的數據,就是用must_not

1
2
3
4
5
6
7
8
9
10
11
12
GET jobbole/job/_search
{
  "query": {
    "bool": {
      "must_not": {
        "exists": {
          "field": "title"
        }
      }
    }
  }
}
]]>
//www.ebzvaz.com.cn/java/elasticsearch-bool.html/feed 0
elasticsearch基本查詢 - 天津11选5中奖结果 //www.ebzvaz.com.cn/java/elasticsearch-filter.html //www.ebzvaz.com.cn/java/elasticsearch-filter.html#respond Sat, 12 May 2018 15:49:27 +0000 //www.ebzvaz.com.cn/?p=4265 elasticsearch是功能非常強大的搜索引擎,使用它的目地就是為了快速的查詢到需要的數據。

查詢的分類:

基本查詢:使用elasticsearch內置查詢條件進行查詢
組合查詢:把多個查詢組合在一起進行復合查詢
過濾:查詢同時,通過filter條件在不影響打分的情況下篩選數據

先創建索引,并加入分析器,會用到天津11选5中奖结果插件,已經集成到elasticsearch-rtf中,elasticsearch支持中文分詞,但是效果沒有elasticsearch-analysis-ik的效果好。

下面我們在title類型中加入了“analyzer”: “ik_max_word”那么title字段中內容會用ik_max_word進行分詞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#創建索引
#創建索引
PUT jobbole
{
  "mappings": {
    "job": {
      "properties": {
        "title":{
          "type": "text",
          "analyzer": "ik_max_word"
        },
        "salary_min":{
          "type": "integer"
        },
        "city":{
          "type": "keyword"
        },
        "company":{
          "properties": {
            "name":{
              "type":"text"
            },
            "company_addr":{
              "type":"text"
            }
          }
        },
        "publish_date":{
          "type": "date",
          "format": "yyyy-mm-dd"
        },
        "comments":{
          "type": "integer"
        }
      }
    }
  }
}

elasticsearch-analysis-ik文檔中介紹了ik_smart , ik_max_word兩種分詞分析器

ik_max_word: 會將文本做最細粒度的拆分,比如會將“中華人民共和國國歌”拆分為“中華人民共和國,中華人民,中華,華人,人民共和國,人民,人,民,共和國,共和,和,國國,國歌”,會窮盡各種可能的組合;

ik_smart: 會做最粗粒度的拆分,比如會將“中華人民共和國國歌”拆分為“中華人民共和國,國歌”。

具體介紹看github文檔吧!

創建了索引,在來點數據

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
POST jobbole/job/
{
  "title":"python分布式爬蟲開發",
  "salary_min":1500,
  "city":"蘇州",
  "company":{
    "name":"中國移動",
    "company_addr":"蘇州園區"
  },
  "publish_date":"2017-4-16",
  "comments":15
}

POST jobbole/job/
{
  "title":"python web開發",
  "salary_min":1600,
  "city":"蘇州",
  "company":{
    "name":"中國移動",
    "company_addr":"蘇州園區"
  },
  "publish_date":"2017-4-16",
  "comments":15
}
........
......

進入正題,其實現查詢

match查詢

會對輸入進行分詞,比如我輸入python或者python爬蟲,python開發,都會存在python這個單詞,中文也是一樣。mactch用到我們索引中自定義的分詞器elasticsearch-analysis-ik進行匹配。

1
2
3
4
5
6
7
8
9
#match查詢
GET jobbole/job/_search
{
  "query": {
    "match": {
      "title": "python"
    }
  }
}

term查詢

相當于keyword,不進行對搜索分詞處理的,全部匹配的查詢,如果我搜索條件是python人工智能,那么返回的結果是null

1
2
3
4
5
6
7
8
9
#term查詢
GET jobbole/job/_search
{
  "query": {
    "term": {
      "title": "python人工智能"
    }
  }
}

terms查詢

顧名思義就是能輸入多個值,進行查詢,在titile里面加入”python人工智能”,”爬蟲”,搜索結果返回列表中存在數據。

1
2
3
4
5
6
7
8
GET jobbole/job/_search
{
  "query": {
    "terms": {
      "title": ["python人工智能","爬蟲"]
    }
  }
}

match查詢,控制返回的數量

用次方法查詢,能解決分頁問題,from從第幾個數據開始0,1,2,3等等,size返回的結果數量。

1
2
3
4
5
6
7
8
9
10
GET jobbole/job/_search
{
  "query": {
    "match": {
      "title": "python"
    }
  },
  "from": 1,
  "size": 4
}

match_all,返回所有數據

1
2
3
4
5
6
7
GET jobbole/job/_search
{
  "query": {
    "match_all": {}
    }
  }
}

match_phrase,短語匹配

就像用于全文搜索的的match查詢一樣,當你希望尋找鄰近的單詞時,match_phrase查詢可以幫你達到目的。slop是詞與詞之間的距離。

1
2
3
4
5
6
7
8
9
10
11
GET jobbole/job/_search
{
  "query": {
    "match_phrase": {
      "title": {
        "query":"python開發",
        "slop":6
      }
    }
  }
}

multi_match,指定多個字段查詢

1
2
3
4
5
6
7
8
9
GET jobbole/job/_search
{
  "query": {
    "multi_match": {
        "query":"python蘇州",
        "fields":["title","company_addr"]
    }
  }
}

stored_fields指定返回的字段

這里的需要注意的是elasticsearch默認是false不顯示返回字段,需要去設置store=true,才能指定返回字段查詢。

索引:

1
2
3
4
5
6
"properties": {
        "title":{
          "store": true,
          "type": "text",
          "analyzer": "ik_max_word"
        }

查詢語句

1
2
3
4
5
6
7
8
9
GET jobbole/job/_search
{
  "stored_fields": ["title","city"],
  "query": {
    "match": {
      "title":"python"
    }
  }
}

通過sort把結果排序

desc降序,asc升序,我們對salary_min字段進行了排序

1
2
3
4
5
6
7
8
9
10
11
GET jobbole/job/_search
{
  "query": {
    "match_all": {}
  },
    "sort":[{
      "salary_min":{
        "order":"desc"
      }
    }]
}

range范圍查詢

Index時boost(index time boost)&Query時boost(query time boost):可以在索引時和查詢時進行boost。對特定的field進行boost時,會讓得分的計算更加明顯。

1
2
3
4
5
6
7
8
9
10
11
12
GET jobbole/job/_search
{
  "query": {
    "range": {
      "salary_min": {
        "gte": 1700,
        "lte": 1800,
        "boost": 1
      }
    }
  }
}

rang范圍查詢時間的用法

1
2
3
4
5
6
7
8
9
10
11
GET jobbole/job/_search
{
  "query": {
    "range": {
      "publish_date": {
        "gte": "2017-4-14",
        "lte": "now"
      }
    }
  }
}

wildcard模糊查詢

1
2
3
4
5
6
7
8
9
10
11
GET jobbole/job/_search
{
  "query": {
    "wildcard": {
      "title": {
        "value": "pyth*",
        "boost": 3
      }
    }
  }
}
]]>
//www.ebzvaz.com.cn/java/elasticsearch-filter.html/feed 0