通比牛牛路子 http://www.zssf.icu 略懂php_JavaScript_python編程 Fri, 01 Feb 2019 08:55:25 +0000 zh-CN hourly 1 https://wordpress.org/?v=4.8.10 pycharm中運行nosetests測試用例 http://www.zssf.icu/python/nosetests-test-case-in-pycharm.html http://www.zssf.icu/python/nosetests-test-case-in-pycharm.html#respond Thu, 20 Dec 2018 15:51:38 +0000 http://www.zssf.icu/?p=4402 1、配置 pycharm 調試文件

2、添加 nosetets 文件

3、直接ok確定

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

5、tools里面選擇Python Intergated Tools

6、選擇nosetets,ok確定退出

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

]]>
http://www.zssf.icu/python/nosetests-test-case-in-pycharm.html/feed 0
我為自家大閘蟹代言 http://www.zssf.icu/csqw/dazhaxie.html http://www.zssf.icu/csqw/dazhaxie.html#respond Mon, 08 Oct 2018 15:51:26 +0000 http://www.zssf.icu/?p=4394

]]>
http://www.zssf.icu/csqw/dazhaxie.html/feed 0
python腳本調用youtube-dl實現視頻下載 http://www.zssf.icu/python/python-youtube-dl.html http://www.zssf.icu/python/python-youtube-dl.html#respond Thu, 02 Aug 2018 18:29:36 +0000 http://www.zssf.icu/?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')
]]>
http://www.zssf.icu/python/python-youtube-dl.html/feed 0
Fiddler突然不能抓手機端請求 被windows10防火墻屏蔽 http://www.zssf.icu/python/scrapy/fiddler_windows10.html http://www.zssf.icu/python/scrapy/fiddler_windows10.html#respond Mon, 30 Jul 2018 17:55:50 +0000 http://www.zssf.icu/?p=4278 fiddler 簡單介紹

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

數據傳遞流程

數據傳遞流程

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

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

開始—》設置

pc設置

pc設置

更新安全 —》 防火墻保護和網絡 —》 允許應用通過防火墻

設置

設置

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

更改配置

更改配置

]]>
http://www.zssf.icu/python/scrapy/fiddler_windows10.html/feed 0
Elasticsearch DSL創建索引時報錯’str’ object has no attribute ‘get_analysis_definition’ http://www.zssf.icu/python/elasticsearch-bug.html http://www.zssf.icu/python/elasticsearch-bug.html#comments Sun, 13 May 2018 16:31:41 +0000 http://www.zssf.icu/?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的內容可以查看文檔鏈接

]]>
http://www.zssf.icu/python/elasticsearch-bug.html/feed 4
elasticsearch-dsl-py實現python對接 http://www.zssf.icu/python/elasticsearch-dsl-py.html http://www.zssf.icu/python/elasticsearch-dsl-py.html#comments Sun, 13 May 2018 13:29:20 +0000 http://www.zssf.icu/?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中就能查看到數據索引信息

]]>
http://www.zssf.icu/python/elasticsearch-dsl-py.html/feed 3
elasticsearch布爾查詢 http://www.zssf.icu/java/elasticsearch-bool.html http://www.zssf.icu/java/elasticsearch-bool.html#respond Sat, 12 May 2018 19:20:40 +0000 http://www.zssf.icu/?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"
        }
      }
    }
  }
}
]]>
http://www.zssf.icu/java/elasticsearch-bool.html/feed 0
elasticsearch基本查詢 http://www.zssf.icu/java/elasticsearch-filter.html http://www.zssf.icu/java/elasticsearch-filter.html#respond Sat, 12 May 2018 15:49:27 +0000 http://www.zssf.icu/?p=4265 elasticsearch是功能非常強大的搜索引擎,使用它的目地就是為了快速的查詢到需要的數據。

查詢的分類:

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

先創建索引,并加入分析器,會用到elasticsearch-analysis-ik插件,已經集成到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
      }
    }
  }
}
]]>
http://www.zssf.icu/java/elasticsearch-filter.html/feed 0
elasticsearch映射mapping http://www.zssf.icu/java/elasticsearch-mapping.html http://www.zssf.icu/java/elasticsearch-mapping.html#respond Sat, 12 May 2018 08:08:57 +0000 http://www.zssf.icu/?p=4262 映射是存儲在索引中的文檔的大綱,它定義數據類型。對于一個搜索引擎來說,光光有數據是不夠的用的,映射是elastisearch對數據進行區分的一個重要方式。

elastisearch會默認創建映射,根據json源數據進行映射。下面說明elastisearch的內置類型

sting類型:text,keyword
數字類型:long,integer,short,byte,double,float
日期類型:date
bool類型:boolean
binary類型:binary 二進制類型
復雜類型:object,nested
geo類型:geo-point,geo-shape 地理位置
專業類型:ip,competition

常用的類型

常用類型

常用類型

我們來創建自定義映射的索引

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
#創建索引
PUT jobbole
{
  "mappings": {
    "job": {
      "properties": {
        "title":{
          "type": "text"
        },
        "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"
        }
      }
    }
  }
}

插入一條數據試試

1
2
3
4
5
6
7
8
9
10
11
12
POST jobbole/job/
{
  "title":"python分布式爬蟲開發",
  "salary_min":1500,
  "city":"蘇州",
  "company":{
    "name":"中國移動",
    "company_addr":"蘇州園區"
  },
  "publish_date":"2017-4-16",
  "comments":15
}

獲取索引方式

1
2
GET jobbole/_mapping/job
GET _all/_mapping/job

索引一旦創建是不能修改的,如果要修改,必須刪除現有索引,在導入數據,這樣就增大了工作量,而且數據量非常大的時候就非常困難,所以創建索引的時候一定要想好了在創建。

]]>
http://www.zssf.icu/java/elasticsearch-mapping.html/feed 0
elasticsearch批量操作bulk http://www.zssf.icu/java/elasticsearch-bulk.html http://www.zssf.icu/java/elasticsearch-bulk.html#respond Fri, 11 May 2018 18:54:57 +0000 http://www.zssf.icu/?p=4258 批量導入合并多個操作,比如index,delete,update,create等等,bulk會把將要處理的數據載入內存中,所以數據量是有限制的,最佳的數據量不是一個確定的數值,它取決于你的硬件,你的文檔大小以及復雜性,你的索引以及搜索的負載。

bulk的語法格式是:

action and meta_data \n

optional source \n

action and meta_data \n

optional source \n

action and meta_data \n

optional source \n
……..

文檔用法

文檔用法

從上面能夠看到,兩行數據構成了一次操作,第一行是操作類型可以index,create,update,或者delete,第二行就是我們的可選的數據體,使用這種方式批量插入的時候,我們需要設置的它的Content-Type為application/json。

舉個例子,這是一條數據

一條數據

數據格式

實戰一下,加上id和不加上id,post多條數據,這里要注意的數據格式是2行,上面也提到了,必須這么寫,否則或報錯。

1
2
3
4
5
6
7
8
9
10
11
POST _bulk
{"index":{"_index":"testdb","_type":"shuju","_id":"5"}}
{"title":"5"}
{"index":{"_index":"testdb","_type":"shuju","_id":"6"}}
{"title":"6"}

POST _bulk
{"index":{"_index":"testdb","_type":"shuju"}}
{"title":"7"}
{"index":{"_index":"testdb","_type":"shuju"}}
{"title":"8"}

更多類似的數據實例:

1
2
3
4
5
6
7
8
POST _bulk
{"index":{"_index":"testdb","_type":"shuju","_id":"5"}}
{"title":"5"}
{"create":{"_index":"testdb","_type":"shuju","_id":"6"}}
{"title":"6"}
{"delete":{"_index":"testdb","_type":"shuju","_id":"5"}}}
{"update":{"_index":"testdb","_type":"shuju"}}
{"doc":{"title":"8"}}

針對不同的操作類型,第二行里面的可選的數據體是不一樣的,如下:

(1)index 和 create 第二行是source數據體

(2)delete沒有第二行

(3)update 第二行可以是partial doc,upsert或者是script

]]>
http://www.zssf.icu/java/elasticsearch-bulk.html/feed 0
通比牛牛2479

<menuitem id="m71gj"><ruby id="m71gj"><em id="m71gj"></em></ruby></menuitem>

  • 
    
        <input id="m71gj"><font id="m71gj"><td id="m71gj"></td></font></input>

      1. <dl id="m71gj"><ins id="m71gj"><thead id="m71gj"></thead></ins></dl>
        <dl id="m71gj"></dl>
      2. <dl id="m71gj"><font id="m71gj"></font></dl>
      3. <dl id="m71gj"><ins id="m71gj"></ins></dl>

          1. <output id="m71gj"><legend id="m71gj"></legend></output>
              <dl id="m71gj"></dl>

                    <menuitem id="m71gj"><ruby id="m71gj"><em id="m71gj"></em></ruby></menuitem>

                  1. 
                    
                        <input id="m71gj"><font id="m71gj"><td id="m71gj"></td></font></input>

                      1. <dl id="m71gj"><ins id="m71gj"><thead id="m71gj"></thead></ins></dl>
                        <dl id="m71gj"></dl>
                      2. <dl id="m71gj"><font id="m71gj"></font></dl>
                      3. <dl id="m71gj"><ins id="m71gj"></ins></dl>

                          1. <output id="m71gj"><legend id="m71gj"></legend></output>
                              <dl id="m71gj"></dl>

                                  1. <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>