ES3:ElasticSearch 索引

来源:http://www.cnblogs.com/ljhdo/archive/2017/03/14/4981928.html
-Advertisement-
Play Games

ElasticSearch是文檔型資料庫,索引(Index)定義了文檔的邏輯存儲和欄位類型,每個索引可以包含多個文檔類型,文檔類型是文檔的集合,文檔以索引定義的邏輯存儲模型,比如,指定分片和副本的數量,配置刷新頻率,分配分析器等,存儲在索引中的海量文檔分散式存儲在ElasticSearch集群中。 ... ...


這是ElasticSearch 2.4 版本系列的第三篇:

第一篇:ES1:Windows下安裝ElasticSearch

第二篇:ES2:ElasticSearch 集群配置

第三篇:ES3:ElasticSearch 索引

 

ElasticSearch是文檔型資料庫,索引(Index)定義了文檔的邏輯存儲和欄位類型,每個索引可以包含多個文檔類型,文檔類型是文檔的集合,文檔以索引定義的邏輯存儲模型,比如,指定分片和副本的數量,配置刷新頻率,分配分析器等,存儲在索引中的海量文檔分散式存儲在ElasticSearch集群中。

ElasticSearch是基於Lucene框架的全文搜索引擎,將所有文檔的信息寫入到倒排索引(Inverted Index)的數據結構中,倒排索引建立的是索引中詞和文檔之間的映射關係,在倒排索引中,數據是面向詞(Term)而不是面向文檔的。

ElasticSearch的對象模型,跟關係型資料庫模型相比:

  • 索引(Index):相當於資料庫,用於定義文檔類型的存儲;在同一個索引中,同一個欄位只能定義一個數據類型;
  • 文檔類型(Type):相當於關係表,用於描述文檔中的各個欄位的定義;不同的文檔類型,能夠存儲不同的欄位,服務於不同的查詢請求;
  • 文檔(Document):相當於關係表的數據行,存儲數據的載體,包含一個或多個存有數據的欄位;
    • 欄位(Field):文檔的一個Key/Value對;
    • 詞(Term):表示文本中的一個單詞;
    • 標記(Token):表示在欄位中出現的詞,由該詞的文本、偏移量(開始和結束)以及類型組成;

索引是由段(Segment)組成的,段不是實時更新的,這意味著,在建立索引時,一個段寫入磁碟後,就不再被更新。被刪除文檔的信息存儲在一個單獨的文件中,在搜索數據時,ElasticSearch首先從段中查詢,再從查詢結果中過濾被刪除的文檔,這意味著,段中存儲”未被刪除文檔“的密度降低。多個段可以通過段合併(Segment Merge)操作把“已刪除”的文檔將從段中物理刪除,將未刪除的文檔合併成一個新段,新段中沒有”已刪除文檔“,因此,段合併操作能夠提高索引的查找速度,但段合併是IO密集型的,需要消耗大量的IO操作。

一,創建索引

在創建索引之前,首先瞭解RESTful API的調用風格,在管理和使用ElasticSearch服務時,常用的HTTP動詞有下麵五個:

  • GET 請求:獲取伺服器中的對象
    • 相當於SQL的Select命令
    • GET /blogs:列出所有博客
  • POST 請求:在伺服器上更新對象
    • 相當於SQL的Update命令
    • POST /blogs/ID:更新指定的博客
  • PUT 請求:在伺服器上創建對象
    • 相當於SQL的Create命令
    • PUT /blogs/ID:新建一個博客  
  • DELETE 請求:刪除伺服器中的對象
    • 相當於SQL的Delete命令
    • DELETE /blogs/ID:刪除指定的博客
  • HEAD 請求:僅僅用於獲取對象的基礎信息

1,禁用自動創建索引

推薦設置:在全局配置文件 elasticsearch.yml 中,禁用自動創建索引:

action.auto_create_index:false

2,手動創建索引

創建索引的語法是:PUT http://host:port/index_name/  + index_configuration

其中,index_name是創建的索引的名字,indiex_configuration 是向ElasticSearch伺服器傳遞的請求負載的主體,數據格式json,用於定義索引的配置信息:映射節(mappings)和配置節(settings)。

在創建索引時,需要精心設計索引的映射節(mappings)和配置節(settings),本例創建blog索引和articles文檔類型,創建索引的語法是:

PUT http://localhost:9200/blog/

下文詳細介紹ElasticSearch索引的映射(Mapping)配置,詳細信息請參考《Elasticsearch Reference [2.4] » Mapping》。

二,索引映射節(mappings)

1,索引結構

索引是由文檔類型構成的,在mappings欄位中定義索引的文檔類型,示例代碼中為blog索引定義了三個文檔類型:articles,followers和comments

{  
   "mappings":{  
      "articles":{ },
      "followers":{ },
      "comments":{ }
   }
}

2,文檔屬性

文檔屬性定義了文檔類型的共用屬性,適用於文檔的所有欄位:

  • dynamic_date_formats屬性:該屬性定義可以識別的日期格式列表;
  • dynamic屬性:預設值為true,允許向文檔類型中加入欄位,推薦設置為false,關閉ElasticSearch自動類型檢測,同時關閉自動添加欄位;文檔類型的所有欄位必須顯式定義,在properties欄位中未定義的欄位都將會ElasticSearch忽略。
{  
   "mappings":{  
      "articles":{  "dynamic":false,
         "dynamic_date_formats":["yyyy-MM-dd hh:mm:ss", "yyyy-MM-dd" ],
         "properties":{  
            "id":{},
            "title":{},
            "author":{},
            "content":{},
            "postedat":{}
         }
      }
   }
}

三,文檔的欄位屬性

1,欄位的數據類型

欄位的數據類型由欄位的屬性type指定,ElasticSearch支持的基礎數據類型主要有:

  • 字元串類型:string;
  • 數值類型:位元組(byte)、2位元組(short)、4位元組(integer)、8位元組(long)、float、double;
  • 布爾類型:boolean,值是true或false;
  • 時間/日期類型:date,用於存儲日期和時間;
  • 二進位類型:binary;
  • IP地址類型:ip,以字元串形式存儲IPv4地址;
  • 特殊數據類型:token_count,用於存儲索引的字數信息

在文檔類型的properties屬性中,定義欄位的type屬性,指定欄位的數據類型,屬性properties 用於定義文檔類型的欄位屬性,或欄位對象的屬性:

 "properties":{  
            "id":{"type":"long"},

2,欄位的公共屬性

  • index:該屬性控制欄位是否編入索引被搜索,該屬性共有三個有效值:analyzed、no和not_analyzed:
    • analyzed:表示該欄位被分析,編入索引,產生的token能被搜索到;
    • not_analyzed:表示該欄位不會被分析,使用原始值編入索引;
    • no:不編入索引,無法搜索該欄位;
    • 其中analyzed是分析,分解的意思,預設值是analyzed,表示將該欄位編入索引,以供搜索。
  • store:指定是否將欄位的原始值寫入索引,預設值是no,欄位值被分析,能夠被搜索,但是,欄位值不會存儲,這意味著,該欄位能夠被查詢,但是不會存儲欄位的原始值。
  • boost:欄位級別的助推,預設值是1,定義了欄位在文檔中的重要性/權重;
  • include_in_all:該屬性指定當前欄位是否包括在_all欄位中,預設值是ture,所有的欄位都會包含_all欄位中;如果index=no,那麼屬性include_in_all無效,這意味著當前欄位無法包含在_all欄位中。
  • copy_to:該屬性指定一個欄位名稱,ElasticSearch引擎將當前欄位的值複製到該屬性指定的欄位中;
  • doc_values:文檔值是存儲在硬碟上的索引時(indexing time)數據結構,對於not_analyzed欄位,預設值是true,analyzed string欄位不支持文檔值;
  • fielddata:欄位數據是存儲在記憶體中的查詢時(querying time)數據結構,只支持analyzed string欄位;
  • null_value:該屬性指定一個值,當欄位的值為NULL時,該欄位使用null_value代替NULL值;在ElasticSearch中,NULL 值不能被索引和搜索,當一個欄位設置為NULL值,ElasticSearch引擎認為該欄位沒有任何值,使用該屬性為NULL欄位設置一個指定的值,使該欄位能夠被索引和搜索。

3,字元串類型常用的其他屬性

  • analyzer:該屬性定義用於建立索引和搜索的分析器名稱,預設值是全局定義的分析器名稱,該屬性可以引用在配置結點(settings)中自定義的分析器;
  • search_analyzer:該屬性定義的分析器,用於處理髮送到特定欄位的查詢字元串;
  • ignore_above:該屬性指定一個整數值,當字元串欄位(analyzed string field)的位元組數量大於該數值之後,超過長度的部分字元數據將不能被analyzer處理,不能被編入索引;對於 not analyzed string欄位,超過長度的部分字元將被忽略,不會被編入索引。
  • position_increment_gap:該屬性指定在相同詞的位置上增加的gap,預設值是100;
  • index_options:索引選項控制添加到倒排索引(Inverted Index)的信息,這些信息用於搜索(Search)和高亮顯示:
    • docs:只索引文檔編號(Doc Number)
    • freqs:索引文檔編號和詞頻率(term frequency)
    • positions:索引文檔編號,詞頻率和詞位置(序號)
    • offsets:索引文檔編號,詞頻率,詞偏移量(開始和結束位置)和詞位置(序號)
    • 預設情況下,被分析的字元串(analyzed string)欄位使用positions,其他欄位使用docs; 

分析器(analyzer)把analyzed string 欄位的值,轉換成標記流(Token stream),例如,字元串"The quick Brown Foxes",可能被分解成的標記(Token)是:quick,brown,fox。這些詞(term)是該欄位的索引值,這使用對索引文本的查找更有效率。欄位的屬性 analyzer 用於指定在index-time和search-time時,ElasticSearch引擎分解欄位值的分析器名稱。

4,數值類型的其他屬性

  • precision_step:該屬性指定為數值欄位每個值生成的term數量,值越低,產生的term數量越高,範圍查詢越快,索引越大,預設值是4;
  • ignore_malformed:忽略格式錯誤的數值,預設值是false,不忽略錯誤格式,對整個文檔不處理,並且拋出異常;
  • coerce:預設值是true,嘗試將字元串轉換為數值,如果欄位類型是整數,那麼將小數取整;

5,日期類型的其他屬性

  • format:指定日期的格式,例如:“yyyy-MM-dd hh:mm:ss”
  • precision_step:該屬性指定為數值欄位每個值生成的term數量,值越低,產生的term數量越高,範圍查詢越快,索引越大,預設值是4;
  • ignore_malformed:忽略錯誤格式,預設值是false,不忽略錯誤格式;

6,多欄位(fields)

在fields屬性中定義一個或多個欄位,該欄位的值和當前欄位值相同,可以設置一個欄位用於搜索,一個欄位用於排序等。

"properties":
{  
    "id":{  "type":"long",
         "fields":{  "id2":{"type":"long","index":"not_analyzed"} }
      },

7,文檔值(doc_values) 

預設情況下,多數欄位都被一起編入索引,用戶使用倒排索引(Inverted Index)可以搜索到相應的詞(Term),倒排索引支持在唯一的有序詞列表中查找特定詞,或檢查文檔中是否包含某個詞,但是,對於排序(Sort),聚合和在腳本中訪問特定欄位的值(Field value),這三個操作需要執行不同的數據訪問模式,即單欄位數據訪問:在文檔中查找特定的欄位,檢查該欄位是否包含指定的詞。

文檔值(doc_values)屬性指定將欄位的值寫入到硬碟上的列式結構,實現了單個欄位的數據訪問模式,能夠高效執行排序和聚合搜索。使用文檔值的欄位將有專屬的欄位數據緩存實例,無需像普通欄位一樣倒排。是存儲在硬碟上的數據結構,在文檔索引時創建。文檔值數據存在硬碟上,在文檔索引時創建,存儲的數據和欄位存儲在_source 欄位的數據相同,文檔值支持所有的欄位類型,除了analyzed string 欄位之外。

預設情況下,所有的欄位都支持文檔值,預設是啟用的(enabled),如果不需要在單個欄位上執行排序或聚合操作,或者從腳本中訪問指定欄位的值,那麼,可以禁用文檔值,欄位的值將不會存儲在硬碟空間中。

"properties": {
    "status_code": { 
        "type":       "string",
        "index":      "not_analyzed"
        "doc_values": true
    },
    "session_id": { 
        "type":       "string",
        "index":      "not_analyzed",
        "doc_values": false
    }
}

8,欄位數據(Fielddata)

欄位數據(Fielddata)是存儲在記憶體中的查詢時數據結構,只支持analyzed string欄位。該數據結構在欄位第一次執行聚合,排序或被腳本訪問時創建。創建的過程是:在讀取整個倒排索引(Inverted Index)時,ElasticSearch從硬碟上載入倒排索引的每個段(Segment),倒轉詞(Term)和文檔的關係,並將其存儲在JVM堆記憶體中。載入欄位數據的過程是非常消耗IO資源的,一旦被載入,就被存儲在記憶體中,直到段的生命周期結束。

對於analyzed string欄位,fielddata欄位是預設啟用的,

"text":{  
   "type":"string",
   "fielddata":{  "loading":"lazy"
   }
}

詳細信息,請參考Mapping parameters » fielddata

Analyzed strings use a query-time data structure called fielddata. This data structure is built on demand the first time that a field is used for aggregations, sorting, or is accessed in a script. It is built by reading the entire inverted index for each segment from disk, inverting the term ↔︎ document relationship, and storing the result in memory, in the JVM heap.

9,存儲(store)

存儲(store)屬性指定是否將欄位的原始值寫入索引,預設值是no,欄位值被分析,能夠被搜索,但是,欄位的原始值不會存儲,這意味著,該欄位能夠被查詢,但是無法獲取欄位的原始值。預設情況下,該欄位的值會被存儲到_source欄位中,如果想要獲取單個或多個欄位的值,而不是整個_source欄位,可以使用 source filtering 來實現;但是在特定的條件下,只存儲一個欄位的值是有意義的(make sense),例如,一個article文檔包含:title,postdate和content欄位,從文檔中只獲取title和postdate欄位,並且使_source 欄位包含content欄位,必須通過store屬性來控制:

"mappings": {
    "my_type": {
      "properties": {
        "title": {
          "type": "string",
          "store": true 
        },
        "date": {
          "type": "date",
          "store": true 
        },
        "content": {
          "type": "string"
        }
      }
    }
  }

10,位置增加間隔(position_increment_gap)

對於analyzed string欄位,都會考慮把詞的位置信息,用於支持位置和短語匹配查詢(proximity or phrase queries),例如,有一個字元串欄位,該欄位中存在多個詞“fake”,ElasticSearch引擎會在每個值之間增加一個gap,以防止短語匹配或位置匹配查詢出現跨越多個詞的異常,這個gap的值就是屬性position_increment_gap,預設值是100;

四,元欄位

在索引的映射中,元欄位(Meta-field)是以下劃線開頭的欄位,部分元欄位可以配置,部分元欄位不可配置,只能用於返回信息。

1,_all 欄位,可以配置

ElasticSearch使用_all欄位存儲其他欄位的數據以便搜索,預設情況下,_all欄位是啟用的,包含了索引中所有欄位的數據,然而這一欄位使索引變大,如果不需要,請禁用該欄位,或排除某些欄位。為了在_all欄位中不包括某個特定欄位,在欄位中設置“include_in_all”屬性為false。

禁用_all欄位,需要修改映射配置:

{  
   "articles":{  "_all":{  
         "enabled":"false"
      }
   }
}

2,_source 欄位,可以配置

_source欄位表示在生成索引的過程中,存儲發送到ElasticSearch的原始JSON文檔,預設情況下,該欄位會被啟用,因為索引的局部更新功能依賴該欄位。

{  
   "articles":{  
      "_source":{  
         "enabled":"false"
      }
   }
}

{  
   "articles":{  
      "_source":{  
         "excludes":["Content","Comments"],
         "includes":["author"]
      }
   }
}

3,_routing 欄位,可以配置

路由欄位,將一個文檔值進行哈希映射,並將該文檔路由到指定的分片,路由的公式是:

shard_num = hash(_routing) % num_primary_shards

在ElasticSearch 2.4 版本中,path參數被廢棄,使用的預設欄位是_id,設置required為true,表示路由欄位在進行索引的CRUD操作時必需顯式賦值。

{  
   "articles":{  
      "_routing":{  
         "required":"true"
      }
   }
}

在put 命令中,使用自定義的路由欄位,以下示例使用 user1欄位作為路由欄位更新和查詢文檔:

PUT my_index/my_type/1?routing=user1 
{
  "title": "This is a document"
}
GET my_index/my_type/1?routing=user1

4,不可配置的元欄位

  • _index:返迴文檔所屬的索引
  • _uid:返迴文檔的type和id
  • _type:返迴文檔類型(type)
  • _id:返迴文檔的ID;
  • _size:返迴文檔的_source欄位中函數的位元組數量;
  • _field_names:返迴文檔中不包含null值的欄位名稱;

詳細信息,請參考:Mapping » Meta-Fields

五,索引配置節(settings)

1,配置索引的分片和副本數量

ElasticSearch索引是有一個或多個分片組成的,每個分片是索引的一個水平分區,包含了文檔數據的一部分;每個分片有0,1或多個副本,分片的副本和分片存儲相同的數據。

示例代碼,為索引創建5個分片,分片沒有副本:

"settings":{
    "number_of_shards":5,
    "number_of_replicas":0,

2,配置分析器(analyzer)

在配置結點的analysis屬性中配置分析器,參考官方文檔瞭解更多,

分詞器(tokenizer)是系統預定義的,常用的分詞器是:

  • standard:預設值,用於大多數歐洲語言的標準分詞器
  • simple:基於非字母字元來分詞,並將其轉化為小寫形式
  • whitespace:基於空格來分詞
  • stop:除了simple的所有功能,還能基於停用詞(stop words)過濾數據;
  • pattern:使用正則表達式分詞;
  • snowball:除了standard提供的分詞功能之外,還提供詞乾提取功能;

過濾器是系統預定義的,常用的過濾器是:

  • asciifolding
  • lowercase
  • kstem

在配置結點中,自定義分析器(analyzer)示例代碼:

{  
   "settings":{  
      "index":{  
         "analysis":{  
            "analyzer":{  
               "myanalyzer_name":{  
                  "tokenizer":"standard",
                  "filter":[  
                     "asciifolding",
                     "lowercase",
                     "ourEnglishFilter"
                  ]
               }
            },
            "filter":{  
               "ourEnglishFilter":{  
                  "type":"kstem"
               }
            }
         }
      }
   }
}
View Code

六,刪除索引

刪除索引的語法是: DELETE http://localhost:9200/blog

七,更新索引

索引的更新分為逐個文檔的更新和批量文檔更新:

1,單個文檔(Individual Document)的更新

單個文檔更新的語法是:POST http://localhost:9200/blog/articles/1 +文檔對象的JSON數據

POST http://localhost:9200/blog/articles/1

文檔對象的JSON數據示例如下:

{  
   "id":1,
   "title":"Elasticsearch index",
   "Author":"悅光陰",
   "content":"xxxxxxxxxxx",
   "postedat":"2017-03-14"
}

2,批量文檔的更新(Bluk)

批量文檔更新的語法是:POST http://localhost:9200/_bulk + 批量文檔對象的JSON數據,在_bulk 端進行批量更新操作。

在傳遞的請求主體中,每一個請求分為兩個JSON數據,第一個JSON數據包含操作說明的描述信息,第二個JSON數據包含文檔對象:

{  
   "index":{  
      "_index":"blog",
      "_type":"ariticles",
      "_id":1
   }
}
{  
   "id":1,
   "title":"Elasticsearch index",
   "Author":"悅光陰",
   "content":"xxxxxxxxxxx",
   "postedat":"2017-03-14"
}
{  
   "index":{  
      "_index":"blog",
      "_type":"ariticles",
      "_id":2
   }
}
{  
   "id":2,
   "title":"Elasticsearch index",
   "Author":"悅光陰",
   "content":"xxxxxxxxxxx",
   "postedat":"2017-03-14"
}
View Code

八,搜索索引

在_search端對索引數據進行搜索,ES查詢的語法非常複雜,總體來說,ElasticSearch支持聚合查詢和簡單查詢。

1,按照路由搜索

路由可以控制文檔和查詢轉發的目的分片,ElasticSearch計算路由欄位的哈希值,對於相同的路由值,將產生相同的哈希值,分配到特定的分片上;如果在查詢時,指定路由值,那麼只需要搜索單個分片而不是整個索引,就能獲取查詢結果。

路由欄位由文檔類型的_routing屬性定義,在查詢時,使用routing參數來查找特定路由的文檔:

GET http://localhost:9200/blog/_search?routing=1235&q=article_id=100

2,聚合和簡單查詢

下回分解

 

附:索引的配置文檔

 

參考文檔:

Elasticsearch Reference [2.4] » Index Modules

Elasticsearch Reference [2.4] » Mapping


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SQL觸發器實例(上) ...
  • 1.查看表歷史時刻數據 select * from tab_test AS OF TIMESTAMP to_timestamp('20140917 10:00:00','yyyymmdd hh24:mi:ss'); 2、利用flashback table恢復表到過去某一時刻 alter table ...
  • 最近在做一個RAC升級測試11.2.0.1升級到11.2.0.4,為保證業務能在11.2.0.4版本下正常運行,現需要將資料庫還原至11.2.0.4的單機環境下,資料庫大小為1.04T左右,在這裡總結下步驟。 環境簡介: 1.本次試驗的環境為11.2.0.4的單機環境,存儲為Windows NTFS ...
  • 1.創建DBLINK 2.創建物化視圖日誌(遠程主機操作) 3.創建物化視圖 4.刪除物化視圖和日誌 日誌和物化視圖要分開刪除 5.物化視圖更新 註意: 5.1、如果需要同時刷新多個物化視圖,必須用逗號把各個物化視圖名稱連接起來,並對每個視圖都要指明刷新方式 (f、增量刷新,c、完全刷新,?、強制刷 ...
  • 可以修改類不用重啟Tomcat載入整個項目(手工啟動) 配置reloadable=true(自動重載) 使用Debug模式,前提是僅限於局部修改。(修改類不用重啟--熱載入) Tomcat輕小,而WebLogic、WebSphere對硬體要求比較高,吃記憶體、耗CUP。JBoss類更改不會重啟(傳說, ...
  • 項目中用到了cassandra,用來存儲海量數據,且要有高效的查詢;本博客就進行簡單的介紹和進行一些基本的操作 一、使用場景: 是一款分散式的結構化數據存儲方案(NoSql資料庫),存儲結構比Key-Value資料庫(像Redis)更豐富,但是比Document資料庫(如Mongodb)支持度有限; ...
  • 存儲數據的安全性和可靠性是生產資料庫的關註重點,本文為大家分析了目前採用較多的保障MySQL可用性方案。 ...
  • 運行Hadoop時出現了: 導致運行失敗。仔細分析後發現,這是因為以前192.168.1.201的主機名為master,後來把192.168.1.202改名為master,由於兩台主機的公鑰不一樣,所以提示DNS欺騙(網路中有主機冒充master),或者master的IP地址和公鑰同時改變了。 解決 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...