2015-07-22 1 views
1

Я пытаюсь исправить свою поисковую систему. Проблема заключается в том, что при поиске моего существующего пункта блога, он всегда говоритUmbraco Examine Поисковый запрос null значение

Did not match in any document

Что я когда-либо найти, он всегда дает мне это сообщение об ошибке.

Есть ли способ исправить это или у моего кода есть проблема?

@using Examine.LuceneEngine.SearchCriteria 
@inherits Umbraco.Web.Macros.PartialViewMacroPage 

string searchTerm = Request.QueryString["search"]; 
var searcher = ExamineManager.Instance.SearchProviderCollection["MySiteSearcher"]; 
var searchCriteria = searcher.CreateSearchCriteria(); 
var query = searchCriteria.Field("nodeName", searchTerm).Or().Field("bodyText", searchTerm).Compile(); 
var searchResults = searcher.Search(query); 

@if (searchResults.Any()){ 
    <ul class="search-results"> 
     @foreach (var result in searchResults) 
     { 
      IPublishedContent node = Umbraco.Content(result.Fields["id"]); 
      <li> 
       <a href="@umbraco.library.NiceUrl(result.Id)"> 
        @if (result.Fields.ContainsKey("nodeName")) { 
         @node.GetPropertyValue("blogItemTitle") 
        } 
       </a> 
       <p>@result.Fields["blogbodyText"]</p> 
      </li> 
     } 
    </ul> 
} else { 
    <p class="error-result"> 
     Your search 
     @if (!String.IsNullOrEmpty(searchTerm)) 
     { 
      <strong><text>'@searchTerm'</text></strong> 
     } 
     did not match any documents. 
    </p> 
} 

вот моя установка

<?xml version="1.0"?> 
<!-- 
Umbraco examine is an extensible indexer and search engine. 
This configuration file can be extended to add your own search/index providers. 
Index sets can be defined in the ExamineIndex.config if you're using the standard provider model. 

More information and documentation can be found on CodePlex: http://umbracoexamine.codeplex.com 
--> 
<Examine> 
    <ExamineIndexProviders> 
    <providers> 
     <add name="InternalIndexer" type="UmbracoExamine.UmbracoContentIndexer, UmbracoExamine" 
      supportUnpublished="true" 
      supportProtected="true" 
      interval="10" 
      analyzer="Lucene.Net.Analysis.WhitespaceAnalyzer, Lucene.Net"/> 

     <add name="InternalMemberIndexer" type="UmbracoExamine.UmbracoMemberIndexer, UmbracoExamine" 
      supportUnpublished="true" 
      supportProtected="true" 
      interval="10" 
      analyzer="Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net"/> 

     <!-- default external indexer, which excludes protected and unpublished pages--> 
     <add name="ExternalIndexer" type="UmbracoExamine.UmbracoContentIndexer, UmbracoExamine"/> 

     <add name="MySiteIndexer" type="UmbracoExamine.UmbracoMemberIndexer, UmbracoExamine" 
      supportUnpublished="false" 
      supportProtected="true" 
      interval="10" 
      analyzer="Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net" 
      enableDefaultEventHandler="true"/> 
    </providers> 
    </ExamineIndexProviders> 

    <ExamineSearchProviders defaultProvider="ExternalSearcher"> 
    <providers> 
     <add name="InternalSearcher" type="UmbracoExamine.UmbracoExamineSearcher, UmbracoExamine" 
      analyzer="Lucene.Net.Analysis.WhitespaceAnalyzer, Lucene.Net"/> 

     <add name="InternalMemberSearcher" type="UmbracoExamine.UmbracoExamineSearcher, UmbracoExamine" 
      analyzer="Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net" enableLeadingWildcard="true"/> 

     <add name="ExternalSearcher" type="UmbracoExamine.UmbracoExamineSearcher, UmbracoExamine" />  

     <add name="MySiteSearcher" type="UmbracoExamine.UmbracoExamineSearcher, UmbracoExamine" 
      analyzer="Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net" 
      enableLeadingWildcards="true" 
      indexSet="MySiteIndexSet"/> 
    </providers> 
    </ExamineSearchProviders> 

</Examine> 

ExamineIndex.config

<?xml version="1.0"?> 
<!-- 
Umbraco examine is an extensible indexer and search engine. 
This configuration file can be extended to create your own index sets. 
Index/Search providers can be defined in the UmbracoSettings.config 

More information and documentation can be found on CodePlex: http://umbracoexamine.codeplex.com 
--> 
<ExamineLuceneIndexSets> 
    <!-- The internal index set used by Umbraco back-office - DO NOT REMOVE --> 
    <IndexSet SetName="InternalIndexSet" IndexPath="~/App_Data/TEMP/ExamineIndexes/Internal/"/> 

    <!-- The internal index set used by Umbraco back-office for indexing members - DO NOT REMOVE --> 
    <IndexSet SetName="InternalMemberIndexSet" IndexPath="~/App_Data/TEMP/ExamineIndexes/InternalMember/"> 
    <IndexAttributeFields> 
     <add Name="id" /> 
     <add Name="nodeName" EnableSorting="true"/> 
     <add Name="name" EnableSorting="true"/> 
     <add Name="updateDate" /> 
     <add Name="writerName" /> 
     <add Name="loginName" /> 
     <add Name="email" /> 
     <add Name="bodyText"/> 
     <add Name="blogItemTitle" /> 
     <add Name="nodeTypeAlias" /> 
    </IndexAttributeFields> 
    <IndexUserFields> 
     <add Name="bodyText"/> 
     <add Name="tags"/> 
     <add Name="content"/> 
     <add Name="tags" /> 
     <add Name="category" /> 
    </IndexUserFields> 
    <IncludeNodeTypes> 
     <add Name="article" /> 
     <add Name="note" /> 
     <add Name="KnowledgebaseItem" /> 
    </IncludeNodeTypes> 
    </IndexSet> 

    <!-- Default Indexset for external searches, this indexes all fields on all types of nodes--> 
    <IndexSet SetName="ExternalIndexSet" IndexPath="~/App_Data/TEMP/ExamineIndexes/External/" /> 
    <IndexSet SetName="MySiteIndexSet" IndexPath="~/App_Data/TEMP/ExamineIndexes/MySiteSearcher/" /> 
</ExamineLuceneIndexSets> 
+0

Вместо 'Lucene.Net.Analysis.Standard.StandardAnalyzer' попробуйте использовать 'Lucene.Net.Analysis.WhitespaceAnalyzer' –

+0

@DZL благодарит, но я ничего не меняю. Я думаю, что индекс в/App_Data/TEMP/ExamineIndexes/MySiteSearcher не имеет значения, я пытаюсь исправить, что у вас есть идея? – kenshin

+0

Попробуйте вызвать 'ExamineManager.Instance.IndexProviderCollection [" MySiteSearcher "]. RebuildIndex()' –

ответ

0

Пару вещей, чтобы проверить, во-первых, убедитесь, что ваш индекс фактически заселение правильно. Вы можете скачать инструмент Luke от here (требуется Java). Этот удобный инструмент позволяет просматривать содержимое вашего индекса.

Если вы запустили Luke и указали его в индексной папке в/App_Data/TEMP/ExamineIndexes/MySiteSearcher, он должен показать вам, сколько элементов находится в индексаторе и какие поля они содержат. Убедитесь, что a) есть документы в индексе, и b) что индекс индексирует поля, которые вы ищете.

Если все выглядит нормально, это может быть синтаксис поиска. Посмотрев на свой код, вы получите результат поиска, для которого имя узла должно соответствовать поисковому запросу, с необязательным совпадением в bodyText (по умолчанию используется оператор поиска AND, что означает, что первый элемент в запросе ДОЛЖЕН всегда совпадать). Если вы хотите, чтобы соответствовать в любом, вам необходимо установить оператор умолчанию используется именно поиск быть или, используя следующий код:

var searchCriteria = searcher.CreateSearchCriteria(Examine.SearchCriteria.BooleanOperation.Or); 
+0

Спасибо за ответ Тим, мой индекс не заполняет никаких полей [http://screencast.com/t/34d7LC55p4b] Как я могу это исправить? Я думаю, что есть проблема в моих ExamineSettings? – kenshin

+0

Я могу " я вижу что-то явно неправильное с конфигурацией. У других индексов в папке ExamineIndexes есть что-нибудь? – Tim

+0

Я пробовал открывать внешние индексы и да, у него есть поля http://screencast.com/t/900ajpKKo – kenshin