程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#如何運用ES

C#如何運用ES

編輯:C#入門知識

C#如何運用ES。本站提示廣大學習愛好者:(C#如何運用ES)文章只能為提供參考,不一定能成為您想要的結果。以下是C#如何運用ES正文


Elasticsearch簡介

Elasticsearch (ES)是一個基於Apache Lucene(TM)的開源搜索引擎,無論在開源還是專有范疇,Lucene可以被以為是迄今為止最先進、功能最好的、功用最全的搜索引擎庫。 

但是,Lucene只是一個庫。想要發揚其弱小的作用,你需運用C#將其集成到你的使用中。Lucene十分復雜,你需求深化的理解檢索相關知識來了解它是如何任務的。 
Elasticsearch是運用Java編寫並運用Lucene來樹立索引並完成搜索功用,但是它的目的是經過復雜連接的RESTful API讓全文搜索變得復雜並隱藏Lucene的復雜性。 
不過,Elasticsearch不只僅是Lucene和全文搜索引擎,它還提供:

  • 散布式的實時文件存儲,每個字段都被索引並可被搜索
  • 實時剖析的散布式搜索引擎
  • 可以擴展到上百台服務器,處置PB級構造化或非構造化數據

而且,一切的這些功用被集成到一台服務器,你的使用可以經過復雜的RESTful API、各種言語的客戶端甚至命令行與之交互。上手Elasticsearch十分復雜,它提供了許多合理的缺省值,並對初學者隱藏了復雜的搜索引擎實際。它開箱即用(裝置即可運用),只需很少的學習既可在消費環境中運用。Elasticsearch在Apache 2 license下答應運用,可以收費下載、運用和修正。 
隨著知識的積聚,你可以依據不同的問題范疇定制Elasticsearch的初級特性,這一切都是可配置的,並且配置十分靈敏。

以上內容來自 [百度百科] 

關於ES詳細概念見:http://88250.b3log.org/full-text-search-elasticsearch#b3_solo_h3_0

 

運用C#操作ES

NEST是一個高層的客戶端,可以映射一切懇求和呼應對象,擁有一個強類型查詢DSL(范疇特定言語),並且可以運用.net的特性比方協變、Auto Mapping Of POCOs,NEST外部運用的仍然是Elasticsearch.Net客戶端。elasticsearch.net(NEST)客戶端提供了強類型查詢DSL,方便用戶運用,源碼下載。

一、如何裝置NEST

翻開VS的工具菜單,經過NuGet包管理器控制台,輸出以下命令裝置NEST

Install-Package NEST

裝置後援用了以下三個DLL

Elasticsearch.Net.dll(2.4.4)
Nest.dll(2.4.4)
Newtonsoft.Json.dll(9.0版本)
二、鏈接elasticsearch

你可以經過單個節點或許指定多個節點運用銜接池鏈接到Elasticsearch集群,運用銜接池要比單個節點鏈接到Elasticsearch更有優勢,比方支持負載平衡、毛病轉移等。

經過單點鏈接:

1 var node = new Uri("http://myserver:9200");
2 var settings = new ConnectionSettings(node);
3 var client = new ElasticClient(settings);

 

經過銜接池鏈接:

 1 var nodes = new Uri[]
 2 {
 3     new Uri("http://myserver1:9200"),
 4     new Uri("http://myserver2:9200"),
 5     new Uri("http://myserver3:9200")
 6 };
 7 
 8 var pool = new StaticConnectionPool(nodes);
 9 var settings = new ConnectionSettings(pool);
10 var client = new ElasticClient(settings);

 

 NEST Index

為了知道懇求需求操作哪個索引,Elasticsearch API希冀收到一個或多個索引稱號作為懇求的一局部。

一、指定索引

1、可以經過ConnectionSettings運用.DefaultIndex(),來指定默許索引。當一個懇求裡沒有指定詳細索引時,NEST將懇求默許索引。

1 var settings = new ConnectionSettings()
2     .DefaultIndex("defaultindex");

2、可以經過ConnectionSettings運用.MapDefaultTypeIndices(),來指定被映射為CLR類型的索引。

1 var settings = new ConnectionSettings()
2     .MapDefaultTypeIndices(m => m
3         .Add(typeof(Project), "projects")
4     );

 

留意:經過.MapDefaultTypeIndices()指定索引的優先級要高於經過.DefaultIndex()指定索引,並且更合適復雜對象(POCO)

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

1 var response = client.Index(student, s=>s.Index("db_test"));
2 var result = client.Search<Student>(s => s.Index("db_test"));
3 var result = client.Delete<Student>(null, s => s.Index("db_test"));
4 ……

 

留意:當理想的為懇求指定索引稱號時,這個優先級是最高的,高於以上兩種方式指定的索引。

4、一些Elasticsearch API(比方query)可以采用一個、多個索引稱號或許運用_all特殊標志發送懇求,懇求NEST上的多個或許一切節點

 1 //懇求單一節點
 2 var singleString = Nest.Indices.Index("db_studnet");
 3 var singleTyped = Nest.Indices.Index<Student>();
 4 
 5 ISearchRequest singleStringRequest = new SearchDescriptor<Student>().Index(singleString);
 6 ISearchRequest singleTypedRequest = new SearchDescriptor<Student>().Index(singleTyped);
 7 
 8 //懇求多個節點
 9 var manyStrings = Nest.Indices.Index("db_studnet", "db_other_student");
10 var manyTypes = Nest.Indices.Index<Student>().And<OtherStudent>();
11 
12 ISearchRequest manyStringRequest = new SearchDescriptor<Student>().Index(manyStrings);
13 ISearchRequest manyTypedRequest = new SearchDescriptor<Student>().Index(manyTypes);
14 
15 //懇求一切節點
16 var indicesAll = Nest.Indices.All;
17 var allIndices = Nest.Indices.AllIndices;
18 
19 ISearchRequest indicesAllRequest = new SearchDescriptor<Student>().Index(indicesAll);
20 ISearchRequest allIndicesRequest = new SearchDescriptor<Student>().Index(allIndices);

 

二、創立索引

Elasticsearch API允許你創立索引的同時對索引停止配置,例如:

1 var descriptor = new CreateIndexDescriptor("db_student")
2     .Settings(s => s.NumberOfShards(5).NumberOfReplicas(1));
3 
4 client.CreateIndex(descriptor);

 

這裡指定了該索引的分片數為5、正本數為1。

三、刪除索引

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

1 var descriptor = new DeleteIndexDescriptor("db_student").Index("db_student");
2 
3 client.DeleteIndex(descriptor)

 

這裡制定了要刪除的索引稱號“db_student”,以下為更多刪除用例:

1 //刪除指定索引所在節點下的一切索引
2 var descriptor = new DeleteIndexDescriptor("db_student").AllIndices();

 

 NEST Mapping

NEST提供了多種映射辦法,這裡引見下經過Attribute自定義映射。

一、復雜完成

1、定義業務需求的POCO,並指定需求的Attribute

 1 [ElasticsearchType(Name = "student")]
 2 public class Student
 3 {
 4     [Nest.String(Index = FieldIndexOption.NotAnalyzed)]
 5     public string Id { get; set; }
 6 
 7     [Nest.String(Analyzer = "standard")]
 8     public string Name { get; set; }
 9 
10     [Nest.String(Analyzer = "standard")]
11     public string Description { get; set; }
12 
13     public DateTime DateTime { get; set; }
14 }

 

2、接著我們經過.AutoMap()來完成映射

1 var descriptor = new CreateIndexDescriptor("db_student")
2     .Settings(s => s.NumberOfShards(5).NumberOfReplicas(1))
3     .Mappings(ms => ms
4         .Map<Student>(m => m.AutoMap())
5     );
6 
7 client.CreateIndex(descriptor);

 

留意:經過.Properties()可以重寫經過Attribute定義的映射

二、Attribute引見

1、StringAttribute

屬性名值類型描繪 Analyzer string 剖析器稱號,值包括standard、simple、whitespace、stop、keyward、pattern、language、snowball、custom等,檢查剖析器更多信息請點擊Elasticsearch Analyzers Boost double 加權值,值越大得分越高 NullValue string 拔出文檔時,假如數據為NULL時的默許值 Index FieldIndexOption 能否運用剖析器,默許運用FieldIndexOption.Analyzed,制止運用剖析器FieldIndexOption.NotAnalyzed

2、NumberAttribute

屬性名值類型描繪 type NumberType 結構函數參數,指定以後屬性的類型,NumberType.Default、Float、Double、Integer、Long、Short、Byte Boost double 加權值,值越大得分越高 NullValue double 拔出文檔時,假如數據為NULL時的默許值

3、BooleanAttribute

屬性名值類型描繪 Boost double 加權值,值越大得分越高 NullValue double 拔出文檔時,假如數據為NULL時的默許值

4、DateAttribute

屬性名值類型描繪 Boost double 加權值,值越大得分越高 NullValue string 拔出文檔時,假如數據為NULL時的默許值 Format string  

5、ObjectAttribute

屬性名值類型描繪 type string/Type 結構函數參數,指定以後屬性的類型T Dynamic DynamicMapping    NEST Search

NEST提供了支持Lambda鏈式query DLS(范疇特定言語)方式,以下是復雜完成及各個query的簡述。

一、復雜完成

1、定義SearchDescriptor,方便項目中復雜業務的完成

1 var query = new Nest.SearchDescriptor<Models.ESObject>();
2 
3 var result = client.Search<Student>(x => query)

2、檢索title和content中包括key,並且作者不等於“俏才子”的文檔

 1 query.Query(q =>
 2     q.Bool(b =>
 3         b.Must(m =>
 4             m.MultiMatch(t => t.Fields(f => f.Field(obj => obj.Title).Field(obj => obj.Content)).Query(key))
 5         )
 6         .MustNot(m =>
 7             m.QueryString(t => t.Fields(f => f.Field(obj => obj.Author)).Query("wenli"))
 8         )
 9     )
10 );
 

留意:

假如Elasticsearch運用默許分詞,Title和Content的attribute為[Nest.String(Analyzer = "standard")]

假如Elasticsearch運用的是IK分詞,Title和Content的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、過濾作者等於“歷史小河”或許等於“友誼的小船”的文檔,婚配多個作者兩頭用空格隔開

1 query.PostFilter(x => x.QueryString(t => t.Fields(f => f.Field(obj => obj.Author)).Query("wenli yswenli")));

5、過濾數量在1~100之間的文檔

1 query.PostFilter(x => x.Range(t => t.Field(obj => obj.Number).GreaterThanOrEquals(1).LessThanOrEquals(100)));

 

6、排序,依照得分倒敘陳列

1 query.Sort(x => x.Field("_score", Nest.SortOrder.Descending));

 

7、定義高亮款式及字段

1 query.Highlight(h => h
2     .PreTags("<b>")
3     .PostTags("</b>")
4     .Fields(
5         f => f.Field(obj => obj.Title),
6         f => f.Field(obj => obj.Content),
7         f => f.Field("_all")
8     )
9 );

 

8、拼裝查詢內容,整理數據,方便前段調用

 1 var list = result.Hits.Select(c => new Models.ESObject()
 2 {
 3     Id = c.Source.Id,
 4     Title = c.Highlights == null ? c.Source.Title : c.Highlights.Keys.Contains("title") ? string.Join("", c.Highlights["title"].Highlights) : c.Source.Title, //高亮顯示的內容,一條記載中呈現了幾次
 5     Content = c.Highlights == null ? c.Source.Content : c.Highlights.Keys.Contains("content") ? string.Join("", c.Highlights["content"].Highlights) : c.Source.Content, //高亮顯示的內容,一條記載中呈現了幾次
 6     Author = c.Source.Author,
 7     Number = c.Source.Number,
 8     IsDisplay = c.Source.IsDisplay,
 9     Tags = c.Source.Tags,
10     Comments = c.Source.Comments,
11     DateTime = c.Source.DateTime,
12 })

 

二、query DSL引見

待整理……
 

 elasticsearch.net Document

文檔操作包括添加/更新文檔、部分更新文檔、刪除文檔及對應的批量操作文檔辦法。

一、添加/更新文檔及批量操作

添加/更新單一文檔

1 Client.Index(student);

 

批量添加/更新文檔

1 var list = new List<Student>();
2 
3 client.IndexMany<Student>(list);

 

二、部分更新單一文檔及批量操作

部分更新單一文檔

1 client.Update<Student, object>("002", upt => upt.Doc(new { Name = "wenli" }));

 

部分更新批量文檔

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

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

foreach (var v in ids)
{
    var operation = new BulkUpdateOperation<Student, object>(v);

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

    bulkQuest.Operations.Add(operation);
}

var result = client.Bulk(bulkQuest);

 

三、刪除文檔及批量操作

刪除單一文檔

1 client.Delete<Student>("001");

 

批量刪除文檔

 1 var ids = new List<string>() { "001", "002" };
 2 
 3 var bulkQuest = new BulkRequest() { Operations = new List<IBulkOperation>() };
 4 
 5 foreach (var v in ids)
 6 {
 7     bulkQuest.Operations.Add(new BulkDeleteOperation<Student>(v));
 8 }
 9 
10 var result = client.Bulk(bulkQuest);

 

 


轉載請標明本文來源:http://www.cnblogs.com/yswenli/
更多內容歡送我的的github:https://github.com/yswenli
假如發現本文有什麼問題和任何建議,也隨時歡送交流~



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved