時(shí)間輕松學(xué)會(huì).NET Core操作ElasticSearch7的方法
在互聯(lián)網(wǎng)上,隨處可見(jiàn)的搜索框。背后所用的技術(shù)大多數(shù)就是全文檢索。
在全文檢索領(lǐng)域,常見(jiàn)的庫(kù)/組件有:Lucene、Solr、Sphinx、ElasticSearch等。
簡(jiǎn)單對(duì)比幾種全文引擎的區(qū)別
- Lucene是一個(gè)基于Java開(kāi)發(fā)的全文檢索基礎(chǔ)包,使用起來(lái)繁雜,且默認(rèn)不支持分布式檢索
- Solr是基于Lucene開(kāi)發(fā)的一個(gè)搜索工具。抽象度更高,使用更簡(jiǎn)單,且提供一個(gè)控制面板。
- ElasticSearch也是基于Lucene開(kāi)發(fā)的。同樣是高度抽象,并提供了一個(gè)非常強(qiáng)大的DSL檢索功能,可以很方便的檢索出數(shù)據(jù)。
- Solr和ES的區(qū)別主要在于:ES有強(qiáng)大的實(shí)時(shí)檢索能力而不怎么掉速,Solr創(chuàng)建索引的同時(shí),檢索速度會(huì)下降。如果不考慮實(shí)時(shí)檢索,Solr的速度更快。Solr社區(qū)更成熟。ES使用更方便更現(xiàn)代化。
- Sphinx是俄羅斯人開(kāi)發(fā)的一個(gè)全文檢索引擎,使用C++開(kāi)發(fā)。性能比Java開(kāi)發(fā)的es和solr高,但是在社區(qū)繁榮度上,比ES和solr差很多。比如中文分詞器,sphinx的coreseek插件已經(jīng)停更了。sphinx有個(gè)非常好的地方就是可以作為MySQL插件使用。
環(huán)境搭建
隨著容器化的發(fā)展,我們大部分環(huán)境都切換到Docker上了。本篇博文的環(huán)境通過(guò)Docker搭建。
ES在Docker中搭建
我使用的是ES7.4.2
docker run --name es -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "ES_JAVA_OPTS=-Xms128m -Xmx128m" -v d:/elasticsearch/es7.4.2/data:/usr/share/elasticsearch/data -v d:/elasticsearch/es7.4.2/plugins:/usr/share/elasticsearch/plugins elasticsearch:7.4.2
我這里把Docker中的es數(shù)據(jù)目錄和插件目錄映射到本機(jī),方便操作。實(shí)際線上部署也應(yīng)該映射數(shù)據(jù)目錄到宿主機(jī),防止數(shù)據(jù)丟失。
搭建Kibana可視化環(huán)境
docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.31.115:9200 -p 5601:5601 -e "I18N_LOCALE=zh-CN" -d kibana:7.4.2
運(yùn)行成功后,在Docker控制面板上,就可以看到兩個(gè)正在運(yùn)行的容器了。
在本機(jī)瀏覽器訪問(wèn) http://localhost:5601/ 即可打開(kāi)Kibana儀表盤(pán)。
ElasticSearch基本概念
用數(shù)據(jù)庫(kù)的概念來(lái)對(duì)比ES的概念
數(shù)據(jù)庫(kù) | ElasticSearch |
---|---|
database 庫(kù) | index 索引 |
table 表 | type 類(lèi)型 7.x已經(jīng)廢除 |
row 行 | document 文檔 |
column 列 | field 字段 |
chema 表結(jié)構(gòu) | mapping 映射 |
SQL | DSL |
select | GET |
update | PUT |
delete | delete |
上手ElasticSearch的DSL
ES有兩種方式操作:1.url方式,2.http請(qǐng)求中的body提交json dsl
創(chuàng)建一個(gè)索引
PUT /qingcheng
刪除一個(gè)索引
DELETE /qingcheng
創(chuàng)建mapping
PUT /qingcheng { "mappings": { "properties": { "name": { "type": "text" }, "age": { "type": "integer" }, "createtime": { "type": "date" } } } } 響應(yīng) { "acknowledged" : true, "shards_acknowledged" : true, "index" : "qingcheng" }
在ES7中已經(jīng)不支持映射mapping的時(shí)候,指定_doc名稱(chēng)了。ES會(huì)給一個(gè)默認(rèn)的_doc名稱(chēng)
新增字段
PUT /qingcheng/_mapping { "properties":{ "sex":{ "type":"integer" } } }
在ES中只能新增字段,無(wú)法修改已有字段。如果需要需改已有字段,只能重新創(chuàng)建索引,然后使用reindex遷移數(shù)據(jù)到新的索引。
查看索引
GET /qingcheng/_mapping 結(jié)果 { "qingcheng" : { "mappings" : { "properties" : { "age" : { "type" : "integer" }, "createtime" : { "type" : "date" }, "name" : { "type" : "text" }, "sex" : { "type" : "integer" } } } } }
插入以及數(shù)據(jù)
多次put同一個(gè)id到es,那就是更新了
POST /qingcheng/_doc/1 { "name":"青城", "age":30, "createtime":"2021-03-21", "sex":1 }
使用Post請(qǐng)求,在_doc的type中插入id為1的一條數(shù)據(jù)。id可以自定義格式,可以為數(shù)字以及自定義字符串
查看數(shù)據(jù)
GET /qingcheng/_doc/1
數(shù)據(jù)檢索的格式為 GET /索引名稱(chēng)/_search + json格式的body
基本搜索
GET /qingcheng/_search { "query": { "query_string": { "default_field": "name", "query": "青城" } } }
范圍搜索
GET /qingcheng/_search { "query": { "range": { "age": { "gte": 10, "lte": 50 } } } }
分頁(yè)搜索
GET /qingcheng/_search { "query": { "match": { "name": "青" } }, "from": 0, //從多少條開(kāi)始 "size": 20 //取多少條 }
排序
GET /qingcheng/_search { "sort": [ { "age": { "order": "desc" } } ] }
復(fù)雜搜索
在ES搜索中,一般會(huì)存在多個(gè)條件,類(lèi)似于sql的and or等操作。在ES中使用bool操作來(lái)連接多個(gè)條件,must 必須滿(mǎn)足,should:滿(mǎn)足最好,不滿(mǎn)足也沒(méi)關(guān)系(如果滿(mǎn)足,es的搜索評(píng)分會(huì)更高,結(jié)果更靠前)
GET /qingcheng/_search { "query": { "bool": { "must": [ { "match": { "name": "青" } }, { "range": { "age": { "gte": 10, "lte": 50 } } } ], "should": [ { "range": { "age": { "gte": 10, "lte": 50 } } } ] } } }
聚合
在ES中,聚合使用eggs來(lái)操作??煽焖偾蟪鲎畲蟆⑵骄?、等值。
GET /qingcheng/_search { "aggs": { "平均值": { "avg": { "field": "age" } } } }
配置中文分詞器
ES默認(rèn)的分詞器是中文分詞是按單個(gè)漢字分割。所以使用起來(lái)搜索結(jié)果不太準(zhǔn)確。在ES的分詞插件中,中文分詞用的比較多的是IK分詞器
github地址:https://github.com/medcl/elasticsearch-analysis-ik
下載好ES對(duì)應(yīng)版本的插件,解壓出來(lái),放到ES的插件目錄。重啟ES,即可啟用插件。
我們對(duì)比一下使用ES默認(rèn)分詞器和IK分詞器的結(jié)果
默認(rèn)分詞器
使用IK分詞器
IK分詞器支持兩種分詞模式 1. ik_smart 2.ik_max_word
ik_smart模式
ik_max_word
兩種分詞模式的區(qū)別在于分詞粒度的粗細(xì)問(wèn)題。而standard分詞直接按單個(gè)字符分割。
使用.NET Core的NEST客戶(hù)端
ES的.NET客戶(hù)端分為兩個(gè),一個(gè)是ElasticSearch.NET一個(gè)是NEST,NEST是高級(jí)的客戶(hù)端庫(kù),提供更符合.NET程序員的操作api。ElasticSearch.NET更適合喜歡寫(xiě)DSL的程序員。一般我們都使用NEST。
創(chuàng)建索引
[ElasticsearchType(RelationName = "estest")] class ESTest { [Number(NumberType.Integer, Name = "id")] public int Id { get; set; } [Text(Name = "name")] public string Name { get; set; } [Number(NumberType.Integer, Name = "age")] public int Age { get; set; } [Text(Name = "info", Analyzer = "ik_smart")] public string Info { get; set; } [Date(Name = "createtime", Format = "yyyy-MM-dd||yyyy-MM-dd HH:mm:ss")] public DateTime CreateTime { get; set; } } var node = new Uri("http://localhost:9200"); var settings = new ConnectionSettings(node); var client = new ElasticClient(settings); //創(chuàng)建索引 var resp = client.Indices.Create("test", opt => { return opt.Map<ESTest>(m => m.AutoMap()); }); Console.WriteLine("創(chuàng)建索引結(jié)果:" + resp.Acknowledged); Console.WriteLine(resp.DebugInformation);
插入數(shù)據(jù)
var model = new ESTest() { Name = "青城1", Age = 20, Info = "順其自然,不代表我們可以不努力,而是努力之后有勇氣接受成敗。", Id = 2, CreateTime = DateTime.Now }; var indexResp = client.Index(model, i => i.Index("test")); if (indexResp.IsValid) { }
檢索數(shù)據(jù)
var res = client.Search<ESTest>(a => a.Index("test") .Query(a => a.Match(m => m.Field(f => f.Info).Query("順其自然")))); foreach (var item in res.Documents) { Console.WriteLine(item.Name + " " + item.Info); }
檢索數(shù)據(jù)的寫(xiě)法基本上和DSL語(yǔ)法結(jié)構(gòu)一致。學(xué)會(huì)DSL,用C#也可以寫(xiě)出正確的查詢(xún)語(yǔ)句。
學(xué)會(huì)以上的基本操作,就可以算是對(duì)ES有一個(gè)基本的了解了。更多深入的知識(shí)點(diǎn)可以去ES官方文檔學(xué)習(xí)。
NEST庫(kù)地址:https://github.com/elastic/elasticsearch-net
官方文檔:https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/introduction.html
到此這篇關(guān)于時(shí)間輕松學(xué)會(huì).NET Core操作ElasticSearch7的方法的文章就介紹到這了,更多相關(guān).NET Core操作ElasticSearch 7內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
將DataRow轉(zhuǎn)成指定類(lèi)型的類(lèi),并返回這個(gè)類(lèi)的對(duì)象(帶值)
由于實(shí)際需要 將DataRow轉(zhuǎn)成指定類(lèi)型的類(lèi),并返回這個(gè)類(lèi)的對(duì)象(帶值) ,實(shí)現(xiàn)方法看下面的代碼。2008-04-04ASP.NET?Core使用EF查詢(xún)數(shù)據(jù)
這篇文章介紹了ASP.NET?Core使用EF查詢(xún)數(shù)據(jù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04.net 通過(guò)URL推送POST數(shù)據(jù)具體實(shí)現(xiàn)
這篇文章主要介紹了.net 通過(guò)URL推送POST數(shù)據(jù)具體實(shí)現(xiàn),有需要的朋友可以參考一下2013-12-12asp.net 簡(jiǎn)單驗(yàn)證碼驗(yàn)證實(shí)現(xiàn)代碼
網(wǎng)站開(kāi)發(fā)一般登錄注冊(cè)的時(shí)候都要用到了 所以寫(xiě)下來(lái)給大家參考參考2009-09-09asp.net core多文件分塊同時(shí)上傳組件使用詳解
這篇文章主要為大家介紹了一個(gè)可多個(gè)文件同時(shí)上傳、斷點(diǎn)續(xù)傳,并實(shí)時(shí)反饋上傳進(jìn)度的 Asp.Net core 組件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12ASP.NET?MVC5?網(wǎng)站開(kāi)發(fā)框架模型、數(shù)據(jù)存儲(chǔ)、業(yè)務(wù)邏輯(三)
上次搭建好了項(xiàng)目框架,但還是覺(jué)得不太對(duì)勁,后來(lái)才想起來(lái)沒(méi)有對(duì)開(kāi)發(fā)目標(biāo)進(jìn)行定位,這個(gè)小demo雖然不用做需求分析,但是要實(shí)現(xiàn)什么效果還得明確。后來(lái)想了一下就做個(gè)最簡(jiǎn)單的網(wǎng)站,目標(biāo)定為小公司進(jìn)行展示用的網(wǎng)站。功能有顯示用的文章功能,咨詢(xún)留言,評(píng)論等2015-09-09C#中實(shí)現(xiàn)偽靜態(tài)頁(yè)面兩種方式介紹
偽靜態(tài)技術(shù)的誕生,帶動(dòng)了于搜索引擎友好C#中實(shí)現(xiàn)偽靜態(tài)頁(yè)面有兩種方式,本文將一一詳解,感興趣的朋友可以參考下,希望本文對(duì)你學(xué)習(xí)偽靜態(tài)有所幫助2013-01-01System.Web中不存在類(lèi)型或命名空間名稱(chēng)script 找不到System.Web.Extensions.dll引用
這篇文章主要為大家詳細(xì)介紹了System.Web中不存在類(lèi)型或命名空間名稱(chēng)script,找不到System.Web.Extensions.dll引用的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04