Ein Such -Plugin für Episerver CMS und Commerce
Eine Version, die .NET 6+ unterstützt wird. Wenden Sie sich an Kristian Borg für Details.
Zunächst müssen Sie Ihren Index erstellen. Gehen Sie zur Administrationsseite über die eingebettete Menüsuchmaschine -> Verwaltung und Status und klicken Sie dann auf die Schaltfläche Create indices .
Dadurch wird ein Index pro Sprache auf Ihrer Website erstellt. Wenn Sie das Commerce -Addon installiert haben, werden auch zusätzliche Indizes für Kataloginhalte erstellt.

Für jede aktive Sprache auf Ihrer Website wird ein separater Index erstellt. Wenn Sie später weitere Sprachen hinzufügen, muss dieser Vorgang wiederholt werden.
Sie können Ihr Setup programmgesteuert mit der Singleton Epinova.ElasticSearch.Core.Conventions.Indexing konfigurieren. Tun Sie dies nur einmal pro Appdomain, typischerweise in einem initialisierbaren Modul oder application_start ().
Eine Beispielkonfigurationsklasse:
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 ) ;
}
}Erläuterung der verschiedenen Optionen:
ExcludeType : Dieser Typ wird nicht indiziert. Basisklassen und Schnittstellen werden ebenfalls unterstützt. Das Gleiche kann erreicht werden, indem Ihr Typ mit ExcludeFromSearchAttribute dekoriert wird
ExcludeRoot : Dieser Knoten und seine Kinder werden nicht indiziert. Typischerweise ein Knoten-ID im Episerver-Seitenbaum.
IncludeFileType : Definiert die Erweiterung für Dateitypen, die indiziert werden sollten. Siehe auch den Knoten <files> in der Konfiguration.
ForType : Ausgangspunkt für die Indexierungsregeln eines bestimmten Typs. Tut nichts an sich, bietet aber Zugriff auf die folgenden Optionen:
IncludeField : Definiert benutzerdefinierte Eigenschaften, die indexiert werden sollen. Zum Beispiel eine Erweiterungsmethode, die externe Daten holt oder komplexe Aggregationen ausführt.
EnableSuggestions : Bieten Sie autoSuggest -Daten aus diesem Typ, entweder aus allen Eigenschaften oder ausgewählten Auswahl über einen Lambda -Ausdruck.
IncludeProperty : Gleiche Wirkung wie das Dekorieren einer Eigenschaft mit [durchsuchbar]. Kann verwendet werden, wenn Sie die Quelle des Modells nicht steuern.
EnableHighlighting : Fügen Sie zusätzliche Felder hinzu, die hervorgehoben werden sollen.
StemField : definiert, dass eine Eigenschaft in der aktuellen Sprache analysiert werden sollte. Die Eigenschaften, die als MainIntro , MainBody und Description bezeichnet werden, werden immer analysiert.
Das Modul versucht, dieselben Konventionen wie Episerver zu befolgen, was bedeutet, dass alle Eigenschaften der Typ string und XhtmlString indexiert werden, sofern nicht explizit mit [Searchable(false)] dekoriert wird. Zusätzliche Eigenschaften können durch Dekorieren mit [Searchable] oder mit den oben genannten Konventionen indiziert werden. Dekorieren Sie ContentArea mit [Searchable] , um Inhalte zu indexieren.
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 ( ) ;Suchen Sie nach indizierten Wörtern, beginnend mit der Phrase:
string [ ] suggestions = service . GetSuggestions ( "baco" ) ;Mit Standardlänge automatisch (empfohlen):
SearchResult result = service
. Search < ArticlePage > ( "bacon" )
. Fuzzy ( )
. GetResults ( ) ;Mit spezifischer Länge:
SearchResult result = service
. Search < ArticlePage > ( "bacon" )
. Fuzzy ( 4 )
. GetResults ( ) ;Mit Sorgfalt, da dies keine Funktionen wie Stammming unterstützt.
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 ( ) ;Mit begrenzten Betreibern:
SearchResult result = service
. SimpleQuerystringSearch < ArticlePage > ( " " bacon melt " sandwi*" ,
defaultOperator : Operator . And ,
allowedOperators :
SimpleQuerystringOperators . Prefix |
SimpleQuerystringOperators . Phrase ) ;
)
. GetResults ( ) ;Siehe https://www.elastic.co/guide/en/elasticsearch/reference/current/query-sl--stl-query-string-query.html für syntax.
Verwenden von Eigenschaften des Typs Epinova.ElasticSearch.Core.Models.Properties.GeoPoint können Sie geo-basierte Filterung durchführen.
Beispielmodell:
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 ) ;
} Finden Sie Punkte in einer quadratischen Fläche, die auf den oberen linken und unteren rechten Ecken basiert.
var topLeft = ( 59.9277542 , 10.7190847 ) ;
var bottomRight = ( 59.8881646 , 10.7983952 ) ;
SearchResult result = service
. Get < OfficePage > ( )
. FilterGeoBoundingBox ( x => x . Location , , topLeft , bottomRight )
. GetResults ( ) ; Finden Sie Punkte innerhalb eines Kreises mit einem Mittelpunkt und dem Abstand des Radius.
var center = ( 59.9277542 , 10.7190847 ) ;
var radius = "10km" ;
SearchResult result = service
. Get < OfficePage > ( )
. FilterGeoDistance ( x => x . Location , radius , center )
. GetResults ( ) ; Finden Sie Punkte in einem Polygon mit willkürlicher Anzahl von Punkten. Die Polygonpunkte können zum Beispiel die Umrisse einer Stadt, eines Landes oder anderer Arten von Gebieten sein.
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 ( ) ;Suchen Sie Inhalte ähnlich wie die bereitgestellte Dokument-ID
SearchResult result = service
. MoreLikeThis ( "42" )
. GetResults ( ) ;Handel:
SearchResult result = service
. MoreLikeThis ( "123__CatalogContent" )
. GetResults ( ) ;Optionale Parameter:
minimumTermFrequency Die minimale Laufzeitfrequenz, unter der die Begriffe vom Eingabedokument ignoriert werden. Standardmäßig 1.
maxQueryTerms Die maximale Anzahl von Abfragestellen, die ausgewählt werden. Die Erhöhung dieses Wertes ergibt eine größere Genauigkeit auf Kosten der Abfrageausführungsgeschwindigkeit. Standardeinstellung auf 25.
minimumDocFrequency Die Mindestfrequenz der Dokument, unter der die Begriffe vom Eingabedokument ignoriert werden. Standardeinstellung auf 3.
minimumWordLength Die Mindestwortlänge, unter der die Begriffe ignoriert werden. Standardeinstellung auf 3.
Gadget:

Wenn Sie einen globalen Typ nicht ausschließen möchten, können Sie ihn nur im Zusammenhang mit einer Abfrage tun:
SearchResult result = service
. Search < ArticlePage > ( "bacon" )
. Exclude < SaladPage > ( )
. GetResults ( ) ; Einen Knoten zur Abfragezeit ausschließen:
SearchResult result = service
. Search < ArticlePage > ( "bacon" )
. Exclude ( 42 )
. Exclude ( contentInstance )
. Exclude ( contentReference )
. GetResults ( ) ; Die Abfrage verwendet CurrentCulture als Standard. Dies kann überschrieben werden:
SearchResult result = service
. Search < ArticlePage > ( "bacon" )
. Language ( CultureInfo . GetCultureInfo ( "en" ) )
. GetResults ( ) ; Verwenden Sie die Methoden From() und Size() für die Pagination oder die Aliase Skip() und Take() :
SearchResult result = service
. Search < CoursePage > ( "foo" )
. From ( 10 )
. Size ( 20 )
. GetResults ( ) ; var query = service
. Search < CoursePage > ( "foo" )
. FacetsFor ( x => x . DepartmentID ) ; Facetten werden aus den derzeit angewandten Filtern und nicht aus dem gesamten Ergebnis erstellt.
var query = service
. Search < CoursePage > ( "foo" )
. FacetsFor ( x => x . DepartmentID , usePostFilter : false ) ; Ein Wert:
string selectedFilter = Request . Querstring [ "filter" ] ;
query = query . Filter ( p => p . DepartmentID , selectedFilter ) ;Ein Wert nach Erweiterungsmethode:
string selectedFilter = Request . Querstring [ "filter" ] ;
query = query . Filter ( p => p . GetDepartmentID ( ) , selectedFilter ) ;Mehrere Werte:
string [ ] selectedFilters = Request . Querstring [ "filters" ] ;
query = query . Filter ( p => p . DepartmentID , selectedFilters ) ;Verwenden und Bediener, um auf allen Filtern zu filtern:
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
}
} Mehrere Filter können zusammengefasst werden, um komplexere Abfragen zu bilden.
Im folgenden Beispiel muss das Folgende treu sein, um eine Übereinstimmung zu geben:
Sizes sind entweder "xs" oder "xl"
ProductCategory ist "pants"
Brand ist entweder "levis" oder "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" } )
) ; Um bestimmte Werte wegzufiltern , verwenden Sie FilterMustNot
var query = service
. Search < PageData > ( "foo" )
. FilterMustNot ( x => x . Title , "bar" ) ; Verwenden Sie FilterByACL , um auf dem aktuellen Benutzer -ACL zu filtern
var query = service
. Search < PageData > ( "foo" )
. FilterByACL ( ) ; EPiServer.Security.PrincipalInfo.Current wird standardmäßig verwendet, aber bei Bedarf kann ein benutzerdefiniertes PrincipalInfo geliefert werden.
Um innerhalb eines bestimmten Wertebereichs zu suchen, verwenden Sie die Range .
Unterstützte Typen sind DateTime , double , decimal und long (einschließlich implizite Konvertierung von int , byte usw.)
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 ( ) ;Das weniger als das Argument ist optional.
SearchResult result = service
. Search ( "bacon" )
. Range ( x => x . MyNumber , 10 ) // Returns anything above 10
. GetResults ( ) ; Um in einem anderen Intervall nach einem Intervall zu suchen, muss Ihre Eigenschaft vom Typ Epinova.ElasticSearch.Core.Models.Properties.IntegerRange sein.
Derzeit ist int der einzige unterstützte Typ.
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);
}
Wenn eine Eigenschaft vom Typ IDictionary<string, object> und markiert [Searchable] ist, wird sie in Elasticsearch als object indiziert.
Dies ist nützlich in Szenarien, in denen Sie dynamische Schlüsselwertdaten haben, die wie aus PIM-Systemen indiziert werden müssen.
Standard -Immobilienansatz:
public class ProductPage
{
[Searchable]
public IDictionary<string, object> Metadata { get; set; }
}
Die Daten selbst werden nicht zurückgegeben, aber Sie können sie abfragen und Facetten erstellen:
SearchResult result = service
. Search < ProductPage > ( "bacon" )
. InField ( x => x . Metadata + ".SomeKey" )
. FacetsFor ( x => x . Metadata + ".SomeKey" )
. GetResults ( ) ;Benutzerdefinierte Eigenschaften:
public static class SearchConfig
{
public static void Init ( )
{
Epinova . ElasticSearch . Core . Conventions . Indexing . Instance
. ForType < ProductPage > ( ) . IncludeField ( "Metadata" , x => x . GetPimDataDictionary ( ) ) ;
}
}Dieser Ansatz gibt die Daten zurück:
SearchResult result = service
. Search < ProductPage > ( "bacon" )
. GetResults ( ) ;
var hit = result . Hits . First ( ) ;
var dict = hit . Custom [ "Metadata" ] as IDictionary < string , object > Eigenschaften können durch Dekorieren mit dem Boost -Attribut verstärkt werden:
[ Boost ( 13 ) ]
public string Title { get ; set ; }… Oder zur Abfragezeit:
SearchResult result = service
. Search ( "bacon" )
. Boost ( x => x . MyProp , 3 )
. GetResults ( ) ;Ein Typ kann entweder einen positiven oder einen negativen Schub erhalten:
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 ( ) ;Sie können auch die Treffer abhängig von ihrem Standort im Seitenbaum steigern:
SearchResult result = service
. Search ( "bacon" )
. BoostByAncestor ( new ContentReference ( 42 ) , 2 )
. GetResults ( ) ; Datumseigenschaften können je nach Wert mit der Decay niedriger bewertet werden. Auf diese Weise können Sie neuere Artikel über ältere Werte bewerben.
SearchResult result = service
. Search ( "bacon" )
. Decay ( x => x . StartPublish , TimeSpan . FromDays ( 7 ) )
. GetResults ( ) ;Jedes Mal, wenn das Datumsintervall (2. Argument) auftritt, werden 0,5 Punkte von der Punktzahl abgezogen. Im obigen Beispiel werden 0,5 Punkte nach 7 Tagen, 1 Punkte nach 14 Tagen usw. abgezogen.
Verwenden Sie .UseBestBets() in Ihrer Abfrage, um ausgewählten Inhalten höher als normal zu bewerten.
SearchResult result = service
. Search ( "bacon" )
. UseBestBets ( )
. GetResults ( ) ;Die besten Wetten können über die eingebettete Menüsuchmaschine verwaltet werden -> Beste Wetten.

Einfache Statistiken können mit der Funktion .Track() erfasst werden. Dadurch wird die Häufigkeit nachverfolgt, mit der ein Begriff abgefragt wird und ob er alle Treffer zurückgegeben hat.
SearchResult result = service
. Search ( "bacon" )
. Track ( )
. GetResults ( ) ; 
Hinweis: Wenn Ihre Verbindungszeichenfolge nicht als EPiServerDB bezeichnet wird, müssen Sie ihren Namen in der trackingConnectionStringName -Konfiguration angeben
Das Stamm wird standardmäßig auf alle Eigenschaften des Typs XhtmlString oder den namens MainIntro oder MainBody angewendet.
Die Sprache basiert auf der Inhaltssprache. Andere Eigenschaften der Typ string können durch Dekorieren mit dem Stem -Attribut: Dekorieren:
[ Stem ]
public string Title { get ; set ; } Verwenden Sie die Get -Funktion, um die Inhalte eines bestimmten Typs ohne Bewertung oder Analyse aufzulisten. Dies kann in Verbindung mit SortBy für einfache Listings verwendet werden.
SearchResult result = service
. StartFrom ( somePageLink )
. Get < ArticlePage > ( )
. GetResults ( ) ; Die Sortierung erfolgt normalerweise von Elasticsearch basierend auf der Punktzahl jedes Spiels. Manuelles Sortieren sollte nur in Szenarien verwendet werden, in denen das Bewertung nicht relevant ist, z. B. bei der Verwendung der zuvor erwähnten Get -Funktion.
SearchResult result = service
. Get < ArticlePage > ( )
. SortBy ( p => p . StartPublish )
. ThenBy ( p => p . Foo )
. ThenBy ( p => p . Bar )
. GetResults ( ) ; Bei der Sortierung eines Geopoint gibt es noch ein obligatorisches Argument; compareTo . Die Elemente werden mit diesen Koordinaten verglichen, und die resultierenden Entfernungen werden als Sortierwerte verwendet.
Für die absolute Kontrolle können Sie ein Skript verwenden, um Dokumente zu sortieren. Beachten Sie, dass dies die Leistung beeinflussen kann.
Beispielsortierung basierend auf einem bestimmten Zeitstempel:
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 ( ) ;Siehe https://www.elastic.co/guide/en/elasticsearch/painless/current/index.html für Skriptsyntax.
Ein Schindelfilter ist enthalten, der bei der Suche nach falsch geschriebenen Wörtern ähnliche Wörter vorschlagen kann.
Alle gefundenen Vorschläge werden in das DidYouMean -Eigentum des Suchergebnisses aufgenommen:
SearchResult result = service
. Search ( "alloi" )
. GetResults ( ) ;
string [ ] didYouMean = result . DidYouMean ; // [ "alloy", "all" ] Alle Eigenschaften, die als Quelle für Vorschläge fungieren sollten, müssen mit [DidYouMeanSource] gekennzeichnet sein.
public class StandardPage : SitePageData
{
[ DidYouMeanSource ]
public virtual XhtmlString MainBody { get ; set ; }
} Die von GetResults() zurückgegebenen Ergebnisse haben keine Kenntnisse über Episerver. Verwenden Sie die Funktion GetContentResults() in einem Episerver -Kontext.
Dadurch wird die Filter FilterAccess , FilterPublished und FilterTemplate automatisch angewendet.
IEnumerable < IContent > content = service
. Search < CoursePage > ( text )
. GetContentResults ( ) ; Wenn Sie bei der Suche im Bearbeitungsmodus einen der mitgelieferten Anbieter verwenden möchten, gehen Sie zu CMS -> Admin -> Konfiguration -> Tooleinstellungen -> Suchkonfiguration.
Ticken Sie die Anbieter und ziehen Sie sie nach oben auf der Liste.
Synonyme können über die Menüsuchmaschine -> Synonyme verabreicht werden.
Inhalte werden automatisch neu integriert, wenn gemeinsame Vorgänge wie Veröffentlichung, Verschieben und Löschen durchgeführt werden.
Führen Sie die geplante Aufgabe «Elasticsearch: Index CMS -Inhalt» aus, um eine erste Indexierung aller Inhalte durchzuführen »
Das erneute Indexing kann auch über die Tools-Menu manuell auf individuellen Inhalten ausgelöst werden:

… Oder über das Kontextmenü im Seitenbaum:

Die von GetResults() zurückgegebenen Ergebnisse haben keine Kenntnisse über Episerver. Verwenden Sie die Funktion GetCatalogResults() in einem Episerver -Handelskontext. Dadurch wird automatisch den richtigen Index ausgewählt und die Filter FilterAccess , FilterPublished und FilterTemplate angewendet.
IEnumerable < ProductContent > content = service
. Search < ProductContent > ( text )
. GetCatalogResults ( ) ; Inhalte werden automatisch neu integriert, wenn gemeinsame Vorgänge wie Veröffentlichung, Verschieben und Löschen durchgeführt werden.
Um eine erste Indexierung aller Inhalte durchzuführen, führen Sie die geplante Aufgabe aus «Elasticsearch: Index Commerce Inhalt»
Sie können über die Menüsuchmaschine -Administration und Status zwischen den Normalen und Tri -Gram -Tokens (hartcodiert zu min = 3, max = 3, Token = Ziffern, Zeichen, pro elastische Empfehlungen) wechseln.
Verwenden Sie die Funktion Highlight() um einen Auszug von 150 Zeichen zu erhalten, von dem die Übereinstimmung im Text aufgetreten ist.
SearchResult result = service
. Search ( "bacon" )
. Highlight ( )
. GetContentResults ( ) ; Das Hervorheben ist standardmäßig in den Eigenschaften mit dem Namen MainIntro , MainBody , Attachment und Description aktiviert.
Standardmarker ist <mark>
Sie können dieses Verhalten mit den folgenden Konfigurationsoptionen anpassen:
Indexing . Instance . ForType < ArticlePage > ( ) . EnableHighlighting ( x => x . MyField ) ;
Indexing . Instance . SetHighlightFragmentSize ( 42 ) ;
Indexing . Instance . SetHighlightTag ( "blink" ) ; Die Ergebnisse finden Sie in der Highlight -Eigenschaft jedes Treffers.
Verwenden Sie die Bulk , um benutzerdefinierte Inhalte zu indexieren.
Beispiel:
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 ( ) ; Wenn Sie einen benutzerdefinierten Index bevorzugen, um EG -Kollisionen zu vermeiden, muss dies bei der Indexierung und Suche geliefert werden:
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 verwendet Standard HttpClient , um ElasticSearch aufzurufen. Manchmal ist es Neccassary, Nachrichten anders zu verarbeiten. Zum Beispiel die Anfrage für Cloud -Dienste unterschreiben.
Wenn Sie mehrere httpMessageHandlers wünschen, empfehlen wir, diese vor dem Einstellen zu verkleiden.
Zum Beispiel:
MessageHandler . Instance . SetMessageHandler ( new AWSHandler ( ) ) ; GetCustomResults Returns Returns stark getippte Objekte im Gegensatz zu GetContentResults , was nur IDs zurückgibt.
Benutzerdefinierte Objekte benötigen keine Id -Eigenschaft (oder ein entsprechendes Argument in der BulkOperation CTOR). Dies wird jedoch empfohlen, wenn Sie die Kontrolle über Versioning und Updates/Löschungen wünschen.