2016-04-06 6 views
0

私はExamを初めて使用したのでここで何かが分からない場合は謝罪しますが、現在jQueryオートコンプリートコールをUmbracoで検索を調べる。私は属性フィールド( "nodeName")とユーザーフィールド( "itemNumber")の両方で検索用語(jquery.autocompleteを介して提供される)を検索するために調べる必要があります。検索は、私がExamineIndex.configファイルで作成し、そのように設定されたカスタムIndexSetを使用しています。Umbraco - カスタムIndexSetのIndexUserFieldsを検索しないで調べてください

<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> 

私もIndexProviderとSearchProviderは両方に接続されていExamineSettings.configファイルに設定していますこのIndexSet

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

そして、ここで私は「リポジトリ検索方法です。

<!-- 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"/> 

jQueryのオートコンプリートコールは、リクエストを処理し、実際に調べ検索を実行するために、検索リポジトリを使用して、コントローラにルーティングされています問題があるm。クエリでは、私の目標は、IndexSetで指定したノードの "nodeName"フィールドと "itemNumber"フィールドの両方で検索用語の検索を行うことです。しかし、現在、は「nodeName」フィールドのみを検索し、「itemNumber」フィールドはすべて無視されますが、は無視されます。

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(); 
    } 

すべての援助がありがとうございます。前もって感謝します!


EDIT

何らかの理由で、itemNumberフィールドはマッチをトリガしている、ように見えますが、クエリは完全一致の場合のみ。たとえば、商品番号の例がM100.50-000-AEである場合、私の検索クエリが「M100.50-000-AE」であり、それは "M100.50-000-A"でさえありません。だからどのように私はそれを持っているクエリで、ノード名は "含まれている"方法を使用して検索されていますが、itemNumberは完全一致でのみ検索されています。

答えて

0

まず最初に、カスタムインデックスを確認してフィールドがそこにあることを確認します。これを行うには、開発者セクションに移動し、[管理の管理]タブをクリックします。インデクサーのリストからインデックスを選択し、「ユーザーフィールド」を選択し、カスタムフィールドが表示されていることを確認します。

次に、検索者をクリックし、そのフィールドが設定されているページを検索しようとすると、検索結果のフィールドが表示されるはずです。

インデックスが表示されない場合は、インデックス自体に問題があります。そうでなければ、コードに問題はありますが、コードは正常です。検索用語はitemNumberフィールドに一致する必要がありますか?

+0

私は[検査管理]タブに入り、そこにユーザーフィールドが表示されています。私が表示しようとしている例の項目番号は "MSA2.7S-000-DM"です。サーチャーと私自身のコードを使用して、何らかの理由でitemNumberユーザーフィールドが正確に一致する場合にのみ動作することがわかりました。たとえば、「MSA2.7S-000-DM」を検索すると機能しますが、「MSA2.7S-000」は機能しません。これは、クエリ自体に何か問題があると私に言います。 – Amrask529

+0

部分一致が必要な場合は、ワイルドカードを使用するようにクエリに指示する必要があります。 MultipleCharacterWildcard()というsearchTerm変数に適用できる拡張メソッドがあります。したがって部分一致を得るには、コード内のsearchTermをsearchTermに置き換えます。MultipleCharacterWildcard(); UmbracoExamine.SearchCriteria.LuceneSearchExtensionsにusingステートメントを追加する必要があります。 – Tim

+0

'searchTerm.MultipleCharactersWildcard()'は、1つのフィールドだけが再生されているときに目的の動作を与えましたが、.Or()メソッドでフィールドをチェーンしたときには動作しませんでした。各searchTermパラメーターに.MultipleCharactersWildcardを呼び出した場合でもこれは、検索用語をオーバーロードされたSearchメソッドに渡すだけで、目的の動作が得られたように見えますが、これとクエリの構築の間にどのような機能的な違いがあるのか​​はわかりません: 'Searcher.Search(searchTerm、true)'。途中で助けてくれてありがとう。私は議決権を行使するのに十分な担当者がいません。 – Amrask529

関連する問題