مكون إضافي للبحث عن CMS و Commerce
نسخة تدعم .NET 6+ متاحة. اتصل بـ Kristian Borg للحصول على التفاصيل.
بادئ ذي بدء ، تحتاج إلى إنشاء الفهرس الخاص بك. انتقل إلى صفحة الإدارة عبر محرك البحث المدمج في القائمة -> الإدارة والحالة ، ثم انقر فوق الزر Create indices .
سيؤدي ذلك إلى إنشاء فهرس واحد لكل لغة على موقعك. إذا تم تثبيت Addon Commerce ، فسيتم إنشاء مؤشرات إضافية لمحتوى الكتالوج.

سيتم إنشاء فهرس منفصل لكل لغة نشطة على موقعك. إذا قمت بإضافة المزيد من اللغات لاحقًا ، فيجب تكرار هذه العملية.
يمكنك تكوين الإعداد الخاص بك برمجيا مع Singleton Epinova.ElasticSearch.Core.Conventions.Indexing . فقط قم بذلك مرة واحدة لكل AppDomain ، عادةً في وحدة نمطية قابلة للتهيئة أو Application_Start ().
فئة تكوين عينة:
public static class SearchConfig
{
public static void Init ( )
{
Epinova . ElasticSearch . Core . Conventions . Indexing . Instance
. ExcludeType < ErrorPage > ( )
. ExcludeType < StartPage > ( )
. ExcludeRoot ( 42 )
. IncludeFileType ( "pdf" )
. IncludeFileType ( "docx" )
. ForType < ArticlePage > ( ) . IncludeProperty ( x => x . Changed )
. ForType < ArticlePage > ( ) . IncludeField ( x => x . GetFoo ( ) )
. ForType < ArticlePage > ( ) . IncludeField ( "TenYearsAgo" , x => DateTime . Now . AddYears ( - 10 ) )
. ForType < ArticlePage > ( ) . EnableSuggestions ( x => x . Title )
. ForType < TagPage > ( ) . EnableSuggestions ( )
. ForType < ArticlePage > ( ) . EnableHighlighting ( x => x . MyField )
. ForType < ArticlePage > ( ) . StemField ( x => x . MyField ) ;
}
}شرح الخيارات المختلفة:
ExcludeType : لن يتم فهرسة هذا النوع. يتم دعم فصول الأساس والواجهات أيضًا. يمكن تحقيق الشيء نفسه عن طريق تزيين النوع الخاص بك مع ExcludeFromSearchAttribute
ExcludeRoot : لن يتم فهرسة هذه العقدة وأطفالها. عادةً ما يكون معرف العقدة في شجرة Episerver.
IncludeFileType : يحدد امتداد أنواع الملفات التي يجب فهرستها. راجع أيضًا عقدة <files> في التكوين.
ForType : نقطة انطلاق لقواعد الفهرسة من نوع معين. لا يفعل شيئًا في حد ذاته ، ولكنه يوفر الوصول إلى الخيارات التالية:
IncludeField : يحدد الخصائص المخصصة المراد فهرستها. على سبيل المثال ، طريقة تمديد تجلب البيانات الخارجية أو تنفذ تجميعات معقدة.
EnableSuggestions : تقديم بيانات AutoSuggest من هذا النوع ، إما من جميع الخصائص أو الخصائص المحددة عبر تعبير Lambda.
IncludeProperty : نفس التأثير مثل تزيين خاصية مع [قابلة للبحث]. يمكن استخدامها إذا لم تتحكم في مصدر النموذج.
EnableHighlighting : إضافة حقول إضافية ليتم تسليط الضوء عليها.
StemField : يحدد أنه ينبغي تحليل خاصية باللغة الحالية. سيتم دائمًا تحليل الخصائص المسمى MainIntro و MainBody Description .
تحاول الوحدة أن تتبع نفس الاتفاقيات مثل Episerver ، مما يعني أنه سيتم فهرسة جميع خصائص string النوع و XhtmlString ما لم يتم تزيينها بشكل صريح بـ [Searchable(false)] . يمكن فهرسة خصائص إضافية عن طريق تزيينها باستخدام [Searchable] أو مع الاتفاقيات أعلاه. تزيين ContentArea مع [Searchable] لفهرسة المحتويات.
SearchResult result = service
. Search ( "bacon" )
. GetResults ( ) ; SearchResult result = service
. Search < ArticlePage > ( "bacon" )
. GetResults ( ) ; SearchResult result = service
. Search < ArticlePage > ( "bacon" )
. InField ( x => x . MainIntro )
. InField ( x => x . MainBody )
. InField ( x => x . MyCustomMethod ( ) )
. GetResults ( ) ;يبحث عن الكلمات المفهرسة التي تبدأ بعبارة:
string [ ] suggestions = service . GetSuggestions ( "baco" ) ;مع الطول الافتراضي التلقائي (الموصى به):
SearchResult result = service
. Search < ArticlePage > ( "bacon" )
. Fuzzy ( )
. GetResults ( ) ;بطول محدد:
SearchResult result = service
. Search < ArticlePage > ( "bacon" )
. Fuzzy ( 4 )
. GetResults ( ) ;استخدم بعناية لأن هذا لا يدعم ميزات مثل التنقيب.
SearchResult result = service
. WildcardSearch < ArticlePage > ( "*bacon*" )
. GetResults ( ) ; SearchResult result = service
. WildcardSearch < ArticlePage > ( "me?t" )
. GetResults ( ) ; SearchResult result = service
. SimpleQuerystringSearch < ArticlePage > ( "(bacon | ham) melt -cheese" )
. GetResults ( ) ;مع مشغلي محدود:
SearchResult result = service
. SimpleQuerystringSearch < ArticlePage > ( " " bacon melt " sandwi*" ,
defaultOperator : Operator . And ,
allowedOperators :
SimpleQuerystringOperators . Prefix |
SimpleQuerystringOperators . Phrase ) ;
)
. GetResults ( ) ;راجع https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html لبناء الجملة.
باستخدام خصائص نوع Epinova.ElasticSearch.Core.Models.Properties.GeoPoint يتيح لك إجراء التصفية المستندة إلى الجغرافية.
نموذج مثال:
public class OfficePage : StandardPage
{
[ Display ]
public virtual double Lat { get ; set ; }
[ Display ]
public virtual double Lon { get ; set ; }
// Helper property, you could always roll an editor for this
public GeoPoint Location => new GeoPoint ( Lat , Lon ) ;
} ابحث عن نقاط داخل منطقة مربعة استنادًا إلى زواياها ذات اليسار العلوي والسفلي.
var topLeft = ( 59.9277542 , 10.7190847 ) ;
var bottomRight = ( 59.8881646 , 10.7983952 ) ;
SearchResult result = service
. Get < OfficePage > ( )
. FilterGeoBoundingBox ( x => x . Location , , topLeft , bottomRight )
. GetResults ( ) ; ابحث عن نقاط داخل دائرة تعطى نقطة مركزية ومسافة نصف القطر.
var center = ( 59.9277542 , 10.7190847 ) ;
var radius = "10km" ;
SearchResult result = service
. Get < OfficePage > ( )
. FilterGeoDistance ( x => x . Location , radius , center )
. GetResults ( ) ; العثور على نقاط داخل مضلع مع كمية تعسفية من النقاط. يمكن أن تكون نقاط المضلع على سبيل المثال الخطوط العريضة لمدينة أو بلد أو أنواع أخرى من المناطق.
var polygons = new [ ]
{
( 59.9702837 , 10.6149134 ) ,
( 59.9459601 , 11.0231964 ) ,
( 59.7789455 , 10.604809 )
} ;
SearchResult result = service
. Get < OfficePage > ( )
. FilterGeoPolygon ( x => x . Location , polygons )
. GetResults ( ) ;ابحث عن محتوى مشابه لمرفق المستند المقدم
SearchResult result = service
. MoreLikeThis ( "42" )
. GetResults ( ) ;تجارة:
SearchResult result = service
. MoreLikeThis ( "123__CatalogContent" )
. GetResults ( ) ;المعلمات الاختيارية:
minimumTermFrequency التردد الحد الأدنى لتردد المصطلح الذي سيتم تجاهل المصطلحات أدناه من مستند الإدخال. الإعدادات الافتراضية إلى 1.
maxQueryTerms الحد الأقصى لعدد شروط الاستعلام التي سيتم اختيارها. زيادة هذه القيمة تعطي دقة أكبر على حساب سرعة تنفيذ الاستعلام. الافتراضات إلى 25.
minimumDocFrequency التردد الحد الأدنى لتكرار المستند الذي سيتم تجاهل المصطلحات أدناه من مستند الإدخال. الافتراضات إلى 3.
minimumWordLength طول طول الكلمة الحد الأدنى الذي سيتم تجاهل المصطلحات. الافتراضات إلى 3.
أداة:

إذا كنت لا ترغب في استبعاد نوع عالمي ، يمكنك القيام بذلك فقط في سياق الاستعلام:
SearchResult result = service
. Search < ArticlePage > ( "bacon" )
. Exclude < SaladPage > ( )
. GetResults ( ) ; استبعاد عقدة في وقت الاستعلام:
SearchResult result = service
. Search < ArticlePage > ( "bacon" )
. Exclude ( 42 )
. Exclude ( contentInstance )
. Exclude ( contentReference )
. GetResults ( ) ; يستخدم الاستعلام CurrentCulture كإعداد افتراضي. يمكن تجاوز هذا:
SearchResult result = service
. Search < ArticlePage > ( "bacon" )
. Language ( CultureInfo . GetCultureInfo ( "en" ) )
. GetResults ( ) ; استخدم الطرق From() Size() للترقيم ، أو الأسماء المستعارة Skip() Take() :
SearchResult result = service
. Search < CoursePage > ( "foo" )
. From ( 10 )
. Size ( 20 )
. GetResults ( ) ; var query = service
. Search < CoursePage > ( "foo" )
. FacetsFor ( x => x . DepartmentID ) ; سيتم إنشاء جوانب من المرشحات المطبق حاليًا وليس النتيجة بأكملها.
var query = service
. Search < CoursePage > ( "foo" )
. FacetsFor ( x => x . DepartmentID , usePostFilter : false ) ; قيمة واحدة:
string selectedFilter = Request . Querstring [ "filter" ] ;
query = query . Filter ( p => p . DepartmentID , selectedFilter ) ;قيمة واحدة ، عن طريق التمديد:
string selectedFilter = Request . Querstring [ "filter" ] ;
query = query . Filter ( p => p . GetDepartmentID ( ) , selectedFilter ) ;قيم متعددة:
string [ ] selectedFilters = Request . Querstring [ "filters" ] ;
query = query . Filter ( p => p . DepartmentID , selectedFilters ) ;الاستخدام والمشغل للتصفية على جميع المرشحات:
string [ ] selectedFilters = Request . Querstring [ "filters" ] ;
query = query . Filter ( p => p . DepartmentID , selectedFilters , Operator . And ) ; SearchResult results = query . GetResults ( ) ; foreach ( FacetEntry facet in results . Facets )
{
// facet.Key = name of the property, ie. DepartmentID
// facet.Count = number of unique values for this facet
foreach ( FacetHit hit in facet . Hits )
{
// hit.Key = facet value
// hit.Count = number with this value
}
} يمكن تجميع المرشحات المتعددة لتشكيل استفسارات أكثر تعقيدًا.
في المثال التالي ، يجب أن يكون ما يلي صحيحًا لإعطاء تطابق:
Sizes إما "xs" أو "xl"
ProductCategory هو "pants"
Brand إما "levis" أو "diesel"
query = query
. FilterGroup ( group => group
. Or ( page => page . Sizes ( ) , new [ ] { "xs" , "xl" } )
. And ( page => page . ProductCategory , "pants" )
. Or ( page => page . Brand , new [ ] { "levis" , "diesel" } )
) ; لتصفية بعض القيم ، استخدم FilterMustNot
var query = service
. Search < PageData > ( "foo" )
. FilterMustNot ( x => x . Title , "bar" ) ; للتصفية على المستخدمين الحاليين ACL ، استخدم FilterByACL
var query = service
. Search < PageData > ( "foo" )
. FilterByACL ( ) ; EPiServer.Security.PrincipalInfo.Current سيتم استخدامها افتراضيًا ، ولكن يمكن توفير PrincipalInfo مخصص إذا لزم الأمر.
للبحث في نطاق معين من القيم ، استخدم وظيفة Range .
الأنواع المدعومة هي DateTime ، double ، decimal long (بما في ذلك التحويل الضمني لـ int ، byte وما إلى ذلك)
SearchResult result = service
. Search ( "bacon" )
. Range ( x => x . StartPublish , DateTime . Now . Date , DateTime . Now . Date . AddDays ( 2 ) )
. GetResults ( ) ; SearchResult result = service
. Search ( "bacon" )
. Range ( x => x . MyNumber , 10 , 20 )
. GetResults ( ) ;الحجة الأقل من هو اختياري.
SearchResult result = service
. Search ( "bacon" )
. Range ( x => x . MyNumber , 10 ) // Returns anything above 10
. GetResults ( ) ; للبحث عن فاصل زمني داخل فاصل آخر ، يجب أن تكون الممتلكات الخاصة بك من النوع Epinova.ElasticSearch.Core.Models.Properties.IntegerRange .
int هو النوع الوحيد المدعوم.
SearchResult result = service
. Search ( "bacon" )
. Range ( x => x . MyRange , 10 , 20 )
. GetResults ( ) ; public class ArticlePage : StandardPage
{
[Display]
public virtual int From { get; set; }
[Display]
public virtual int To { get; set; }
public IntegerRange MyRange => new IntegerRange(From, To);
}
إذا كانت خاصية من نوع IDictionary<string, object> و namped [Searchable] ، فسيتم فهرستها object في Elasticsearch.
يعد هذا مفيدًا في السيناريوهات التي لديك بيانات قيمة مفتاحية ديناميكية يجب فهرستها ، كما هو الحال في أنظمة PIM.
نهج الملكية القياسية:
public class ProductPage
{
[Searchable]
public IDictionary<string, object> Metadata { get; set; }
}
لن يتم إرجاع البيانات نفسها ، ولكن يمكنك الاستعلام عنها وجعل الجوانب:
SearchResult result = service
. Search < ProductPage > ( "bacon" )
. InField ( x => x . Metadata + ".SomeKey" )
. FacetsFor ( x => x . Metadata + ".SomeKey" )
. GetResults ( ) ;خصائص مخصصة:
public static class SearchConfig
{
public static void Init ( )
{
Epinova . ElasticSearch . Core . Conventions . Indexing . Instance
. ForType < ProductPage > ( ) . IncludeField ( "Metadata" , x => x . GetPimDataDictionary ( ) ) ;
}
}يعيد هذا النهج البيانات:
SearchResult result = service
. Search < ProductPage > ( "bacon" )
. GetResults ( ) ;
var hit = result . Hits . First ( ) ;
var dict = hit . Custom [ "Metadata" ] as IDictionary < string , object > يمكن تعزيز الخصائص عن طريق تزيينها بسمات Boost :
[ Boost ( 13 ) ]
public string Title { get ; set ; }... أو في وقت الاستعلام:
SearchResult result = service
. Search ( "bacon" )
. Boost ( x => x . MyProp , 3 )
. GetResults ( ) ;يمكن إعطاء نوع إما زيادة إيجابية أو سلبية:
SearchResult result = service
. Search ( "bacon" )
. Boost < ArticlePage > ( 2 )
. GetResults ( ) ; SearchResult result = service
. Search ( "bacon" )
. Boost ( typeof ( ArticlePage ) , 2 )
. GetResults ( ) ; SearchResult result = service
. Search ( "bacon" )
. Boost < ArticlePage > ( - 3 )
. GetResults ( ) ;يمكنك أيضًا زيادة الزيارات اعتمادًا على موقعها في شجرة الصفحة:
SearchResult result = service
. Search ( "bacon" )
. BoostByAncestor ( new ContentReference ( 42 ) , 2 )
. GetResults ( ) ; يمكن تسجيل خصائص التاريخ أقل اعتمادًا على قيمتها ، باستخدام وظيفة Decay . وبهذه الطريقة يمكنك الترويج لمقالات أحدث على المقالات الأكبر سناً.
SearchResult result = service
. Search ( "bacon" )
. Decay ( x => x . StartPublish , TimeSpan . FromDays ( 7 ) )
. GetResults ( ) ;في كل مرة تحدث فيها فاصل التاريخ (الوسيطة الثانية) ، سيتم طرح 0.5 نقطة من النتيجة. في المثال أعلاه ، سيتم طرح 0.5 نقطة بعد 7 أيام ، 1 نقطة بعد 14 يومًا ، وهلم جرا.
استخدم .UseBestBets() على استعلامك لتسجيل محتوى محدد أعلى من المعتاد.
SearchResult result = service
. Search ( "bacon" )
. UseBestBets ( )
. GetResults ( ) ;يمكن إعطاء أفضل الرهانات من خلال محرك بحث القائمة المدمجة -> أفضل الرهانات.

يمكن جمع إحصائيات بسيطة باستخدام وظيفة .Track() . سيتتبع هذا عدد المرات التي يتم فيها الاستعلام عن مصطلح وما إذا كان قد أعاد أي مرات.
SearchResult result = service
. Search ( "bacon" )
. Track ( )
. GetResults ( ) ; 
ملاحظة: إذا لم تتم تسمية سلسلة الاتصال الخاصة بك EPiServerDB فيجب عليك توفير اسمها في trackingConnectionStringName -Configuration راجع التثبيت
يتم تنظيم التنقيح بشكل افتراضي على جميع خصائص النوع XhtmlString ، أو تلك المسماة MainIntro أو MainBody .
تعتمد اللغة على لغة المحتوى. الخصائص الأخرى string النوع يمكن أن تنقذ عن طريق تزيينها باستخدام Stem :
[ Stem ]
public string Title { get ; set ; } لسرد محتويات نوع معين دون أي تسجيل أو تحليل ، استخدم وظيفة Get . يمكن استخدام هذا بالاقتران مع SortBy للحصول على قوائم بسيطة.
SearchResult result = service
. StartFrom ( somePageLink )
. Get < ArticlePage > ( )
. GetResults ( ) ; يتم تنفيذ الفرز عادة بواسطة Elasticsearch بناءً على درجة كل مباراة. يجب استخدام الفرز اليدوي فقط في السيناريوهات التي يكون فيها التسجيل غير ذي صلة ، على سبيل المثال عند استخدام وظيفة Get المذكورة سابقًا.
SearchResult result = service
. Get < ArticlePage > ( )
. SortBy ( p => p . StartPublish )
. ThenBy ( p => p . Foo )
. ThenBy ( p => p . Bar )
. GetResults ( ) ; عند الفرز على نقطة جغرافية ، هناك حجة إلزامية أخرى ؛ compareTo . سيتم مقارنة العناصر بهذه الإحداثيات ، وسيتم استخدام المسافات الناتجة كقيم الفرز.
للتحكم المطلق ، يمكنك استخدام برنامج نصي لفرز المستندات. لاحظ أن هذا قد يؤثر على الأداء.
مثال الفرز بناءً على طابع زمني معين:
var timestamp = new DateTimeOffset ( new DateTime ( 2019 , 1 , 1 ) ) . ToUnixTimeMilliseconds ( ) ;
var script = $ "doc['StartPublish'].date.getMillis() > { timestamp } ? 0 : 1" ;
SearchResult result = service
. Get < ArticlePage > ( )
. SortByScript ( script , true , "number" )
. GetResults ( ) ;راجع https://www.elastic.co/guide/en/elasticsearch/painless/current/index.html للحصول على بناء جملة البرمجة النصية.
يتم تضمين مرشح خشبي يمكن أن يقترح كلمات مماثلة موجودة في الفهرس عند البحث عن الكلمات التي تم إملائها.
سيتم تضمين أي اقتراحات موجودة في خاصية DidYouMean لنتيجة البحث:
SearchResult result = service
. Search ( "alloi" )
. GetResults ( ) ;
string [ ] didYouMean = result . DidYouMean ; // [ "alloy", "all" ] يجب وضع علامة على أي خصائص يجب أن تعمل كمصدر للاقتراحات مع [DidYouMeanSource] .
public class StandardPage : SitePageData
{
[ DidYouMeanSource ]
public virtual XhtmlString MainBody { get ; set ; }
} النتائج التي تم إرجاعها من قبل GetResults() ليس لديها أي معرفة بـ Episerver. استخدم وظيفة GetContentResults() في سياق Episerver.
سيؤدي ذلك تلقائيًا إلى تطبيق Filters FilterAccess و FilterPublished و FilterTemplate .
IEnumerable < IContent > content = service
. Search < CoursePage > ( text )
. GetContentResults ( ) ; إذا كنت ترغب في استخدام أي من مقدمي الخدمات المدمجة عند البحث في وضع التحرير ، انتقل إلى CMS -> admin -> config -> إعدادات الأداة -> تكوين البحث.
وضع علامة على مقدمي الخدمات واسحبهم إلى أعلى القائمة.
يمكن إعطاء المرادفات من محرك البحث في القائمة -> المرادفات.
سيتم إعادة فحص المحتوى تلقائيًا عند إجراء عمليات مشتركة مثل النشر والتحرك والحذف.
للقيام بفهرسة أولية لجميع المحتويات ، قم بتشغيل المهمة المجدولة «elasticsearch: فهرس محتوى CMS»
يمكن أيضًا تشغيل إعادة الفهرسة يدويًا على المحتوى الفردي عبر أدوات Menu:

... أو عبر قائمة السياق في شجرة الصفحة:

النتائج التي تم إرجاعها من قبل GetResults() ليس لديها أي معرفة بـ Episerver. استخدم وظيفة GetCatalogResults() في سياق تجارة Episerver. سيؤدي ذلك تلقائيًا إلى اختيار الفهرس الصحيح وتطبيق Filters FilterAccess و FilterPublished و FilterTemplate .
IEnumerable < ProductContent > content = service
. Search < ProductContent > ( text )
. GetCatalogResults ( ) ; سيتم إعادة فحص المحتوى تلقائيًا عند إجراء عمليات مشتركة مثل النشر والتحرك والحذف.
للقيام بفهرسة أولية لجميع المحتويات ، قم بتشغيل المهمة المجدولة «Elasticsearch: INDEX Commerce Content»
يمكنك التبديل بين الرمز المميز العادي والثلاثية (المتشددين إلى min = 3 ، الحد الأقصى = 3 ، الرموز = الرقم ، char ، توصيات مرنة) عبر محرك البحث في القائمة -> الإدارة والحالة.
استخدم دالة Highlight() للحصول على مقتطف من 150 حرفًا من حيث حدثت المباراة في النص.
SearchResult result = service
. Search ( "bacon" )
. Highlight ( )
. GetContentResults ( ) ; يتم تمييز التمييز بشكل افتراضي على الخصائص المسماة MainIntro و MainBody Attachment Description .
العلامة الافتراضية هي <mark>
يمكنك تخصيص هذا السلوك مع خيارات التكوين التالية:
Indexing . Instance . ForType < ArticlePage > ( ) . EnableHighlighting ( x => x . MyField ) ;
Indexing . Instance . SetHighlightFragmentSize ( 42 ) ;
Indexing . Instance . SetHighlightTag ( "blink" ) ; يمكن العثور على النتائج في خاصية Highlight على كل ضربة.
استخدم الدالة Bulk لفهرسة المحتوى المخصص.
مثال:
var obj1 = new ComplexType { StringProperty = "this is myobj 1" } ;
var obj2 = new ComplexType { StringProperty = "this is myobj 2" } ;
var obj3 = new ComplexType { StringProperty = "this is myobj 3" } ;
ICoreIndexer indexer = ServiceLocator . Current . GetInstance < ICoreIndexer > ( ) ; // Can also be injected
BulkBatchResult bulk = indexer . Bulk ( new [ ]
{
new BulkOperation ( obj1 , "no" ) ,
new BulkOperation ( obj2 , "no" ) ,
new BulkOperation ( obj3 , "no" )
} ) ;
var results = _service
. Search < ComplexType > ( "myobj" )
. InField ( x => x . StringProperty )
. GetCustomResults ( ) ; إذا كنت تفضل فهرسًا مخصصًا لتجنب إصدارات EG ، فيجب توفير ذلك عند الفهرسة والبحث:
var obj1 = new ComplexType { StringProperty = "this is myobj 1" } ;
var obj2 = new ComplexType { StringProperty = "this is myobj 2" } ;
var obj3 = new ComplexType { StringProperty = "this is myobj 3" } ;
ICoreIndexer indexer = ServiceLocator . Current . GetInstance < ICoreIndexer > ( ) ; // Can also be injected
string indexName = "my-uber-custom-name-no" ;
BulkBatchResult bulk = indexer . Bulk ( new [ ]
{
new BulkOperation ( obj1 , "no" , index : indexName ) ,
new BulkOperation ( obj2 , "no" , index : indexName ) ,
new BulkOperation ( obj3 , "no" , index : indexName )
} ) ;
var results = _service
. UseIndex ( indexName )
. Search < ComplexType > ( "myobj" )
. InField ( x => x . StringProperty )
. GetCustomResults ( ) ; يستخدم Epinova.Elasticsearch HttpClient قياسي للاتصال Elasticsearch. في بعض الأحيان يكون من المعالجة بالرسائل المرسلة بشكل مختلف. على سبيل المثال طلب التوقيع للخدمات السحابية.
إذا كنت تريد العديد من httpmessageHandlers ، فإننا نوصي بتسلسلها قبل الإعداد.
على سبيل المثال:
MessageHandler . Instance . SetMessageHandler ( new AWSHandler ( ) ) ; يعيد GetCustomResults كائنات مكتوبة بقوة بدلاً من GetContentResults ، والتي تعيد فقط معرفات.
لا تتطلب الكائنات المخصصة خاصية Id (أو وسيطة مقابلة في CTOR BulkOperation ) ، ولكن يوصى بذلك إذا كنت تريد التحكم في الإصدار والتحديثات/الحذف.