C#如何使用ES
Elasticsearch簡介
Elasticsearch (ES)是一個基於 Lucene 的開源搜尋引擎,它不僅穩定、可靠、快速,而且也具有良好的水平擴展能力,是專門為分散式環境設計的。
Elasticsearch是什麼
Elasticsearch是一個基於Apache Lucene(TM)的開源搜尋引擎,無論在開源還是專有領域,Lucene可以被認為是迄今為止最先進、性能最好的、功能最全的搜尋引擎庫。
但是,Lucene只是一個函式庫。想要發揮其強大的作用,你需要使用C#將其整合到你的應用中。 Lucene非常複雜,你需要深入的了解檢索相關知識來理解它是如何運作的。
Elasticsearch也是使用Java編寫並使用Lucene來建立索引並實現搜尋功能,但是它的目的是透過簡單連貫的RESTful API讓全文搜尋變得簡單並隱藏Lucene的複雜性。
不過,Elasticsearch不僅僅是Lucene和全文搜尋引擎,它還提供:
分散式的即時檔案存儲,每個欄位都被索引並可被搜尋
即時分析的分散式搜尋引擎
可以擴展到上百台伺服器,處理PB級結構化或非結構化資料
而且,所有的這些功能被整合到一台伺服器,你的應用可以透過簡單的RESTful API、各種語言的客戶端甚至命令列與之交互。上手Elasticsearch非常簡單,它提供了許多合理的缺省值,並對初學者隱藏了複雜的搜尋引擎理論。它開箱即用(安裝即可使用),只需很少的學習既可在生產環境中使用。 Elasticsearch在Apache 2 license下授權使用,可以免費下載、使用和修改。
隨著知識的積累,你可以根據不同的問題領域定制Elasticsearch的高級特性,這一切都是可配置的,並且配置非常靈活。
使用C#操作ES
NEST是一個高層的客戶端,可以映射所有請求和響應對象,擁有一個強類型查詢DSL(領域特定語言),並且可以使用.net的特性比如協變、Auto Mapping Of POCOs,NEST內部使用的依然是Elasticsearch.Net客戶端。 elasticsearch.net(NEST)客戶端提供了強型別查詢DSL,方便使用者使用,原始碼下載。
一、如何安裝NEST
開啟VS的工具選單,透過NuGet套件管理器控制台,輸入以下指令安裝NEST
Install-Package NEST
search安裝後引用了以下三個LLDLL
. 。 ,使用連線池要比單一節點連結到Elasticsearch更有優勢,例如支援負載平衡、故障轉移等。
透過單一連結:
var node = new Uri("http://myserver:9200");
var settings = new ConnectionSettings(node);var client = new ElasticClient(settin);池連結:
var nodes = new Uri[]
{
new Uri("http://myserver1:9200"),
Uri("http://myserver3:9200")
};
var pool = new StaticConnectionPool(nodes);var settings = new ConnectionSformings(nodes);var settings = new ConnectionSperings(cliedl. );
NEST Index
為了知道請求需要操作哪個索引,Elasticsearch API期望收到一個或多個索引名稱作為請求的一部分。
一、指定索引
1、可以透過ConnectionSettings使用.DefaultIndex(),來指定預設索引。當一個請求裡沒有指定特定索引時,NEST將請求預設索引。
var settings = new ConnectionSettings()
.DefaultIndex("defaultindex");2、可以透過ConnectionSettings使用.MapDefaultTypeIndices(),來指定被映射為CLR類型的索引。 var settings = new ConnectionSettings().MapDefaultTypeIndices(m => m
.Add(typeof(Project), "projects") );
3、另外還可以顯示的為請求指定索引名稱,例如:
var response = client.Index(student, s=>s.Index("db_test"));
var result = client.Search
var result = client.Delete
注意:當現實的為請求指定索引名稱時,這個優先權是最高的,高於以上兩種方式指定的索引。
4、一些Elasticsearch API(例如query)可以採用一個、多個索引名稱或使用_all特殊標誌發送請求,請求NEST上的多個或所有節點
//請求單一節點
var singleString = Nest .Indices.Index("db_studnet");
var singleTyped = Nest.Indices.Index
ISearchRequest sStringRequest = 問題singleTypedRequest = new SearchDescriptor
//請求多個節點
var manyStrings = Nest.Indices.Index("dbstud;" = Nest.Indices.Index
var allIndices = Nest.Indices.AllIndices.All;
var all1
ISearchRequest allIndicesRequest = new SearchDescriptor
二、建立索引號進行配置,例如:
var descriptor = new CreateIndexDescriptor("db_student")
.Settings(s => s.NumberOfShards(5).NumberOfReplicas(1));client.CreateIndex(指定了該索引的分片數為5、副本數為1。
三、刪除索引
var descriptor = new DeleteIndexDescriptor("db_student").AllIndices();
NEST Mapping
NEST提供了多種映射方法,這裡介紹下透過Attribute自訂映射。
一、簡單實作
1、定義業務需要的POCO,並指定所需的Attribute
[ElasticsearchType(Name = "student")]
public class Student
{ FieldIndexOption.NotAnalyzed)]
public string Id { get; set; }
[Nest.String(Analyzer = "standard")]
[Nest.String(Analyzer = "standard")][Nest.String(Analyzer = "standard")]);
[ Nest.String(Analyzer = "standard")] public string Description { get; set; }public DateTime DateTime {get get get;來實現映射
var descriptor = new CreateIndexDescriptor("db_student")
.Settings(s => s.NumberOfShards(5).NumberOfReplicas(1))ms . .Map
);
client.CreateIndex(descriptor);
注意:透過.Properties()可以重寫透過Attriute或透過Attriute
2、NumberAttribute
3、BooleanAttribute
ObjectAttributeNEST Search
NEST提供了支援Lambda鍊式query DLS(領域特定語言)方式,以下是簡單實作及各個query的簡述。
一、簡單實作
1、定義SearchDescriptor,方便專案中複雜業務的實作
var query = new Nest.SearchDescriptor
var result = Search.SearchDescriptor
(m =>
m.MultiMatch(t => t.Fields(f => f.Field(obj => obj.Title).Field(obj => obj.Content)).Query())🎟 )
.MustNot(m =>
m.QueryString(t => t.Fields(f => f.Field(obj => objery" )
)
);
注意:
如果Elasticsearch使用預設分詞,Title和Content的attribute為[Nest.String(Analyzer = "standard")]
若Elsearch使用的是指義的attribute為[Nest.String(Analyzer = "ikmaxword")]或[Nest.String(Analyzer = "ik_smart")]Author的attribute為[Nest.String(Index = FieldIndexOption.NotAnalyzed)],禁止使用分析器3、過濾作者等於「歷史小河」的文檔query.PostFilter(x => x.Term(t => t.Field(obj => obj.Author).Value("wenli"))) ;4、過濾作者等於「歷史小河」或等於「友誼的小船」的文檔,匹配多個作者中間用空格隔開
query.PostFilter(x => x.QueryString(t => t. Fields(f => f.Field(obj => obj.Author)).Query("wenli yswenli")));
5、過濾數量在1~100之間的文件
query.PostFilter(x => x.Range(t => t.Field(obj => obj.Number).GreaterThanOrEquals(1).LessThanOrEquals(100)));
6、排序,依照得分倒敘排列,依照得分倒敘. Sort(x => x.Field("_score", Nest.SortOrder.Descending));
7、定義高亮樣式及欄位
query.Highlight(h => h> hah "")
.PostTags("")
); .Hits.Select(c => new Models.ESObject()
{
Id = c.Source.Id,
Title = c.Highlights == null ? c.Source.Title :Key c.Highlights.Key c. Contains("title") ? string.Join("", c.Highlights["title"].Highlights) : c.Source.Title, //高亮顯示的內容,一條記錄中出現了幾次
Content = c.Highlights == null ? c.Source.Content : c.Highlights.Keys.Contains("content") ? string.Join("", c.Highlights["content"].Highlights) : c.Source. Content, //高亮顯示的內容,一筆記錄中出現了幾筆
Author = c.Source.Author,
.net Document
文件操作包含新增/更新文件、局部更新文件、刪除文件及對應的批次操作文件方法。
一、新增/更新文件及批次操作
新增/更新單一文件
Client.Index(student);
批次新增/更新文件var list = new List
二、局部更新單一文件及批次操作
StuDM. object>("002", upt => upt.Doc(new { Name = "wenli" }));
局部更新批次文件
var ids = new List
var bulkQuest = new BulkRequest() { Operations = new List
foreach (var v v. peration
🎳
client.Delete
var bulkQuest = new BulkRequest() { Operations = new List
{
bulkQuest.Operations.Add(new BulkDeleteOperation
}

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

C 語言中符號的使用方法涵蓋算術、賦值、條件、邏輯、位運算符等。算術運算符用於基本數學運算,賦值運算符用於賦值和加減乘除賦值,條件運算符用於根據條件執行不同操作,邏輯運算符用於邏輯操作,位運算符用於位級操作,特殊常量用於表示空指針、文件結束標記和非數字值。

在 C 語言中,char 類型在字符串中用於:1. 存儲單個字符;2. 使用數組表示字符串並以 null 終止符結束;3. 通過字符串操作函數進行操作;4. 從鍵盤讀取或輸出字符串。

C語言中通過轉義序列處理特殊字符,如:\n表示換行符。 \t表示製表符。使用轉義序列或字符常量表示特殊字符,如char c = '\n'。注意,反斜杠需要轉義兩次。不同平台和編譯器可能有不同的轉義序列,請查閱文檔。

在 C 語言中,char 和 wchar_t 的主要區別在於字符編碼:char 使用 ASCII 或擴展 ASCII,wchar_t 使用 Unicode;char 佔用 1-2 個字節,wchar_t 佔用 2-4 個字節;char 適用於英語文本,wchar_t 適用於多語言文本;char 廣泛支持,wchar_t 依賴於編譯器和操作系統是否支持 Unicode;char 的字符範圍受限,wchar_t 的字符範圍更大,並使用專門的函數進行算術運算。

在 C 語言中,char 類型轉換可以通過:強制類型轉換:使用強制類型轉換符將一種類型的數據直接轉換為另一種類型。自動類型轉換:當一種類型的數據可以容納另一種類型的值時,編譯器自動進行轉換。

多線程和異步的區別在於,多線程同時執行多個線程,而異步在不阻塞當前線程的情況下執行操作。多線程用於計算密集型任務,而異步用於用戶交互操作。多線程的優勢是提高計算性能,異步的優勢是不阻塞 UI 線程。選擇多線程還是異步取決於任務性質:計算密集型任務使用多線程,與外部資源交互且需要保持 UI 響應的任務使用異步。

char 和 unsigned char 是存儲字符數據的兩種數據類型,主要區別在於處理負數和正數的方式:值範圍:char 有符號 (-128 到 127),unsigned char 無符號 (0 到 255)。負數處理:char 可以存儲負數,unsigned char 不能。位模式:char 最高位表示符號,unsigned char 無符號位。算術運算:char 和 unsigned char 作為有符號和無符號類型,其算術運算方式不同。兼容性:char 和 unsigned char

C語言中char的使用錯誤和避免方法:未初始化char變量:使用常量或字符串文字初始化。超出字符範圍:比較變量值是否在有效範圍內(-128 到 127)。字符比較不區分大小寫:使用toupper()或tolower()轉換字符大小寫。使用char*引用字符數組時未加'\0':使用strlen()或手動添加'\0'標記數組結尾。使用char數組時忽略數組大小:明確指定數組大小或使用sizeof()確定長度。使用char指針時未檢查空指針:使用前檢查指針是否為NULL。使用char指針指向非字符數據
