首頁  >  文章  >  後端開發  >  C#如何使用ES

C#如何使用ES

高洛峰
高洛峰原創
2017-02-08 13:32:012182瀏覽

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")

  );

注意:高於指定的優先順序索引透過.DefaultIndex()指定索引,並且更適合簡單物件(POCO)

3、另外還可以顯示的為請求指定索引名稱,例如:

var response = client.Index(student, s=>s.Index("db_test"));
var result = client.Search (s => s.Index("db_test"));
var result = client.Delete(null, s => s.Index("db_test"));

注意:當現實的為請求指定索引名稱時,這個優先權是最高的,高於以上兩種方式指定的索引。

4、一些Elasticsearch API(例如query)可以採用一個、多個索引名稱或使用_all特殊標誌發送請求,請求NEST上的多個或所有節點

//請求單一節點

var singleString = Nest .Indices.Index("db_studnet");

var singleTyped = Nest.Indices.Index();


ISearchRequest sStringRequest = 問題singleTypedRequest = new SearchDescriptor().Index(singleTyped);


//請求多個節點

var manyStrings = Nest.Indices.Index("dbstud;" = Nest.Indices.Index().And();

ISearchRequest manyStringRequest = new SearchDescriptor().Index(manyStrings); ().Index(manyTypes);


//請求所有節點

var indicesAll = Nest.Indices.All;


var allIndices = Nest.Indices.AllIndices.All;

var all1 ().Index(indicesAll);

ISearchRequest allIndicesRequest = new SearchDescriptor().Index(allIndices);


二、建立索引號進行配置,例如:

var descriptor = new CreateIndexDescriptor("db_student")

.Settings(s => s.NumberOfShards(5).NumberOfReplicas(1));

client.CreateIndex(指定了該索引的分片數為5、副本數為1。

三、刪除索引

Elasticsearch API允許你刪除索引,例如:

var descriptor = new DeleteIndexDescriptor("db_student").Index("db_student");Del cliclicliclient;了要刪除的索引名稱“db_student”,以下為更多刪除用例:

//刪除指定索引所在節點下的所有索引

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(m => m.AutoMap())

    );

client.CreateIndex(descriptor);

注意:透過.Properties()可以重寫透過Attriute或透過Attriute

1、StringAttribute

2、NumberAttribute

3、BooleanAttribute

ObjectAttribute

 NEST Search

NEST提供了支援Lambda鍊式query DLS(領域特定語言)方式,以下是簡單實作及各個query的簡述。

一、簡單實作

1、定義SearchDescriptor,方便專案中複雜業務的實作

var query = new Nest.SearchDescriptor();
var result = Search.SearchDescriptor();

var result = Search.Search query)

2、檢索title和content中包含key,且作者不等於「俏佳人」的文件

query.Query(q =>

    q.Bool(b =>

(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("")

    .Fields(

        f => f.Field(obj => obj.Title, => obj.Content),

        f => f.Field("_all")

    )

);

8、拼裝查詢內容,整理資料,方便前段

); .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,

    Number = c.Source.Number,

   IsDisplay = c.Source.Display = c. = c.Source.Tags,

    Comments = c.Source.Comments,

    DateTime = c.Source.DateTime,

})

.net Document

文件操作包含新增/更新文件、局部更新文件、刪除文件及對應的批次操作文件方法。

一、新增/更新文件及批次操作

新增/更新單一文件

Client.Index(student);

 批次新增/更新文件

var list = new List();2 3 client.IndexMany(list);

 二、局部更新單一文件及批次操作

StuDM. object>("002", upt => upt.Doc(new { Name = "wenli" }));


局部更新批次文件

var ids = new List() { "002" };


var bulkQuest = new BulkRequest() { Operations = new List() };


foreach (var v v. peration(v);

    operation.Doc = new { Name = "wenli" };


🎳

var result = client.Bulk(bulkQuest);


三、刪除文件及批次作業

刪除單一文件

client.Delete("001");


client.Delete("001"); List() { "001", "002" };


var bulkQuest = new BulkRequest() { Operations = new List() }; ids)

{

    bulkQuest.Operations.Add(new BulkDeleteOperation(v));

}

文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn