Five New Optimizely Certifications are Here! Validate your expertise and advance your career with our latest certification exams. Click here to find out more

SearchPhaseExecutionException after updating to EPiServer.Find 12

Vote:
 

After updating from EPiServer.Find 11.0.0.3701 to 12.3.2.0 I'm getting an error when searching for a page type:

EPiServer.Find.ServiceException: The remote server returned an error: (500) Internal Server Error.
SearchPhaseExecutionException[Failed to execute phase [query], total failure; shardFailures {[cvWFkiGgQQiI7pxso2NfTw][myproject_qa_index][3]: SearchParseException[[myproject_qa_index][3]: query[filtered(ConstantScore(NotDeleted(+cache(CompanyId$$number:[28.0 TO 28.0]) +cache(___types:EPiServer.Core.IContent))))->cache(___types:OpenWeb.Core.Models.Pages.ContactOfficePage)],from[-1],size[1000]: Parse Failure [Failed to parse source [{"size":1000,"query":{"filtered":{"query":{"constant_score":{"filter":{"and":[{"term":{"CompanyId$$number":28}},{"term":{"___types":"EPiServer.Core.IContent"}}]}}},"filter":{"term":{"___types":"OpenWeb.Core.Models.Pages.ContactOfficePage"}}}},"sort":[{"Name$$string.sort":{"missing":"_first","ignore_unmapped":true}}],"fields":["___types","ContentLink.ID$$number","ContentLink.ProviderName$$string","Language.Name$$string"]}]]]; nested: ElasticSearchIllegalArgumentException[Sorting on string type field does not support missing parameter]; }{[cvWFkiGgQQiI7pxso2NfTw][myproject_qa_index][4]: SearchParseException[[myproject_qa_index][4]: query[filtered(ConstantScore(NotDeleted(+cache(CompanyId$$number:[28.0 TO 28.0]) +cache(___types:EPiServer.Core.IContent))))->cache(___types:OpenWeb.Core.Models.Pages.ContactOfficePage)],from[-1],size[1000]: Parse Failure [Failed to parse source [{"size":1000,"query":{"filtered":{"query":{"constant_score":{"filter":{"and":[{"term":{"CompanyId$$number":28}},{"term":{"___types":"EPiServer.Core.IContent"}}]}}},"filter":{"term":{"___types":"OpenWeb.Core.Models.Pages.ContactOfficePage"}}}},"sort":[{"Name$$string.sort":{"missing":"_first","ignore_unmapped":true}}],"fields":["___types","ContentLink.ID$$number","ContentLink.ProviderName$$string","Language.Name$$string"]}]]]; nested: ElasticSearchIllegalArgumentException[Sorting on string type field does not support missing parameter]; }] ---> System.Net.WebException: The remote server returned an error: (500) Internal Server Error.
   at System.Net.HttpWebRequest.GetResponse()
   at EPiServer.Find.Connection.JsonRequest.GetResponseStream()
   at EPiServer.Find.Api.Command.GetResponse[TResult](IJsonRequest request)
   --- End of inner exception stack trace ---
   at EPiServer.Find.Api.Command.GetResponse[TResult](IJsonRequest request)
   at EPiServer.Find.Api.SearchCommand`1.Execute()
   at EPiServer.Find.Client.Search[TResult](SearchRequestBody requestBody, Action`1 commandAction)
   at EPiServer.Find.SearchExtensions.GetProjectedResult[TResult](ISearch`1 search, SearchContext context)
   at EPiServer.Find.SearchExtensions.GetResult[TResult](ISearch`1 search)
   at EPiServer.Find.Cms.SearchRequestExtensions.GetContentResult[TContentData](ITypeSearch`1 search, Int32 cacheForSeconds, Boolean cacheForEditorsAndAdmins)
   at OpenWeb.Core.Helpers.Search.FindHelper.d__0`1.MoveNext() in c:\Projects\myproject\OpenWeb.Core\Helpers\Search\FindHelper.cs:line 20
   at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at EPiServer.Filters.FilterForVisitor.Filter(IEnumerable`1 contentItems)
   at OpenWeb.Core.Extensions.FilterForVisitorExtension.FilterOnType[T](IEnumerable`1 collection) in c:\Projects\myproject\OpenWeb.Core\Extensions\FilterForVisitorExtension.cs:line 11
   at OpenWeb.Core.Models.ViewModels.ContactUsPageViewModel.GetOfficeList(String path) in c:\Projects\myproject\OpenWeb.Core\Models\ViewModels\ContactUsPageViewModel.cs:line 295
   at OpenWeb.Core.Models.ViewModels.ContactUsPageViewModel..ctor(ContactUsPage currentPage, Int32 officeId, String path, Boolean usePrefix) in c:\Projects\myproject\OpenWeb.Core\Models\ViewModels\ContactUsPageViewModel.cs:line 58
   at OpenWeb.Web.Controllers.Pages.LocalPageController.Index(LocalPage currentPage, String facet) in c:\Projects\myproject\OpenWeb.Web\Controllers\Pages\LocalPageController.cs:line 186
   at lambda_method(Closure , ControllerBase , Object[] )
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.b__3d()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.b__3f()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.b__3f()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.b__3f()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.b__3f()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.b__3f()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.b__3f()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass33.b__32(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.<>c__DisplayClass2b.b__1c()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.b__1e(IAsyncResult asyncResult)

ContactUsPageViewModel.cs:

var query = SearchClient.Instance.Search()
		.FilterForVisitor()
		.Filter(page => page.CompanyId.Match(companyIdFromUrl))
		.OrderBy(p => p.Name);

return FilterForVisitorExtension.FilterOnType(FindHelper.GetAllPages(query)
		.Where(s => s.CheckPublishedStatus(PagePublishedStatus.Published))).ToList(); // Line 295

FindHelper.cs:

public static IEnumerable GetAllPages(ITypeSearch query) where T : IContentData
		{
			query = query.Take(1000);

			var batch = query.GetContentResult(); // Line 20, where the exception is thrown
			foreach (var page in batch)
			{
				yield return page;
			}

			var totalNumberOfPages = batch.TotalMatching;

			var nextBatchFrom = 1000;
			while (nextBatchFrom < totalNumberOfPages)
			{
				batch = query.Skip(nextBatchFrom).GetContentResult();
				foreach (var page in batch)
				{
					yield return page;
				}
				nextBatchFrom += 1000;
			}
		}

Another odd thing is that this error doesn't happen with my local developer Find index, only in our stage environment.

#174442
Edited, Jan 26, 2017 13:06
Vote:
 

Did you reindex your staging index after updating Find?

#174446
Jan 26, 2017 13:56
Vote:
 

Hi Per! Yes, I first ran a custom job which clears the index like this:

var client = ServiceLocator.Current.GetInstance<IClient>();
client.Delete<object>(x => x.GetType().Name.Exists() | !x.GetType().Name.Exists());

After which I ran the built-in job "EPiServer Find Content Indexing Job".

#174447
Edited, Jan 26, 2017 14:00
Vote:
 
<p>There is a "clear index" button in the Find UI, you know :-) Also, the standard indexing job will delete all old IContent that has not been updated.</p> <p>What is going on at "FilterForVisitorExtension.cs:line 11"?</p> <p>It looks a bit like you are both doing FilterForVisitor on the query, and then afterwards as well. That should not be necessary.</p> <p></p>
#174450
Jan 26, 2017 14:22
Vote:
 

Ah ok, but I assume the job I ran does the same as the "clear index" button?

FilterForVisitorExtension.cs looks like this:

public static IEnumerable<T> FilterOnType<T>(IEnumerable<IContent> collection) where T : IContent
{
	return EPiServer.Filters.FilterForVisitor.Filter(collection).OfType<T>(); // Line 11
}
#174451
Edited, Jan 26, 2017 14:26
Vote:
 
<p>Yes you are right, the FilterForVisitor filtering is happening twice. I&nbsp;did however try removing the .FilterForVisitor() in the query but the (same) error still occurs.</p>
#174452
Jan 26, 2017 14:48
Vote:
 

The code looks correct to me. Although you do not need to to run the extra FilterForVisitor after the query has been run.

Looks like the problem is "ElasticSearchIllegalArgumentException[Sorting on string type field does not support missing parameter]", which does not sound right as "name" should never be empty, and even if it was, that should not really be a problem.

#174453
Jan 26, 2017 14:49
Vote:
 

Now that I try to use the "clear index" button instead of the custom job I get an error message saying:

Unable to load /episerver/Find/proxy/_clear?clear_index=true&clear_stats=false status: 400
#174455
Edited, Jan 26, 2017 14:53
Vote:
 
<p>It should indeed never be empty as it's not allowed. I realized now that the query in the OP was missing a&nbsp;&lt;ContactOfficePage&gt;, I added that now.</p>
#174457
Jan 26, 2017 14:58
Vote:
 

Perhaps there is something wrong with the index. Could you try the dev index in your staging environment? If there is something wrong with the index, I suggest you contact operations@episerver.com

#174461
Jan 26, 2017 15:19
Vote:
 

Unfortunately I can't use my dev index in the staging environment as the staging environment is restricted network-wise (getting error message "No connection could be made because the target machine actively refused it" when trying). Is there any way for me to clear the index completely if I log onto the index server? As you're saying, the index might be corrupted somehow, so would be excellent if I can manually clear it by deleting files/folders on the server where the index is located.

#174496
Jan 27, 2017 13:34
* You are NOT allowed to include any hyperlinks in the post because your account hasn't associated to your company. User profile should be updated.