flask 第七章 簡陋版智能玩具 +MongoDB初識和基本操做

1.簡陋版web智能玩具html

FAQ.py文件python

import os

from aip import AipSpeech, AipNlp
from uuid import uuid4
""" 你的 APPID AK SK """
APP_ID = '16027160'
API_KEY = 'uzx4SWZuimPqbE4LvxYScEhi'
SECRET_KEY = '3HBy8yi11ID9T4yyxkADuGYOGyavxPdG'

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
client_nlp = AipNlp(APP_ID, API_KEY, SECRET_KEY)


# 語音識別,將你輸入的文字轉化爲語音
def AI_voice(file):
    filename=f'{uuid4()}.mp3'
    result = client.synthesis(file, 'zh', 1, {
        'spd': 5,
        'vol': 5,
        'pit': 5,
        'per': 2
    })
    if not isinstance(result, dict):
        with open(filename, 'wb') as f:
            f.write(result)

    return filename

# 語音合成,經過語音生成文字,在這裏只是讀出文字,並無寫出來,下面這一步纔是將語音中的文字return出來
def get_file_content(file):
    os.system(f"ffmpeg -y  -i {file} -acodec pcm_s16le -f s16le -ac 1 -ar 16000 {file}.pcm")
    with open(f'{file}.pcm', 'rb') as fp:
        return fp.read()

# 返回的是你語音中的消息
def voice_content(file):
    result = client.asr(get_file_content(file), 'pcm', 16000, {
        'dev_pid': 1536,
    })
    # print(result.get('result')[0])
    return result.get('result')[0]

def goto_tl(text, uid):
    URL = "http://openapi.tuling123.com/openapi/api/v2"
    import requests
    data = {
        "perception": {
            "inputText": {
                "text": "你叫什麼名字"
            }
        },
        "userInfo": {
            "apiKey": "be41cf8596a24aec95b0e86be895cfa9",
            "userId": "123"
        }
    }

    data["perception"]["inputText"]["text"] = text
    data["userInfo"]["userId"] = uid
    res = requests.post(URL, json=data)

    return res.json().get("results")[0].get("values").get("text")

WebToy.html文件內容以下:mysql

import os

from aip import AipSpeech, AipNlp
from uuid import uuid4
""" 你的 APPID AK SK """
#圖靈機器人 APP_ID = '16027160' API_KEY = 'uzx4SWZuimPqbE4LvxYScEhi' SECRET_KEY = '3HBy8yi11ID9T4yyxkADuGYOGyavxPdG' client = AipSpeech(APP_ID, API_KEY, SECRET_KEY) client_nlp = AipNlp(APP_ID, API_KEY, SECRET_KEY) # 語音識別,將你輸入的文字轉化爲語音 def AI_voice(file): filename=f'{uuid4()}.mp3' result = client.synthesis(file, 'zh', 1, { 'spd': 5, 'vol': 5, 'pit': 5, 'per': 2 }) if not isinstance(result, dict): with open(filename, 'wb') as f: f.write(result) return filename # 語音合成,經過語音生成文字,在這裏只是讀出文字,並無寫出來,下面這一步纔是將語音中的文字return出來 def get_file_content(file): os.system(f"ffmpeg -y -i {file} -acodec pcm_s16le -f s16le -ac 1 -ar 16000 {file}.pcm") with open(f'{file}.pcm', 'rb') as fp: return fp.read() # 返回的是你語音中的消息 def voice_content(file): result = client.asr(get_file_content(file), 'pcm', 16000, { 'dev_pid': 1536, }) return result.get('result')[0] def goto_tl(text, uid): URL = "http://openapi.tuling123.com/openapi/api/v2" import requests data = { "perception": { "inputText": { "text": "你叫什麼名字" } }, "userInfo": { "apiKey": "be41cf8596a24aec95b0e86be895cfa9", "userId": "123" } } data["perception"]["inputText"]["text"] = text data["userInfo"]["userId"] = uid res = requests.post(URL, json=data) return res.json().get("results")[0].get("values").get("text")

webtoy.py文件內容以下:web

from flask import Flask, render_template, request, jsonify, send_file
from uuid import uuid4  # 這個是導入的一串數字,惟一的

from flask_cors import CORS

from day07.FAQ import AI_voice, goto_tl, voice_content, client_nlp

app = Flask(__name__)
#跨域請求
CORS(app)

@app.route('/')
def WebToy():
    return render_template('WebToy.html')


@app.route("/uploader",methods=["POST","GET"])
def uploader():
    filename = f"{uuid4()}.wav"
    file = request.files.get("reco")
    file.save(filename)

    text = voice_content(filename)
    # 天然語言處理 LowB
    score = client_nlp.simnet("你叫什麼名字", text).get("score")
    print(score)
    if score >= 0.75:
        filename = AI_voice("個人名字叫嘻嘻")
    else:
        answer = goto_tl(text, "qiaoxiaoqiang")
        filename = AI_voice(answer)

    return jsonify({"code":0,"msg":"文件上傳成功","filename":filename})


@app.route('/getaudio/<filename>')
def getaudio(filename):
    return send_file(filename)


if __name__ == '__main__':
    app.run('0.0.0.0', 5000, debug=True)

2.MongoDB初識正則表達式

在啓動mongoDB前,先配置環境變量 ,安裝後找到bin目錄(包含mongod.exe和mongo.exe)redis

MongoDB的默認服務端口爲27017 ,redis的默認端口爲6379,mysql的默認端口爲3306sql

1.啓動MongoDB服務 mongodb

  mongod -dbpath  D:\data\db

  mongod -dbpath 數據庫的存放路徑

      -install  安裝Windows服務

      -remove 卸載Windows服務

2.客戶端的鏈接數據庫

  推薦使用mongodb自帶的客戶端  -mongo

  show databases    查看本地磁盤數據庫

  use dbname     切換到當前使用的數據庫

  db        查看當前使用的數據庫

  show tables      查看當前數據庫存放在磁盤上的數據表

 

  use 不存在的數據庫    - 建立了數據庫 ,當前建立的數據庫沒有存放在磁盤中json

數據庫中沒有users數據庫,若是使用了 use  users命令,他會在內存中建立一個users的數據庫

  db.tablename 不存在的表名 - 建立數據表  當前數據表沒有存放在磁盤中

經過前面建立的數據庫,use 不存在的表名,若是你在後面再表中添加了數據,那麼這個表和內容都存放到了磁盤中

  概念: - 使用了不存在的對象即建立了該對象  - 不限制數據結構

使用第三方客戶端 :  --圖形化工具 -NoSQLBooster4MongoDB for windows for mac

3.MongoDB的增刪改查

添加數據:

db.tablename.insert({'key':'value'})

官方推薦的寫法:
    #在圖形化客戶端和數據庫中是這個寫法
    db.table.insertOne({'key':'value'})
    db.table.insertMany({k1:v1},{k2:v2},,{k3:v3})
    #在pycharm中的寫法爲
    db.tablename.insert_one({})
    db.tablename.insert_many({},{},{})

 

刪除數據:

db.tablename.remove({k:v})
db.tablename.remove({age:34}) #刪除全部age=34的數據

官方推薦的寫法:
#數據庫和圖形化操做寫法
db.tablename.deleteOne()  #刪除符合條件的第一條數據
db.tablename.deleteMany() # 刪除符合條件的全部數據
#在pycharm中的寫法爲
db.tablename.delete_one({})
db.tablename.delete_many({},{},{})

 

更新數據:

#查詢出name爲xx的數據,將符合條件的一條數據進行修改
db.tablename.update({name:'xx'},{$set:{age:23}}) 

$set -set修改器   強制替換覆蓋

官方推薦寫法

  #數據庫和圖形化操做的寫法
  #更新符合條件的第一條數據,第一條數據就是你第一個插入的數據 
  db.tablename.updateOne({k1:v1},{$set:{k2:v2}}) 
  #更新符合條件的全部數據 
  db.tablename.updateMany({k1:v1},{$set:{k2:v2}})

  pycharm寫法
  db.tablename.update_one({},{})
  db.tablename.update_many({},{})

array(數組,列表) + object(字典) :db.tablename.updateOne({cp.name:'裝X'},{$set:{cp.$.score:'100'}}) #此處cp.$.score,$的意思爲前面查詢出的索引

查詢操做:

db.filename.find()  #查詢全部數據
db.user.find({name:xixi}) #查詢出name爲xixi的數據

#查詢符合條件的一條數據
db.tablename.findOne({k:v}) 

 

4.MongoDB的數據類型

ObjectId :Documents 自動生成的 _id
_id:ObjectId("5cb69a23815ea7295f8bad43") 自動生成的 json數據中不包含ObjectId類型 id類型uuid
String: 字符串,必須是utf-8
Boolean:布爾值,true 或者false (這裏有坑哦~在咱們大Python中 True False 首字母大寫)
Integer:整數 (Int32 Int64 大家就知道有個Int就好了,通常咱們用Int32)
Double:浮點數 (沒有float類型,全部小數都是Double)
Arrays:數組或者列表,多個值存儲到一個鍵 (list哦,大Python中的List哦)
Object:深度<=4 若是你學過Python的話,那麼這個概念特別好理解,就是Python中的字典,這個數據類型就是字典
Null:空數據類型 , 一個特殊的概念,None Null
Timestamp:時間戳 一般不用這個數據類型 若是存儲時間 Double
Date:存儲當前日期或時間unix時間格式 (咱們通常不用這個Date類型,時間戳能夠秒殺一切時間類型)

 

5.數學比較符

$lt : 小於 √
$lte: 小於等於 √
$gt : 大於 √
$gte: 大於等於 √
	
$ne : 不等於
$eq or 冒號 : 等於

6.查詢關鍵字

  array數據類型會自動遍歷

  $in 或者等於相同字段 db.filename.fiind({age:{$in:[19,109]}})         #就是age=19或age=109的數據 

  $or 或者等於不一樣字段 db.filename.find({$or:[{age:19},{age:109}] })   #也是age=19或age=109的數據,與$in不一樣之處在於 ,$in寫的必須是相同的字段,而$or能夠寫不一樣的字段

  $and or 逗號  -- 並列條件

  $all --Array 數據類型 子集查詢 db.filename.find({hobby:{$all : [ '玉鳳','玉霞' ]}})

 

7.$字符特殊用法:

  存儲符合條件的元素的下標索引

  用於修改字段

8.修改器

  $set -- set修改器   強制替換覆蓋

  $unset  -- 強制刪除字段

  $inc   -- 引用增長   #就至關於我查詢出的數據進行增長,沒有減,若是想實現減的操做,加負的便可

   array操做:

  $push  至關於append  在array中追加 

  $pushAll  至關於extend  在array中追加列表中的全部元素

  $pull   至關於remove  在array中刪除一個元素

  $pullAll  在array中刪除一堆元素

  $pop  至關於pop 刪除第一個 -1 或 最後一個 1 的值

 

9. sort(排序) skip(跳過) limit(選取條目)

 sort 排序

#找到name爲xixi的數據,根據age排序
db.filename.find({name:xixi}).sort({age:18})

#找到name爲xixi的數據,根據age排序,若是age有相同的,再根據birthday倒序排序
db.filename.find({name:xixi}).sort({age:18,birthday:-1})

 

skip 跳過

#找到name爲xixi的數據,而後根據插入順序跳過第一條
db.filename.find(name:xixi).skip(1)

 

limit 選取條目

#找到name爲xixi的數據,根據插入順序選取出3條數據展現
db.filename.find({name:xixi}).limit(3)

 

sort,limit,skip是有執行順序的

先排序(sort),在跳過(skip),最後顯示條目(limit)

分頁 

(page-1)*num

db.filename.find({name:xixi}).skip((page-1)*num).limit(num)

10.pymongo

*************************

11.MongoDB偷換的概念

MySql               MongoDB

DataBase            DataBase 
Table               Collection
Colunm              Field
Row                 Dcouments

 mongodb優化

(1)
文檔中的_id鍵推薦使用默認值,禁止向_id中保存自定義的值。

​解讀: MongoDB文檔中都會有一個「_id」鍵,默認是個ObjectID對象(標識符中包含時間戳、機器ID、進程ID和計數器)。MongoDB在指定_id與不指定_id插入時 速度相差很大,指定_id會減慢插入的速率。
​

(2)
推薦使用短字段名。

​解讀:與關係型數據庫不一樣,MongoDB集合中的每個文檔都須要存儲字段名,長字段名會須要更多的存儲空間。

(3)
MongoDB索引能夠提升文檔的查詢、更新、刪除、排序操做,因此結合業務需求,適當建立索引。

(4)
每一個索引都會佔用一些空間,而且致使插入操做的資源消耗,所以,建議每一個集合的索引數儘可能控制在5個之內。

(5)
對於包含多個鍵的查詢,建立包含這些鍵的複合索引是個不錯的解決方案。複合索引的鍵值順序很重要,理解索引最左前綴原則。

解讀:例如在test集合上建立組合索引{a:1,b:1,c:1}。執行如下7個查詢語句:

db.test.find({a:」hello」}) // 1
db.test.find({b:」sogo」, a:」hello」}) // 2
db.test.find({a:」hello」,b:」sogo」, c:」666」}) // 3
db.test.find({c:」666」, a:」hello」}) // 4
db.test.find({b:」sogo」, c:」666」}) // 5
db.test.find({b:」sogo」 }) // 6
db.test.find({c:」666」}) // 7
以上查詢語句可能走索引的是一、二、三、4
查詢應包含最左索引字段,以索引建立順序爲準,與查詢字段順序無關。
最少索引覆蓋最多查詢。
(6)
TTL 索引(time-to-live index,具備生命週期的索引),使用TTL索引能夠將超時時間的文檔老化,一個文檔到達老化的程度以後就會被刪除。

解讀:建立TTL的索引必須是日期類型。TTL索引是一種單字段索引,不能是複合索引。TTL刪除文檔後臺線程每60s移除失效文檔。不支持定長集合。

(7)
須要在集合中某字段建立索引,但集合中大量的文檔不包含此鍵值時,建議建立稀疏索引。

解讀:索引默認是密集型的,這意味着,即便文檔的索引字段缺失,在索引中也存在着一個對應關係。在稀疏索引中,只有包含了索引鍵值的文檔纔會出現。

(8)
建立文本索引時字段指定text,而不是1或者-1。每一個集合只有一個文本索引,可是它能夠爲任意多個字段創建索引。

解讀:文本搜索速度快不少,推薦使用文本索引替代對集合文檔的多字段的低效查詢。

(9)
使用findOne在數據庫中查詢匹配多個項目,它就會在天然排序文件集合中返回第一個項目。若是須要返回多個文檔,則使用find方法。

(10)
若是查詢無需返回整個文檔或只是用來判斷鍵值是否存在,能夠經過投影(映射)來限制返回字段,減小網絡流量和客戶端的內存使用。

解讀:既能夠經過設置{key:1}來顯式指定返回的字段,也能夠設置{key:0}指定須要排除的字段。

(11)
除了前綴樣式查詢,正則表達式查詢不能使用索引,執行的時間比大多數選擇器更長,應節制性地使用它們。

(12)
在聚合運算中,$要在match要在$group前面,經過$前置,能夠減小match前置,能夠減小$ group 操做符要處理的文檔數量。

(13)
經過操做符對文檔進行修改,一般能夠得到更好的性能,由於,不須要往返服務器來獲取並修改文檔數據,能夠在序列化和傳輸數據上花費更少的時間。

(14)
批量插入(batchInsert)能夠減小數據向服務器的提交次數,提升性能。可是批量提交的BSON Size不超過48MB。

(15)
禁止一次取出太多的數據進行排序,MongoDB目前支持對32M之內的結果集進行排序。若是須要排序,請儘可能限制結果集中的數據量。

(16)
查詢中的某些$操做符可能會致使性能低下,如操做符可能會致使性能低下,如$ne,$,not,$exists,$nin,$or儘可能在業務中不要使用。

a) $exist:由於鬆散的文檔結構致使查詢必須遍歷每個文檔;
b) $ne:若是當取反的值爲大多數,則會掃描整個索引;
c) $not:可能會致使查詢優化器不知道應當使用哪一個索引,因此會常常退化爲全表掃描;
d) $nin:全表掃描;
e) \$有多個條件就會查詢多少次,最後合併結果集,應該考慮裝換爲or:有多個條件就會查詢多少次,最後合併結果集,應該考慮裝換爲$in。
(17)
固定集合能夠用於記錄日誌,其插入數據更快,能夠實如今插入數據時,淘汰最先的數據。需求分析和設計時,可考慮此特性,即提升了性能,有省去了刪除動做。

​解讀:固定集合須要顯式建立,指定Size的大小,還可以指定文檔的數量。集合無論先達到哪個限制,以後插入的新文檔都會把最老的文檔移出。

(18)
集合中文檔的數據量會影響查詢性能,爲保持適量,須要按期歸檔。
相關文章
相關標籤/搜索