2016-04-06 3 views
0

Entschuldigung im Voraus, wenn ich etwas offensichtliches hier vermisse, da dies das erste Mal ist, das ich Examine verwendet habe, aber ich versuche derzeit, einen jQuery-Autocomplete-Aufruf an ein Suche in Umbraco. Ich muss prüfen, um nach einem Suchbegriff zu suchen (über jquery.autocomplete bereitgestellt), sowohl in einem Attributfeld ("nodeName") als auch in einem Benutzerfeld ("itemNumber"). Die Suche verwendet eine benutzerdefinierte IndexSet, die ich in der ExamineIndex.config Datei erstellt und ist wie so ein:Umbraco - Untersuchen Sie nicht IndexUserFields in benutzerdefiniertem IndexSet

<IndexSet SetName="ProductQuickSearchIndexSet" IndexPath="~/App_Data/TEMP/ExamineIndexes/{machinename}/ProductQuickSearchIndex/"> 
    <IndexAttributeFields> 
    <add Name="id" /> 
    <add Name="nodeName"/> 
    <add Name="nodeTypeAlias" /> 
    </IndexAttributeFields> 
    <IndexUserFields> 
    <add Name="itemNumber"/> 
    </IndexUserFields> 
    <IncludeNodeTypes> 
    <add Name="Product" /> 
    <add Name="Item" /> 
    </IncludeNodeTypes> 
</IndexSet> 

Ich habe auch eine IndexProvider und eine SearchProvider in der ExamineSettings.config Datei einrichten, die beide gebunden sind dieses IndexSet.

<!-- IndexProvider --> 
<add name="ProductQuickSearchIndexer" type="UmbracoExamine.UmbracoContentIndexer, UmbracoExamine" 
     supportUnpublished="false" 
     supportProtected="true" 
     analyzer="Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net" 
     indexSet="ProductQuickSearchIndexSet"/> 

<!-- Search Provider --> 
<add name="ProductQuickSearcher" type="UmbracoExamine.UmbracoExamineSearcher, UmbracoExamine" 
analyzer="Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net" indexSet="ProductQuickSearchIndexSet"/> 

Der Aufruf jQuery Autocomplete an eine Steuerung geleitet wird, der die Anforderung und verwendet eine Such Repository Untersuchen Suche tatsächlich ausführen Griffe:

public JsonResult ProductQuickSearch(string term) 
    { 
     var searchResults = searchRepository.ProductQuickSearch(term); 
     // Process results, send back through JSON 
    } 

Und hier ist die Suche Repository-Methode, die ich Ich habe Probleme mit. In der Abfrage besteht mein Ziel darin, die Suche nach dem Suchbegriff sowohl im Feld "nodeName" als auch im Feld "itemNumber" der Knoten zu suchen, die ich im IndexSet angegeben habe. Derzeit wird jedoch nur das Feld "nodeName" durchsucht und das Feld "itemNumber" wird ignoriert.

public List<SearchResult> ProductQuickSearch(string searchTerm) 
    { 
     var Searcher = ExamineManager.Instance.SearchProviderCollection["ProductQuickSearcher"]; 
     var searchCriteria = Searcher.CreateSearchCriteria(Examine.SearchCriteria.BooleanOperation.Or); 
     var query = searchCriteria.Field("nodeName", searchTerm).Or().Field("itemNumber", searchTerm).Compile(); 
     return Searcher.Search(query).OrderByDescending(x => x.Score).ToList(); 
    } 

Alle und alle Hilfe wird geschätzt. Danke im Voraus!


EDIT

Es sieht aus wie aus irgendeinem Grunde wird das itemNumber Feld Streichhölzer Auslösung, aber nur, wenn die Abfrage eine genaue Übereinstimmung ist. Zum Beispiel, wenn ein Beispiel für eine Artikelnummer M100.50-000-AE ist, kann ich den richtigen Artikel anzeigen lassen, aber nur, wenn meine Suchanfrage "M100.50-000-AE" ist und nicht weniger als das, nicht einmal "M100.50-000-A". Also mit der Abfrage, wie ich es habe, Knotenname wird mit einer "enthält" -Methode gesucht, aber itemNumber wird nur durch exakte Übereinstimmung gesucht.

Antwort

0

Erste Dinge zuerst, überprüfen Sie Ihren benutzerdefinierten Index, um sicherzustellen, dass das Feld dort ist. Um dies zu tun, gehen Sie in den Entwickler-Bereich und klicken Sie auf den "Examination Management" -Reiter. Wählen Sie Ihren Index aus der Liste der Indexer, wählen Sie "Benutzerfelder" und prüfen Sie, ob Ihr benutzerdefiniertes Feld aufgelistet ist.

Als nächstes klicken Sie in den Sucher, und versuchen Sie nach einer Seite suchen, die dieses Feld festgelegt haben sollte, sollten Sie in der Lage sein zu sehen, ob die Felder in den Suchergebnissen.

Wenn es nicht angezeigt wird, ist es ein Problem mit den Indizes selbst, andernfalls könnte es etwas in Ihrem Code sein, obwohl Ihr Code OK aussieht. Ist der Suchbegriff etwas, das im Feld itemNumber übereinstimmen sollte?

+0

Ich ging in die Examiner Management Registerkarte und das Benutzerfeld wird dort angezeigt. Die Beispiel-Artikelnummer, die ich zu sehen versucht habe, ist "MSA2.7S-000-DM". Mit dem Sucher und meinem eigenen Code habe ich festgestellt, dass das Benutzerfeld itemNumber aus irgendeinem Grund nur funktioniert, wenn es eine genaue Übereinstimmung gibt. Zum Beispiel, wenn ich "MSA2.7S-000-DM" suche, funktioniert es, aber nicht "MSA2.7S-000". Das führt mich zu der Annahme, dass etwas mit der Abfrage selbst nicht stimmt? – Amrask529

+0

Wenn Sie eine teilweise Übereinstimmung wünschen, müssen Sie der Abfrage die Verwendung von Platzhaltern mitteilen. Es gibt eine Erweiterungsmethode, die Sie auf die Variable searchTerm namens MultipleCharacterWildcard() anwenden können. Um also teilweise Übereinstimmungen zu erhalten, ersetzen Sie searchTerm in Ihrem Code durch searchTerm.MultipleCharacterWildcard(); Sie müssen möglicherweise eine using-Anweisung für UmbracoExamine.SearchCriteria.LuceneSearchExtensions hinzufügen. – Tim

+0

'searchTerm.MultipleCharactersWildcard()' gab mir das gewünschte Verhalten, wenn nur ein Feld im Spiel war, aber funktionierte nicht, wenn ich Felder mit der .Or() Methode verkettete; selbst wenn ich .MultipleCharactersWildcard für jeden searchTerm-Parameter aufgerufen habe. Es sieht so aus, als hätte ich einfach das Suchwort an die überladene Suchmethode übergeben, was mir das gewünschte Verhalten gegeben hat, obwohl ich nicht sicher bin, was die funktionalen Unterschiede zwischen dieser und dem Aufbau einer Abfrage sind: 'Searcher.Search (searchTerm, true)'. Danke für Ihre Hilfe übrigens. Ich habe nicht genug Rep für die Abstimmung. – Amrask529