万博体育全网站app
万博服务中心电话

万博体育全网站app

Episerver代码优化
由Ryan Duffing于10.25.21发表

app.1manbet.net关于使用Epinova索引和检索自定义字段的教程。Elasticsearch

对你的用户来说,在网站上搜索是一个重要且完整的功能。在电子商务网站拥有搜索功能甚至是更重要的,因为你想推动你的客户找到产品,以实现销售。

优化(以前称为Episerver)网站,主要的搜索提供商是优化搜索和导航(又名Episerver找到)。这个产品可能非常昂贵,而且对于一些Diagram的客户来说,不是一个选择。万博app网页版登录幸运的是,有一个很好的开源替代方案Epinova被称为Epinova。Elasticsearch

注意:这篇文章并没有详细介绍如何设置Epinova.ElasticSearch。配置Epinova。Elasticsearchin your solution please read the设置的自述GitHub。

Epinova。Elasticsearch提供了许多与优化搜索和导航相同的功能。其中一些功能包括:

  • 输入搜索
  • 方面
  • 过滤
  • 最好的赌注
  • 同义词
  • 商务支持
  • 提高

在GitHub repo下可以找到完整的特性集特性

我注意到一些值得注意的功能是:

  • 缓存
  • 一个请求中的多个查询
  • 预测
  • 搜索多种类型

在我看来,关于Epinova最好的事情之一。Elasticsearchis the ability to include custom fields for objects in your Elasticsearch index. These are custom fields you can set up against Epinova.Elasticsearch’s client conventions, and when an object of the type you’ve specified is indexed, the indexing engine will call that field for the data.

当您拥有跨多个系统的实体数据时,这可能特别有用。在我们的案例中,我们的一个电子商务客户端在Episerver Commerce和3理查德·道金斯政党制度。我们需要3的数据理查德·道金斯用于搜索的政党系统,但不希望将其直接导入到Episerver Commerce数据库。解决这个问题的一个好方法是配置产品数据的自定义字段理查德·道金斯在索引每一个单独的产品时,政党系统。

有多种方法可以在索引期间包含自定义字段。我发现最有用的方法是使用扩展方法。要设置用于索引的自定义字段,标准方法是根据Epinova配置自定义字段。在初始化模块中Elasticsearch的客户端约定。

下面是在Epinova上使用扩展方法注册自定义字段的代码。Elasticsearch的客户约定:

使用Epinova.ElasticSearch.Core.Conventions;使用EPiServer.Framework;使用EPiServer.Framework.Initialization;使用Search.Extensions;使用Search.Models.Catalog;名称空间搜索。基础设施{[InitializableModule] [ModuleDependency(typeof(episerver . commercial . Initialize . initializationmodule))] public class SingleCustomFieldSearchInitialization: IInitializableModule {public void Initialize(InitializationEngine context){//搜索配置索引。实例.ForType () .IncludeField (x.ThirdPartyData ());} public void Uninitialize(InitializationEngine context) {}}}

您可以使用Epinova设置多个自定义字段。Elasticsearch一样:

使用Epinova.ElasticSearch.Core.Conventions;使用EPiServer.Framework;使用EPiServer.Framework.Initialization;使用Search.Extensions;使用Search.Models.Catalog;名称空间搜索。基础设施{[InitializableModule] [ModuleDependency(typeof(episerver . commerce . Initialize . initializationmodule))] public class multiplecustomfieldssearchininitialization: IInitializableModule {public void Initialize(InitializationEngine context){//搜索配置索引。实例.ForType()。IncludeField(x => x. thirdpartydata ()) . fortype()。IncludeField(x => x. anothercustomfield ()) . fortype()。IncludeField (x = > x.YetAnotherCustomField ());} public void Uninitialize(InitializationEngine context) {}}}

扩展方法如何检索数据并不重要,但为了这篇文章的目的,这里是自定义字段的扩展方法代码:

使用System.Collections;使用System.Collections.Generic;使用Epinova.ElasticSearch.Core.Contracts;使用EPiServer.ServiceLocation;使用Search.Extensions;使用Search.Models.Catalog;名称空间搜索。Services {[serviceconconfiguration (typeof(IProductItemSearchService), Lifecycle = serviceinstancesscope . singleton)] public static class ProductItemDataSearchExtensions {private static IThirdPartyDataRepository _dataRepository;public static IEnumerable ThirdPartyData(this ProductItemData产品){if (_dataRepository == null) {_dataRepository = ServiceLocator.Current.GetInstance();} return _dataRepository.GetMoreData(product.Code) ?? Enumerable.Empty(); } } }

在你管理Epinova之后。Elasticsearch’s scheduled jobs for indexing, the custom data should be sitting alongside your objects in the index. You can verify this by logging into the Optimizely CMS backend and navigating to Search Engine搜索索引。使用Epinova提供的内置界面。Elasticsearch,you can query for data against the type you added custom fields to.

对于本文的示例,自定义字段ThirdPartyData应该显示索引中所有类型为ProductItemData的对象。自定义字段显示为您从索引中检索的类型的JSON对象的属性。下面是ProductItemData的JSON截图,显示自定义字段ThirdPartyData(显示为直接跟在Types属性后面的属性)。

json-elasticsearch

在Elasticsearch索引中包含自定义字段之后,可以对其进行搜索和/或过滤,并从索引中检索它。针对自定义字段进行搜索和/或过滤与针对对象的具体属性进行搜索和/或过滤类似,但您使用的是针对自定义字段的扩展方法。

下面是如何针对定制字段(Epinova)进行特定搜索的示例。Elasticsearchshould automatically search against this field by default, but this is an example of how to只有搜索自定义字段):

使用Epinova.ElasticSearch.Core.Contracts;使用EPiServer.ServiceLocation;使用Search.Extensions;使用Search.Models.Catalog;名称空间搜索。服务{[serviceconconfiguration (typeof(IProductItemSearchService), Lifecycle = ServiceInstanceScope.Singleton)] public class ProductItemSearchService: IProductItemSearchService {private readonly IElasticSearchService _searchService;public ProductItemSearchService(IElasticSearchService) {_searchService = searchService;} ///  ///创建Elasticsearch查询,将返回一个产品列表///  /// 搜索项 public IElasticSearchService CreateSearchQuery(string term) {return _searchService .Search(term) .InField(x => x. thirdpartydata ());}}}

在这个例子中,我使用的是IElasticSearchService的扩展方法InField(),由epinov . elasticsearch提供。

下面是一个如何过滤自定义字段的例子:

使用Epinova.ElasticSearch.Core.Contracts;使用EPiServer.ServiceLocation;使用Search.Extensions;使用Search.Models.Catalog;名称空间搜索。服务{[serviceconconfiguration (typeof(IProductItemSearchService), Lifecycle = ServiceInstanceScope.Singleton)] public class ProductItemSearchService: IProductItemSearchService {private readonly IElasticSearchService _searchService;public ProductItemSearchService(IElasticSearchService) {_searchService = searchService;} ///  ///使用一个简单的过滤器创建Elasticsearch查询,该过滤器将返回一个产品列表。///  /// 针对 ///  public IElasticSearchService CreateSearchQuery(string term, string thirdPartyDataFilter) {return _searchService .Search(term) .Filter(x => x. thirdpartydata (), thirdPartyDataFilter);}}}

在这个例子中,我使用的是IElasticSearchService的扩展方法Filter(),由epinov . elasticsearch提供。

很多时候,除了搜索和过滤自定义字段之外,您还希望显示自定义字段。Epinova。Elasticsearch有一种从查询返回的每个结果项的字典中提取数据的方法。这是一个包,我认为可以使用一些改进,和Optimizely的搜索和导航做得很好预测

Epinova。当你告诉Elasticsearch从你构建的查询中检索结果时,它会返回以下结果:

使用System.Collections.Generic;使用来;使用Epinova.ElasticSearch.Core.Models;使用EPiServer.Commerce.Catalog.ContentTypes;命名空间Epinova.ElasticSearch.Core.EPiServer.Commerce {///  ///包含搜索查询的物化///  public sealed class CatalogSearchResult: SearchResultBase> where T:EntryContentBase {public CatalogSearchResult(SearchResult, IEnumerable> filteredHits) {Query = SearchResult .Query;了= searchResult.Took;面= searchResult.Facets;点击= filteredHits ??Enumerable.Empty < CatalogSearchHit < T > > (); TotalHits = searchResult.TotalHits; DidYouMeanSuggestions = searchResult.DidYouMeanSuggestions; } } }

在CatalogSearchResult属性Hits上有一个CatalogSearchHit的集合。类CatalogSearchHit有一个字典,其中包含为该类型和针对特定CatalogSearchHit项建立索引的自定义字段。该字典的类型是dictionary

通过调用GetContentResults()或getcatalogsults()获得结果后,可以逐个遍历结果以检索自定义字段,并将它们映射到所选类型的属性。Gist包含如何做到这一点的例子:

使用System.Collections;使用System.Collections.Generic;使用Epinova.ElasticSearch.Core.Contracts;使用Epinova.ElasticSearch.Core.EPiServer;使用Search.Models.Catalog;使用Search.Models.Search;名称空间搜索。public static class PullingCustomFields {public static IEnumerable ToSearchHits(this IEnumerable> productHits) {foreach (var productHit in productHits) {productHit. custom . ToSearchHits(this IEnumerable> productHits);TryGetValue("ThirdPartyData",输出对象ThirdPartyData);var thirdPartyDataCollection = thirdPartyData as IEnumerable;return new SearchHit {ContentLink = productHit.Content。ContentLink, ProductSku = producth . content。代码, ThirdPartyData = thirdPartyDataCollection?.Cast() ?? Enumerable.Empty(), Url = "/" + productHit.Content.SeoUri }; } } } }

关于自定义字段需要注意的一点是,有时从Epinova返回的类型。Elasticsearch不太对。indexer擅长于索引简单类型或简单类型的集合并检索它们。我发现的一个问题是,当我索引复杂类型或复杂类型的集合时;Newtonsoft。JSON在从索引中反序列化时将会阻塞。我发现的另一个问题是,有时从索引器返回的类型不正确;例如,如果我索引小数,它们返回为双精度(这更多是牛顿软件的问题)。

关于这些问题,我已经在Github上提交了一个pull request,在写这篇文章的时候,它还没有被审查:https://github.com/Epinova/Epinova.Elasticsearch/pull/134.目前,我建议只使用和索引自定义字段的基本类型、字符串、基本类型集合和字符串集合。我已经想出了一个方法,使复杂的类型从自定义字段没有问题,但这是另一个帖子,我将在以后的日期写,如果我的拉请求还没有被合并。

总的来说,我对Epinova非常满意。Elasticsearchand plan to use it more in the future when Optimizely Search & Navigation is not an option. Another open-source option is火神.我们有一些关于如何使用Vulcan的博客文章。你可以在这里找到这些博客文章:


对这篇文章有问题或评论吗?我们很高兴收到你的来信。

Baidu