Haven't worked much with EPiServer Search so don't know if there is a "start searching from here property"
But one way to do it could be to first get a referense to the market page. Could set a property on the searchpage or just get parrent if you know it will always be directly under the market or use the GetAncestors on the serach page and get the first page of the type MarketPage.
Ones we got that you should be able to filter out pages from the results that doesn't have the MarketPage in it's Ancestors.
Hi Jonas,
There are two ways to solve this:
1. Filter items during search
2. Filter items during indexing
Option 1
- You search for term X
- EPiSerch returns 100 items
- You use Linq/foreach loop, iterate through every item in the result set and check if the item belongs to the Global site or specific Market group
Option 2
- You create a custom index field, e.g. 'MARKET'
- During indexing time, you fetch the market group your page belongs to (Britain, Germany, Global), and save this value in MARKET field
- You execute the search query: 'give me all items for term X where MARKET=your_current_group or MARKET=Global'
Option 1 is easier for implementation, but it has a few limitations:
1. It's very slow. If EPiSearch returns 100 items, you need to fetch ancestors 100 times (once for each item)
2. If EPiSearch returns first 100 items, and all of them are inside "wrong" Market group, you won't have anything to display to the end user
Option 2 is harder for implementation, but it's lightning fast because you don't have to deal with expensive database queries (fetching ancestors using EPiServer API), just with Lucene.net
Ted Nyberg wrote a great article about adding custom fields to EPiServer search index: http://tedgustaf.com/blog/2013/4/add-custom-fields-to-the-episerver-search-index-with-episerver-7/
Hi
I have used the .Filter on the searchdatasource do exlude pages of a specific pagetype from the result. Something like this:
dsSearch.Filter += dsSearch_Filter;
void dsSearch_Filter(object sender, FilterEventArgs e)
{
var pageTypeIds = new int[] { Locate.ContentTypeRepository().Load<RoomPageType>().ID };
e.Pages.FilterByPageType(pageTypeIds);
}
public static void FilterByPageType(this PageDataCollection pages, int[] pageTypeId)
{
for (var i = pages.Count - 1; i >= 0; i--)
{
if (pageTypeId.Contains(pages[i].PageTypeID))
{
pages.RemoveAt(i);
}
}
}
Using Dejans idea might be much better though. It might also be an idea to set the pagelink property to the diffrent areas you would like to search within.
On my website I have multiple pages of type Search Result Page.
If the user searches on a search page which is not an ancestor to a MarketPage I wish to exclude pages which are children to pages of type MarketPage and the MarketPage itself.
Is this possible with EPiServer Search?
Startpage / Global site
- About
- Contact
- Search Result Page
- Great Britain Market
-- Products
-- Offer
-- Solutions
-- About
-- Contact
-- Search result page
- Germany Market
-- Products
-- Offer
-- Solutions
-- About
-- Contact
-- Search result page
- ...