国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何在我們的Asp.NET Core應用程序中使用ElasticSearch高級功能

開發(fā) 后端
在本文中,我向您展示了如何使用Elasticsearch對復雜的實際場景進行有效的處理,分析和搜索數(shù)據(jù)。希望我對這個話題感興趣。

[[432709]]

在上一篇文章中[1],我們討論了將ElasticSearch用作簡單的全文本搜索引擎,如何快速安裝和配置它以及如何將其集成到我們的.NET Web應用程序中。

今天,我們?nèi)匀灰陔娮由虅站W(wǎng)站中向您展示如何使用ElasticSearch的許多功能來改善搜索。

我們使用了沒有嵌套類的平面Product類來輕松管理搜索,但是這種方法有很多限制。然后,我們引入了一個新的數(shù)據(jù)模型,以便任何對象都是要建模的實體。一個文檔可以包含無限數(shù)量的相關字段和值(數(shù)組,簡單和復雜類型),并保存為JSON文檔。

我們的模型產(chǎn)品類別已變?yōu)椋?/p>

  1. public class Product 
  2.     public int Id { get; set; } 
  3.     public string Ean { get; set; } 
  4.     public string Name { get; set; } 
  5.     public string Description { get; set; } 
  6.     public Brand Brand { get; set; } 
  7.     public Category Category { get; set; } 
  8.     public Store Store { get; set; } 
  9.     public decimal Price { get; set; } 
  10.     public string Currency { get; set; } 
  11.     public int Quantity { get; set; } 
  12.     public float Rating { get; set; } 
  13.     public DateTime ReleaseDate { get; set; } 
  14.     public string Image { get; set; } 
  15.     public List<Review> Reviews { get; set; } 

其中品牌,類別,商店評論和用戶類別分別是:

  1. public class Brand 
  2.     public int Id { get; set; } 
  3.     public string Name { get; set; } 
  4.     public string Description { get; set; } 
  5.  
  6. public class Category 
  7.     public int Id { get; set; } 
  8.     public string Name { get; set; } 
  9.     public string Description { get; set; } 
  10.  
  11. public class Store 
  12.     public int Id { get; set; } 
  13.     public string Name { get; set; } 
  14.     public string Description { get; set; } 
  15.  
  16. public class Review 
  17.     public int Id { get; set; } 
  18.     public short Rating { get; set; } 
  19.     public string Description { get; set; } 
  20.     public User User { get; set; } 
  21.  
  22. public class User 
  23.     public int Id { get; set; } 
  24.     public string FirstName { get; set; } 
  25.     public string LastName { get; set; } 
  26.     public string IPAddress { get; set; } 
  27.     public GeoIp GeoIp { get; set; } 

GeoIp是NEST庫中用于地理數(shù)據(jù)的類。產(chǎn)品索引已被簡單地命名為產(chǎn)品。我們以這種方式創(chuàng)建和配置了它:

  1. client.Indices.Create(“products”, index => index 
  2.     .Map<Product>(x => x.AutoMap()) 
  3.     .Map<Brand>(x => x.AutoMap()) 
  4.     .Map<Category>(x => x.AutoMap()) 
  5.     .Map<Store>(x => x.AutoMap()) 
  6.     .Map<Review>(x => x.AutoMap()) 
  7.     .Map<User>(x => x.AutoMap() 
  8.         .Properties(props => props 
  9.             .Keyword(t => t.Name("fullname")) 
  10.             .Ip(t => t.Name(dv => dv.IPAddress)) 
  11.             .Object<GeoIp>(t => t.Name(dv => dv.GeoIp)) 
  12.         ) 
  13.     ) 

我們專門為ElasticSearch索引創(chuàng)建一個名為fullname的新屬性,用于名為fullname的User類,并定義了將要處理的地理信息。 為了使我們的產(chǎn)品能夠在索引之前進行處理,一種有用的方法是node.ingest,即進行文檔預處理的節(jié)點。接收節(jié)點攔截所有索引請求,甚至是批量索引請求,并將所有定義的轉換應用于其內(nèi)容,然后將文檔發(fā)還給索引API。

必須通過以下參數(shù)在配置文件elasticsearch.yml中。

啟用node.ingest:

  1. node.ingest: true 

在我們的示例中,我們使用相同的節(jié)點進行搜索和攝取,我們不需要編寫代碼來管理攝取節(jié)點,但是,如果我們要擁有一組專用的攝取節(jié)點,則必須配置ElasticSearch客戶如下:

  1. var pool = new StaticConnectionPool(new []  
  2.     new Uri("http://ingestnode1:9200"), 
  3.     new Uri("http://ingestnode2:9200"), 
  4.     new Uri("http://ingestnode3:9200"
  5. }); 
  6. var settings = new ConnectionSettings(pool); 
  7. var client = new ElasticClient(settings); 

為了對文檔進行預處理,需要在建立索引之前定義一個管道,該管道指定一組能夠轉換該文檔的過程。有許多默認過程可供使用。例如:GeoIP從IP地址獲取地理信息,JSON將字符串轉換為JSON對象,小寫和大寫,Drop刪除與某些參數(shù)匹配的文檔。您也可以創(chuàng)建自定義過程。我們在項目中使用的管道是:

  1. client.Ingest.PutPipeline("product-pipeline", p => p 
  2.                 .Processors(ps => ps 
  3.                     .Uppercase<Brand>(s => s 
  4.                         .Field(t => t.Name
  5.                     ) 
  6.                     .Uppercase<Category>(s => s 
  7.                         .Field(t => t.Name
  8.                     ) 
  9.                     .Set<User>(s => s.Field("fullname"
  10.                         .Value(s.Field(f => f.FirstName) + " " +  
  11.                              s.Field(f => f.LastName))) 
  12.                     .GeoIp<User>(s => s 
  13.                         .Field(i => i.IPAddress) 
  14.                         .TargetField(i => i.GeoIp) 
  15.                     ) 
  16.                 ) 
  17.             ); 

該管道處理文檔,以便:

  • Brand.Name和Category.Name將通過大寫輸入以大寫形式索引;
  • User.fullname將包含名字和姓氏(設置攝取);
  • User.IPAddress將成為地理定位的地理地址(GeoIp提取)。

管道以ElasticSearch集群狀態(tài)保存,要使用它們,您必須在索引請求中指定管道參數(shù),以便攝取節(jié)點知道必須使用哪個管道:

  1. client.Bulk(b => b 
  2.     .Index("products"
  3.     .Pipeline("product-pipeline"
  4.     .Timeout("5m")  
  5.     .Index<Person>(/*snip*/) 
  6.     .Index<Person>(/*snip*/) 
  7.     .Index<Person>(/*snip*/) 
  8.     .RequestConfiguration(rc => rc 
  9.         .RequestTimeout(TimeSpan.FromMinutes(5))  
  10.     ) 
  11. ); 

通過這種方式,我們定義了索引編制過程,以便我們可以根據(jù)需要獲取文檔清單。在使用創(chuàng)建的管道為文檔建立索引之后,我們可以通過使用瀏覽器http:// localhost:9200 / products / _search進行訪問來檢查它們。我們得到類似于以下結果:

如上一篇文章所述,搜索過程基于文檔分析。這是第一個階段的令牌化過程(將文本分成小塊,稱為令牌),另一個是規(guī)范化過程(它允許您查找與不等于搜索詞但足夠相似以至于相關的令牌的匹配項)為搜索建立索引的文本。分析儀執(zhí)行此過程。

分析儀由三個主要部分組成:

1.0個或多個字符過濾器

2.1個分詞器

3.0個或多個令牌過濾器

有一些默認的分析器可以使用,但是,為了根據(jù)我們的要求提高搜索的準確性,我們創(chuàng)建了一個自定義分析器。

定制分析器使我們能夠在分析過程中控制令牌化之前對文檔的任何更改,如何將其轉換為令牌以及如何對其進行規(guī)范化。

這是我們的自定義分析器:

  1. var an = new CustomAnalyzer(); 
  2. an.CharFilter = new List<string>(); 
  3. an.CharFilter.Add("html_strip"); 
  4. an.Tokenizer = "edgeNGram"
  5. an.Filter = new List<string>(); 
  6. an.Filter.Add("standard"); 
  7. an.Filter.Add("lowercase"); 
  8. an.Filter.Add("stop"); 
  9.  
  10. settings.Analysis.Tokenizers.Add("edgeNGram", new Nest.EdgeNGramTokenizer 
  11.     MaxGram = 15, 
  12.     MinGram = 3 
  13. }); 
  14.  
  15. settings.Analysis.Analyzers.Add("product-analyzer", an); 

我們的分析器使用標準的標記化方法,創(chuàng)建3至15個字符的小寫標記。我們可以將分析器添加到一個或多個字段的索引中,也可以將其添加為標準分析器。

  1. client.CreateIndex("products", c => c 
  2.     // Analyzer added only for the property Description of Product 
  3.     .AddMapping<Product>(e => e 
  4.         .MapFromAttributes() 
  5.         .Properties(p => p.String(s => s.Name(f => f.Description) 
  6.         .Analyzer("product-analyzer"))) 
  7.     ) 
  8.     //Analyzer added as default 
  9.         .Analysis(analysis => analysis 
  10.             .Analyzers(a => a 
  11.             .Add("default", an) 
  12.         ) 
  13.     ) 

創(chuàng)建自定義分析器時,可以使用測試API對其進行測試。即使對于默認分析儀,也可以執(zhí)行這些測試。

  1. var analyzeResponse = client.Indices.Analyze(a => a 
  2.     .Tokenizer("standard"
  3.     .Filter("lowercase""stop"
  4.     .Text("Lorem ipsum dolor sit amet, consectetur..."
  5. ); 

我們還可以使用數(shù)據(jù)聚合來提供通過搜索查詢聚合的數(shù)據(jù),它基于可以組成以獲得復雜聚合的簡單塊。聚合有不同類型,每種類型都有定義的范圍和輸出。它們可以分為:

  • 桶裝:具有關鍵和標準的容器;
  • 指標:根據(jù)一組文檔計算的指標;
  • 矩陣:在不同文檔字段上進行的一系列操作,以矩陣樣式生成數(shù)據(jù);
  • 管道:更多聚合的聚合。

在我們的案例中,我們使用匯總來獲取品牌,類別,價格范圍的產(chǎn)品數(shù)量。在以下示例中,我們找到了產(chǎn)品價格的匯總:

  1. s => s 
  2.     .Query(...) 
  3.     .Aggregations(aggs => aggs 
  4.         .Average("average_price"avg => avg.Field(p => p.Price)) 
  5.         .Max("max_price"avg => avg.Field(p => p.Price)) 
  6.         .Min("min_price"avg => avg.Field(p => p.Price)) 
  7.     ) 

另一個有用的聚合是根據(jù)品牌,商店或類別進行分組:

  1. s => s 
  2.      .Query(...) 
  3.      .Aggregations(aggs => aggs 
  4.          .ValueCount("products_for_category"avg => avg.Field(p => p.Category.Name)) 
  5.          .ValueCount("products_for_brand"avg => avg.Field(p => p.Brand.Name)) 
  6.          .ValueCount("products_for_store"avg => avg.Field(p => p.Store.Name)) 
  7.      ) 

這樣,我們可以實時獲取針對類別,品牌和商店的搜索產(chǎn)品數(shù)量。匯總數(shù)據(jù)還可以用于創(chuàng)建儀表板,甚至可以使用動態(tài)過濾器(類似于電子商務)來組織搜索,并且顯然可以用于統(tǒng)計目的。

改善您的搜索

如您所知,我們對任何搜索結果都有分數(shù)。等級是從0到1的數(shù)字,它確定搜索參數(shù)如何接近該結果。得分主要取決于三個參數(shù):搜索詞的頻率,倒排文檔的頻率和字段長度。

要從得分中排除得分過低的人,我們可以使用MinScore:

  1. s => s 
  2.      .MinScore(0.5) 
  3.      .Query(...) 

這樣,我們可以排除分數(shù)低于0.5的所有結果。建議者允許您使用與搜索文本相似的術語來搜索ElasticSearch索引。例如,完成建議器對于自動完成很有用,它會在鍵入文本時引導您獲得最佳和更相關的結果。該完成建議程序經(jīng)過優(yōu)化,可以盡快返回結果,但是它使用啟用了快速查找的結構并需要資源。

在我們的案例中,我們實現(xiàn)了基于產(chǎn)品名稱的自動完成方法,該方法將在搜索框中鍵入以下內(nèi)容時被調(diào)用:

  1. s => s 
  2.     .Query(...) 
  3.     .Suggest(su => su 
  4.         .Completion("name", cs => cs 
  5.             .Field(f => f.Name
  6.             .Fuzzy(f => f 
  7.                 .Fuzziness(Fuzziness.Auto) 
  8.             ) 
  9.             .Size(5) 
  10.         ) 
  11.     ) 

更好的搜索的另一有用方法是索引boost。當您搜索更多索引時,可以為這些索引分配一個乘數(shù),這樣一來,一個索引的結果將比另一個顯示更多。您可以將其用于商業(yè)目的,與供應商達成協(xié)議或使我們的產(chǎn)品脫穎而出。索引提升的一個示例是:

  1. s => s 
  2.     .Query(...) 
  3.     .IndicesBoost(b => b 
  4.         .Add("products-1", 1.5) 
  5.         .Add("products-2", 1) 
  6.     ) 

在此示例中,我們將乘數(shù)1.5乘以1的結果,乘以1乘以2的結果,這樣乘積1的結果將被更頻繁地顯示。改進搜索的另一種方法是通過一些參數(shù)對它們進行排序。就我們而言,我們可以:

  1. s => s 
  2.     .Query() 
  3.     .Sort(ss => ss 
  4.         .Descending(SortSpecialField.Score) 
  5.         .Descending(p => p.Price) 
  6.         .Descending(p => p.ReleaseDate) 
  7.         .Ascending(SortSpecialField.DocumentIndexOrder) 
  8.     ) 

我們將評分,價格,發(fā)布日期以及最終索引順序設置為更高的優(yōu)先級。

運行項目

我們的示例項目是一個.NET Core MVC WebApi應用程序,該應用程序提供一個搜索框和一個儀表板,其中的儀表板會根據(jù)鍵入的文本自動刷新數(shù)據(jù)。首次運行項目時,我們可以加載由Bogus插件創(chuàng)建的n個Product對象。還有其他偽造類可以為品牌,類別,商店,評論和用戶構建隨機對象。它允許您擁有一個數(shù)據(jù)庫來執(zhí)行我們的搜索。

  1. var productFaker = new Faker<Product>() 
  2.     .CustomInstantiator(f => new Product()) 
  3.         .RuleFor(p => p.Id, f => f.IndexFaker) 
  4.         .RuleFor(p => p.Ean, f => f.Commerce.Ean13()) 
  5.         .RuleFor(p => p.Name, f => f.Commerce.ProductName()) 
  6.         .RuleFor(p => p.Description, f => f.Lorem.Sentence(f.Random.Int(5, 20))) 
  7.         .RuleFor(p => p.Brand, f => f.PickRandom(brands)) 
  8.         .RuleFor(p => p.Category, f => f.PickRandom(categories)) 
  9.         .RuleFor(p => p.Store, f => f.PickRandom(stores)) 
  10.         .RuleFor(p => p.Price, f => f.Finance.Amount(1, 1000, 2)) 
  11.         .RuleFor(p => p.Currency, "€"
  12.         .RuleFor(p => p.Quantity, f => f.Random.Int(0, 1000)) 
  13.         .RuleFor(p => p.Rating, f => f.Random.Float(0, 1)) 
  14.         .RuleFor(p => p.ReleaseDate, f => f.Date.Past(2)) 
  15.         .RuleFor(p => p.Image, f => f.Image.PicsumUrl()) 
  16.         .RuleFor(p => p.Reviews, f => reviewFaker.Generate(f.Random.Int(0, 1000)) 
  17.     ) 

在頁面中間,有一個儀表板,我們在其中使用了本文介紹的過濾器,分析器和方法。在頂部的搜索框中鍵入一些文本時,將建議相關產(chǎn)品,并且儀表板內(nèi)容將根據(jù)搜索文本進行更新。

結論

在本文中,我向您展示了如何使用Elasticsearch對復雜的實際場景進行有效的處理,分析和搜索數(shù)據(jù)。希望我對這個話題感興趣。

此處[2]提供了[3]帶有本文中使用的代碼的示例項目。

References

[1] 一篇文章中: https://www.blexin.com/en-US/Article/Blog/How-to-integrate-ElasticSearch-in-ASPNET-Core-70

[2] 此處: https://github.com/enricobencivenga/ProductElasticSearchAdvanced 

[3] 了: https://github.com/enricobencivenga/ProductElasticSearchAdvanced

 

責任編輯:武曉燕 來源: DotNET技術圈
相關推薦

2009-03-30 10:34:03

ASP.NETMySQL

2021-01-04 05:44:54

框架日志

2021-03-17 09:45:31

LazyCacheWindows

2021-02-02 16:19:08

Serilog日志框架

2021-02-06 21:40:13

SignalR通訊TypeScript

2021-02-28 20:56:37

NCache緩存框架

2021-03-10 09:40:43

LamarASP容器

2021-01-07 07:39:07

工具接口 Swagger

2021-01-28 22:39:35

LoggerMessa開源框架

2021-03-03 22:37:16

MediatR中介者模式

2021-01-31 22:56:50

FromServiceASP

2021-02-03 13:35:25

ASPweb程序

2017-04-21 12:03:46

MacASP.NET Cor程序

2021-02-07 17:29:04

監(jiān)視文件接口

2021-11-01 14:52:38

ElasticSear索引SQL

2021-06-22 16:59:56

微軟.NETC# 軟件開發(fā)

2021-04-12 07:03:10

輕量級模塊化框架

2021-01-26 14:57:00

中間件應用模塊化

2013-03-25 10:38:24

ASP.NETHttpModule

2012-03-07 09:08:00

HTML 5
點贊
收藏

51CTO技術棧公眾號

亚洲妇熟xxxx妇色黄| 日韩一区亚洲二区| 一区二区三区日韩| 五月天色一区| jizz久久精品永久免费| 精品国产亚洲在线| 在线观看av网站永久| 久久久99精品免费观看| 一本一道久久a久久精品综合| 欧美限制电影| 欧美成人在线免费视频| 久草在线中文最新视频| 欧美性猛片aaaaaaa做受| 美女无遮挡网站| 国产成a人亚洲精品| 青青成人在线| 午夜亚洲福利| 国产精品久久久久久久久男| 韩国三级大全久久网站| 亚洲免费福利视频| 调教一区二区| 777奇米四色成人影色区| 日韩av免费观影| 亚洲一区二区不卡免费| 自拍偷拍一区二区三区四区| 91麻豆文化传媒在线观看| 米仓穗香在线观看| 另类小说一区二区三区| 欧美中日韩免费视频| 亚洲精品婷婷| 久久99影院| 亚洲欧洲午夜| 九九九九九精品| 国产情侣一区| 欧美国产一二三区| 国产精品久久久久蜜臀| 国产精品国产三级国产aⅴ9色 | 久久综合久久久久| 麻豆成人免费电影| 亚洲精品中文综合第一页| 老司机精品久久| 日产精品久久久一区二区| 中文亚洲免费| 日韩午夜视频在线观看| 免费观看久久久4p| 四虎影视永久免费在线观看一区二区三区| 99人久久精品视频最新地址| 91蜜桃网站免费观看| 欧美日韩影院| 蜜桃网站成人| 另类中文字幕网| 久久成人福利视频| 国产亚洲美州欧州综合国| 91蝌蚪视频在线观看| 中文字幕亚洲在| 最新亚洲伊人网| 欧美日韩中文精品| 高清电影在线免费观看| 亚洲色图50p| 经典三级久久| 国产精品视频久| 午夜在线a亚洲v天堂网2018| 在线综合视频网站| 91丨porny丨户外露出| a优女a优女片| 欧美视频免费在线观看| 91涩漫在线观看| 日韩电影中文字幕在线观看| 精品69视频一区二区三区| 欧美精品在线免费播放| 欧美色蜜桃97| 日韩高清三级| 99精品一区二区三区| heyzo在线观看| 欧美日韩在线直播| 亚洲成人不卡| 国产成人自拍视频在线观看| 99热精品在线| 免费一级特黄毛片| 亚洲素人一区二区| 精品国产白色丝袜高跟鞋| 中文一区二区视频| 国产香蕉97碰碰久久人人| av免费在线观| 久热精品在线视频| 四季av在线一区二区三区| 久久综合久久综合这里只有精品| 精品一区二区三区香蕉蜜桃| xx欧美撒尿嘘撒尿xx| 欧美老人xxxx18| 只有精品亚洲| 肥熟一91porny丨九色丨| 国产一区二区0| 狠狠干在线视频| 精品在线欧美视频| 欧美三级伦理在线| 黄色一级视频播放| 精品电影在线观看| 亚洲我射av| 精品久久中出| 亚洲天堂精品在线观看| av在线不卡免费| 国产精品狼人色视频一区| 精品一区二区三区香蕉蜜桃 | 亚洲综合在线免费观看| 欧美人与牲禽动交com| 国产91精品不卡视频| 乱人伦精品视频在线观看| 成人满18在线观看网站免费| 亚洲国产精品一区二区三区| 色天天久久综合婷婷女18| 91黄色在线看| 欧美欧美欧美欧美首页| 欧美顶级毛片在线播放| 一本色道久久综合亚洲二区三区| 亚洲激情男女视频| 精品国产黄a∨片高清在线| 精品蜜桃一区二区三区| 亚洲免费成人av| 亚洲精品无播放器在线播放| 久久久99国产精品免费| 亚洲综合视频在线观看| 欧美大陆国产| 亚洲人成网站在线观看播放| 黑丝美女久久久| 天堂成人娱乐在线视频免费播放网站| www成人免费| 精品乱码亚洲一区二区不卡| 91精品国产视频| 成年在线播放小视频| 久久亚洲一区二区三区四区五区高| 日韩电影在线观看电影| 自拍视频在线播放| 91久久精品国产| 一区二区日韩av| 日韩精品欧美大片| 国产日产欧美视频| 色av吧综合网| 国产99久久久国产精品潘金| av在线资源| 一区二区三区精品国产| 日韩欧美色综合| 亚洲视频www| aⅴ在线视频男人的天堂| 亚洲一区二区久久久久久久| 一区二区不卡在线播放| 国产主播性色av福利精品一区| 日本网站免费在线观看| 国产一区二区日韩精品欧美精品| 精品一区二区三区的国产在线播放| av在线免费播放| 人禽交欧美网站免费| 5566中文字幕一区二区电影| 黄色国产精品| 国产精品久久麻豆| 久久青青草综合| 日韩三级免费观看| 热久久免费视频| 亚洲一二三四| 少妇人妻无码专区视频| 北条麻妃在线一区二区| 99精品国产一区二区三区不卡| 日韩制服诱惑| 欧美啪啪免费视频| 欧美人在线视频| 中文字幕一区二区三区色视频| 亚州综合一区| 色资源网站在线观看| 91成人理论电影| 制服丝袜在线91| 久久国产乱子精品免费女| 综合另类专区| 欧美精品自拍视频| 欧美日韩福利视频| 一区二区三区日本| 日本电影一区二区| 国产三区四区在线观看| 欧美精品欧美精品系列c| 亚洲精品成人久久| 成人激情黄色小说| 一区二区三区四区高清视频| 国产小黄视频| 痴汉一区二区三区| 亚洲精品久久久久久久久久久久久| 国产成人av福利| 国产精品乱战久久久| 亚洲成人av在线影院| 欧美不卡1区2区3区| 亚洲天堂视频在线观看| 国产精品麻豆一区二区| 91精品国产91久久综合| 金瓶狂野欧美性猛交xxxx | 欧美日韩国产成人精品| a视频在线免费看| 妞干网在线视频观看| 国产精品久久77777| 日韩一区二区三区电影| 26uuu久久天堂性欧美| 欧美在线网站| www.一区|