主頁 >  其他 > 【譯】如何實作一個現代化電子商城搜索?(一)

【譯】如何實作一個現代化電子商城搜索?(一)

2020-12-03 11:42:55 其他

 

原文《Implementing A Modern E-Commerce Search》,作者:Alexander Reelsen.

 

原文內容比較多,所以翻譯會分三篇發出:

第一篇:講述了好的搜索功能由好的索引資料和好的查詢陳述句(即搜索關鍵詞+特征過濾器)組成,電子商務搜索中的產品資料處理(包含:資料清洗、計量單位、重復資料、庫存資料)和特定場景的資料建模(包含:變體、多語言、分解分詞、價格)

第二篇:一些用例,后續再細化

第三篇:一些用例,后續再細化

 

在線kibanahttp://134.175.121.78:5601/app/dev_tools#/console

(是我自己的服務器搭建的,請大家友好的體驗)

 

簡介

    搜索功能很難,做好電子商務網站的搜索功能更難,實作一個好的搜索包含兩個要素:好的索引資料和好的查詢陳述句(即搜索關鍵詞+特征過濾器),兩個元素同時存在的情況是很難的,但在e-discovery這種平臺上是很常見的(什么是e-discovery??是政府或法律授權機構通過網路技術向有關行業(如法律、稅務機構等)提供的資訊交換平臺,也稱作“電子儲存資訊”(Electronically stored information,即ESI)),使用e-discovery平臺搜索資料的用戶擁有深厚的專業知識,也有能力提出適當的查詢陳述句,但是,在電子商務中基本是相反的,你通常有結構化良好的資料,但你的搜索質量卻很低,用戶并不確切知道他們要搜索什么,他們通常搜索的是品牌名稱、產品名稱或類似“便宜的”這樣的形容詞,而且還可能包含拼寫錯誤,

    這篇文章要討論的另一個常用搜索場景是聚合與分析用例,這常見于儀表盤功能,但電子商務搜索通常聚焦于搜索電商產品,盡管聚合常用于深入資料分析,但對我來說,最常見的聚合用例是其可觀察的特性,比如在日志、指標或跟蹤(logsmetricstraces)資料上的聚合,

    我不會為文章中的每一個用例都提供使用Elasticsearch的解決方案,但我會舉例說明我的觀點,

 

為什么電商搜索這么難?

    這是一個非常棒的問題,在這么多年之后,我仍然發現這個問題相當難以回答,因為這不是一個事情導致它難以回答,而是許多小事情的共同影響,有時僅僅一個小事情就足以讓網站的訪問者在眨眼間決定不在你的電子商店中購買,最重要的是,有許多與搜索無關的因素也會把用戶趕出你的網站,

    我最近的個人經歷是在新冠疫情封城期間嘗試在Hugendubel商城中訂購一本書,Hugendubel商城是德國的讀書類專業電商,但它不允許我在沒有創建用戶賬戶的情況下下單,而Thalia.de商城允許我這樣做,所以我最后選擇在Thalia.de商城中下單,這和搜索體驗完全沒有關系,

    在另一個封城期間的案例中,我嘗試在Ravensburger商城中為我女兒訂購一本書,線上商城告訴我,這本書只能在物體店購買,而且,每當我使用Amazon pay進行支付,卻沒有收到我的信用卡是否被扣款的通知,我向平臺寫了一封電子郵件,兩周后我得到了反饋:我描述的問題已經轉發給負責支付的部門,另一個導致我不想再光顧這個商城的原因是,搜索體驗非常糟糕,

    但是,讓我們不要把重點放在我對網上商店的責罵中,而要放在正確的搜索上,

 

產品資料

    讓我們從最高優先級的產品資料開始,沒有資料,何談搜索,經營一個商城意味著,商家提供資料,并且不同商家提供的資料格式會不一樣,

 

1、資料清洗(clean data

    什么是資料清洗?它是發現并糾正資料檔案中可識別的錯誤的最后一道程式,包括檢查資料一致性,處理無效值和缺失值等,

    對于客戶資料,這通常意味著大量的驗證:

    #、有效的URLS

    #、資料型別約束(eg:庫存必須是int

    #、范圍約束(eg:庫存必須是正整數)

    #、值匹配,通過運算式或自定義程式代碼實作

    取決于資料供應商的職業,一些供應商公司還在通過Excel來管理他們的資料(eg:手動在Excel中更新庫存資料),一些供應商有一個成熟的軟體系統管理他們的資料并允許你匯出此類資料,

    這給我們帶來了另一個有趣的話題,你接受什么樣的資料格式?JSONXMLEDIFAC或者CSV?你有API或表單上傳嗎?你該如何處理多年沒有更新的資料?

    資料清洗是一件很棘手的事情,你需要一個萬無一失的處理程序,如果你的資料清洗程序將商家產品價格更改為原始價格十分之一,并且有人下了1000個訂單,這種情況怎么辦?責任也是很重要的話題,

 

2、計量單位(UOM

    計量單位(Unit of Measure/MeasurementUOM),這不僅僅是關于系統指標,而且是關于到不同單位之間的轉換,需要對所有資料的值進行規范化,這意味著,如果一個產品的尺寸是英寸,而另一產品的尺寸是厘米,那么就需要一個轉換機制來進行適當的范圍查詢,你還需要確保對不同的產品使用了正確的計量單位,eg:顯示幕、飲料、視頻包裝等等,

     

3、重復資料

    如果你經營一個商城,你會發現這些商家銷售相同商品的幾率很高,

    如何處理這種情況?這個問題在圖書品類中已經通過ISBN解決了,如果你是世界上最大的商城,你就有能力創建一個ASIN

ISBNInternational Standard Book Number)國際標準書號,是專門為識別圖書等文獻而設計的國際編號,

ASINASIN(Amazon standard identification number),亞馬遜為自家產品編的唯一編號

    也有一些可以考慮的替代方案,你可以為提供的照片檢查相似性,復雜的檢查方案會浪費很多時間,有時只需簡單的考慮檢測相同哈希值就足夠了,

    你也可以比較產品的描述,因為它們通常直接從生產商處復制,另外還有:產品名稱、發布日期或計量單位等,

    這些替代方案都不是百分百安全的,

 

4、庫存資料

    擁有近實時的資訊是非常重要的,比如產品是可用的;比如產品不能在2-3天內送達,大多客戶不會下單,因為客戶往往是沖動性消費,

    所以,要么你能查詢其他系統(eg:查詢商家系統獲取最新的資料),要么你的商家提供庫存資料,庫存資料更新通常比價格或產品內容更新更頻繁,因此請確保使用一種輕量級的更新方式,

    你可能還需要處理庫存資訊陳舊的問題,即在你平臺上標識可用的商品但在商家處已經不再可用,從而導致訂單取消和變更,

 

資料建模

    現在開始為資料建模,首先你獲得了一些屬性,然后為它們標記上text/keyword標記,就可以開始搜索了,

 

1、變體

    (譯者注:變體,即一個產品一個屬性存在不同值,就可能有多個變體,即SKU和SPU的概念

對我來說,最棘手的問題是產品的變體,首先,你需要為不同的屬性和它們的組合建模,商家總是將多個變體掛載到一個產品中,即使這些變體本應該是獨立的產品,很難制定一個規則來規范什么是變體,什么不是,讓我們先一起來看些簡單又無處不在的商品:衣服,

    #Colorred, green, yellow, black, orange, white, blue

    #SizeXXS, XS, S, M, L, XL, XXL, XXXL

    簡單的兩個維度,卻已經有56個獨立的產品了,如果是四個維度將會導致變體風暴,而在UI中已經很難顯示哪些變體存在,哪些不存在,Amazon商城解決此問題的方案是:在點擊屬性后,再展現變體資訊,

    這種場景如何建模呢?這里有三個方案,其付出的成本相差很大,

    方案一:每一個變體擁有自己的索引檔案,這個方案簡單容易實作,但當商品數變多時,會存在很多重復的檔案和內容,另外,如果沒有指定屬性,該如何進行搜索過濾?讓我們通過一個t-shirt示例來說明,

    這個t-shirt存在不同的顏色和尺寸,

DELETE products 

PUT products/_bulk?refresh
{ "index" : {} }
{ "title" : "Elastic Robot T-Shirt", "size": "M", "color" : "gray" }
{ "index" : {} }
{ "title" : "Elastic Robot T-Shirt", "size": "S", "color" : "gray" }
{ "index" : {} }
{ "title" : "Elastic Robot T-Shirt", "size": "L", "color" : "gray" }
{ "index" : {} }
{ "title" : "Elastic Robot T-Shirt", "size": "M", "color" : "green" }
{ "index" : {} }
{ "title" : "Elastic Robot T-Shirt", "size": "S", "color" : "green" }
{ "index" : {} }
{ "title" : "Elastic Robot T-Shirt", "size": "L", "color" : "green" }

查詢陳述句如下:

GET products/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "title": "shirt"
        }
      },
      "filter": [
        {
          "term": {
            "color.keyword": "green"
          }
        },
        {
          "term": {
            "size.keyword": "M"
          }
        }
      ]
    }
  }
}

    查詢結果只有一條shift資料,但當我們從兩個filter中移除一個后,將會回傳同一個shift產品的多條document資料,

 

    我們可以通過elasticsearchfield collapsing功能來解決這個問題,但這也意味著在查詢時需要多做一些事情,

    方案二:我們可以嘗試使用elasticsearch嵌套資料型別,把所有的變體放到一個陣列中,如下:

DELETE products 

PUT products 
{
  "mappings": {
    "properties": {
      "variants" : {
        "type": "nested"
      }
    }
  }
}

POST products/_doc
{
  "title" : "Elastic Robot T-Shirt",
  "variants" : [
    { "size": "S", "color": "gray"},
    { "size": "M", "color": "gray"},
    { "size": "L", "color": "gray"},
    { "size": "S", "color": "green"},
    { "size": "M", "color": "green"},
    { "size": "L", "color": "green"}
  ]
}

查詢陳述句如下:

GET products/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "title": "shirt"
        }
      },
      "filter": [
        {
          "nested": {
            "path": "variants",
            "query": {
              "term": {
                "variants.color.keyword": "green"
              }
            }
          }
        },
        {
          "nested": {
            "path": "variants",
            "query": {
              "term": {
                "variants.size.keyword": "M"
              }
            }
          }
        }
      ]
    }
  }
}

 

    我們也可以在不使用任何filter的情況下進行搜索,且只回傳一個檔案,需要注意一點是:通過使用自動映射來防止映射爆炸,如果你控制了屬性名稱,請盡量減少它們的數量并統一規范它們(eg:屬性名稱size,可以用于多種商品上)

 

    使用 inner_hits 功能也很容易找出匹配的嵌套檔案,

那么這個方案有什么問題呢?問題在于產品資料更新,如果你也將庫存存盤在該索引中,那么單個變體的庫存更新將導致整個檔案的索引重建,因為庫存數量的變更頻率,可能會是相當大的開銷,但我仍然傾向于這個解決方案,因為我認為庫存更新在大多數情況下是可管理的,

    方案三:使用 join資料型別,允許我們在查詢時將兩個檔案(產品檔案和變體檔案)進行關聯,

DELETE products

PUT products
{
  "mappings": {
    "properties": {
      "join_field": {
        "type": "join",
        "relations": {
          "parent_product": "variant"
        }
      }
    }
  }
}

PUT products/_bulk?refresh
{ "index" : { "_id": "robot-shirt" } }
{ "title" : "Elastic Robot T-Shirt", "join_field" : { "name" : "parent_product" } }
{ "index" : { "routing": "robot-shirt" } }
{ "size": "M", "color" : "gray", "join_field" : { "name" : "variant", "parent" : "robot-shirt" } }
{ "index" : { "routing": "robot-shirt" } }
{ "size": "S", "color" : "gray", "join_field" : { "name" : "variant", "parent" : "robot-shirt" } }
{ "index" : { "routing": "robot-shirt" } }
{ "size": "L", "color" : "gray", "join_field" : { "name" : "variant", "parent" : "robot-shirt" } }
{ "index" : { "routing": "robot-shirt" } }
{ "size": "M", "color" : "green", "join_field" : { "name" : "variant", "parent" : "robot-shirt" } }
{ "index" : { "routing": "robot-shirt" } }
{ "size": "S", "color" : "green", "join_field" : { "name" : "variant", "parent" : "robot-shirt" } }
{ "index" : { "routing": "robot-shirt" } }
{ "size": "L", "color" : "green", "join_field" : { "name" : "variant", "parent" : "robot-shirt" } }

查詢陳述句如下:

GET products/_search
{
  "query": {
    "bool": {
      "must": {
        "match": {
          "title": "shirt"
        }
      },
      "filter": [
        {
          "has_child": {
            "inner_hits": {},
            "type": "variant",
            "query": {
              "bool": {
                "filter": [
                  {
                    "term": {
                      "color.keyword": "green"
                    }
                  },
                  {
                    "term": {
                      "size.keyword": "M"
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

    這也會回傳匹配的子產品,請注意,使用join資料型別比使用nested資料型別的查詢開銷要大,因此,只有在高更新負載的情況下我才會考慮使用join資料型別,搜索速度對我來說是最重要的指標之一,

    上面這個示例也使用了之前提到的inner_hits 功能,所以你不僅能看到父檔案,也可以看到匹配的子檔案,請注意,這可能不止一次命中,所以你應該小心的將結果回傳到客戶端(我總是試圖只回傳一個變體),為客戶端回傳部分變體資料可能很重要,假設你正在搜索一件XL尺寸的綠色shirt,那么回傳一個綠色shirt影像比回傳尺寸為XL shirt影像更加有用,

    哪些資料屬于變體,哪些資料屬于父產品,這很難把控,有些商家會為每一個變體撰寫一個描述,我是非常反對的,因為不同變體之間,屬性應該是唯一的區別,

    在進入下一個話題之前,有幾個問題是需要我們思考的:

    #、如何在UI中處理丟失的變體?

    #、如何顯示不可用的變體?

    #、你能處理2000個產品變體嗎?

    #、沒有任何變體的產品如何展示和建模?

    #、確保變體能擁有獨立的單價(eg:手機中不同記憶體會有不同價格)

    #、變體的屬性能否支持搜索和過濾?(eg:尺寸、顏色等)

 

2、多語言

    如果你的產品名稱和描述需要支持多語言,你應該為每種語言設定專用欄位,以便你使用自定義分析器,這里包含兩個問題:如何識別語言和如何存盤內容,首先,如果你不懂這種語言,你需要去識別它,最好的情況下,語言資訊和產品資料一起交付給你,

    Elasticsearch中,在推理處理器(inference processor)中內置了一種語言識別(language identification)特性,所以你可以在索引時提取語言資訊,

POST _ingest/pipeline/_simulate
{
  "pipeline": {
    "processors": [
      {
        "inference": {
          "model_id": "lang_ident_model_1",
          "inference_config": { "classification": {}},
          "field_map": {}
        }
      }
    ]
  },
  "docs": [
    { "_source": { "text": "Das ist ein deutscher Text" } }
  ]
}

預測結果為:de(德語)

 

    推測出語言后,你就可以將語言和內容存盤到一個特定的欄位中,如description.de,如果你能分析出用戶搜索關鍵詞使用的語言,你就可以只使用德語分析器搜索德語欄位(description.de),從而得到更好的搜索體驗,

 

3、Decompounding分解分詞

    這是一個德語案例,雖然只針對德語一種語言做處理,但依然很難,尤其是很多產品名稱存在復合詞的情況,著名的:Eiersollbruchenstellenverursacher,如果你覺得好奇,你可以在Amazon網站上搜索試試,這不是一個假冒產品,但也只是一個例外,還有一些簡單的例子,比如Blumentopfflower pot,花盆)和Kochtopfcooking pot,烹飪器),當只輸入topf時,是不能搜索出BlumentopfKochtopf相關的產品的,因為它們只是這個詞的一部分,但英語通過pot單詞(上面括號中為德語對應的英語單詞)很好的解決了這個問題,pot擁有自己的詞條,也被放入倒排索引中,

    幸運的是,Lucene有一個分解分詞過濾器decompounder token filter),讓我們在德語中可以實作pot的效果,讓我們看下面這個例子,

# returns each term
GET _analyze
{
  "tokenizer": "standard",
  "text": [ "Blumentopf",  "Kochtopf" ]
}

GET _analyze?filter_path=tokens.token
{
  "tokenizer": "standard",
  "filter": [
    {
      "type": "dictionary_decompounder",
      "word_list": ["topf"]
    }
  ],
  "text": [ "Blumentopf",  "Kochtopf" ]
}

第一條查詢陳述句不會把topf分解為獨立詞條,第二條查詢陳述句會將topf分解為獨立的詞條:

{
  "tokens" : [
    {
      "token" : "Blumentopf"
    },
    {
      "token" : "topf"
    },
    {
      "token" : "Kochtopf"
    },
    {
      "token" : "topf"
    }
  ]
}

但是請注意,讓我們用相同的方式執行另一個詞條”Stopfwatte”

GET _analyze?filter_path=tokens.token
{
  "tokenizer": "standard",
  "filter": [
    {
      "type": "dictionary_decompounder",
      "word_list": ["topf"]
    }
  ],
  "text": [ "Stopfwatte" ]
}

回傳結果

{
  "tokens" : [
    {
      "token" : "Stopfwatte"
    },
    {
      "token" : "topf"
    }
  ]
}

    你可以嘗試向你的用戶解釋,搜索topf時,Stopfwatte為什么是一個有效的回傳結果,但是我相信這會非常難解釋清楚,你也可以在多條件bool查詢中使用多個should來影響搜索結果評分,但這很可能意味著你用錯誤的方式解決了這個問題,更好的解決這個問題的地方應該是在創建索引時,

    這個的地方就是:斷詞分解(Hyphenation decompounder)處,這需要一個來自offo專案XML檔案

GET _analyze
{
  "tokenizer": "standard",
  "filter": [
    {
      "type": "hyphenation_decompounder",
      "hyphenation_patterns_path": "analysis/de_DR.xml",
      "word_list": ["topf"]
    }
  ],
  "text": [ "Blumentopf",  "Kochtopf", "Stopfwatte" ]
}

運行結果是

{
  "tokens" : [
    {
      "token" : "Blumentopf"
    },
    {
      "token" : "topf"
    },
    {
      "token" : "Kochtopf"
    },
    {
      "token" : "topf"
    },
    {
      "token" : "Stopfwatte"
    }
  ]
}

    如你所見,Stopfwatte就沒有創建獨立的topf詞條,因為現在使用段詞字典更好的拆分了詞條,

 

    最后,當你決定對詞條進行分解時,你需要非常清楚,你需要一個持續更新的單詞串列,

    你也可以根據你的業務場景創建和修改斷詞模型(hyphenation patterns),

 

4、價格

    一個產品只有一個價格的想法是錯誤的,可能是2個,因為有執行價格,可能是3個,因為有大量的減免,也可能是4個,因為有不同的銷售稅,可能是52個,因為每個州的銷售稅不同,但至少這些價格是靜態的,

    如果某些客戶得到永久的10%的折扣,所有的產品,是否要對每一個客戶群設定一個價格變體?

    在執行搜索時,是否考慮了價格優惠的問題?如何顯示價格?你是否想為搜索回傳的每個產品再呼叫一次價格服務來獲取價格?

    這些都是棘手的問題,關鍵是你要明白:你的產品不會只有一個價格,

    (譯者注:淘寶在根據價格過濾時,是根據折扣之前的價格值進行過濾的)

 

 

 

 

其他推薦閱讀:

      Elasticsearch搜索資料匯總

 

 

==============================================================================

over,謝謝查閱,覺得文章對你有識訓,請多幫推薦,歡迎向我提供更好的資料資訊,

 

 

 

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/229368.html

標籤:其他

上一篇:國家標準《網路安全應急能力評估準則》征求意見稿解讀

下一篇:題解 洛谷 P3396 【哈希沖突】(根號分治)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more