2012-09-13 4 views
0

검색 할 문자열과 검색 결과에서 가져올 기사의 수를 전달하는 함수를 작성했습니다. SearchResultCollection의 항목 필터링

그러나 검색이 다시 Sitecore 컨텐츠 항목에서 올 때, 나는 그들의 제목 필드의 시작에 별표 (*)이있는 항목을 표시 싶지 않다. 다음은 함수 이름입니다

protected IEnumerable<Item> ShowHomePageNews(int numOfArticles, string stringofCountries) 
    { 
     List<Item> items = new List<Item>(); 
     Sitecore.Search.Index indx = SearchManager.GetIndex("my_index_name"); 
     using (IndexSearchContext searchContext = indx.CreateSearchContext()) 
     { 
      CombinedQuery query = new CombinedQuery(); 
      QueryBase catQuery = new FieldQuery("countries", stringofCountries); //FieldName, FieldValue. 
      SearchHits results = searchContext.Search(catQuery); //Searching the content items by fields. 
      SearchResultCollection result = results.FetchResults(0, numOfArticles); 
      foreach (SearchResult i in result) 
      { 
       Lucene.Net.Documents.Field url = i.Document.GetField("_url"); 
       Sitecore.Data.ItemUri itemUri = new Sitecore.Data.ItemUri(url.StringValue()); 
       Sitecore.Data.Items.Item item = Sitecore.Context.Database.GetItem(itemUri.ToDataUri()); 
       items.Add(item); 
      } 
     } 

     return items; 
    } 

그리고 내 PageLoad에이 함수를 호출 오전 :

rptHomePageNews.DataSource = ShowHomePageNews (4, "USA");를

<asp:Panel ID="HomePageNews" runat="server"> 
<asp:Repeater ID="rptHomePageNews" runat="server"> 
    <ItemTemplate> 
    <li> 
     <%--<sc:FieldRenderer ID="FieldRenderer1" FieldName="Date" runat="server" Item="<%# Container.DataItem as Sitecore.Data.Items.Item %>" />--%> 
     <a href="<%# Sitecore.Links.LinkManager.GetItemUrl(Container.DataItem as Sitecore.Data.Items.Item) %>"> 
      <sc:FieldRenderer ID="FieldRenderer2" FieldName="Title" runat="server" Item="<%# Container.DataItem as Sitecore.Data.Items.Item %>" /> 
     </a> 
    </li> 
    </ItemTemplate> 
</asp:Repeater> 

내가 내 ShowHomePageNews 기능에 어떤 변화를해야한다 :

는 그리고 이건 내 마크 업입니까?

+0

검색에서 필터링을 수행 할 의향이, 또는 당신이 후 검색을 사용하고자 : 내가 컴파일하거나 실행하지 않은 참고, 나는이 코드를 기존의 오프 의사가 코딩 해요 LINQ 쿼리 필터링? –

+0

예! 나는 그것을 기꺼이한다. –

+0

내 'result'변수는 여기에 0입니다. 내가 뭘 잘못하고 있니? –

답변

1

한 가지 방법은 다음과 같이 뭔가를 LINQ 쿼리를 사용 후 필터링 할 수 있습니다 :

string myTitleField = "My Title Field"; 
List<Item> results = items.Where(x => x.Fields[myTitleField].Value.Contains("*") == false).ToList(); 

필터링을 시작하기 전에 모든 항목을로드해야하므로이 방법은 효율적이지 않습니다. 효율성이 문제가되지 않는다면 적어도 필터링하는 간단한 방법을 제공합니다.

그러나 내 제안은 색인에 필드를 추가하고 필터링 할 수있는 값으로 레코드에 플래그를 지정하는 것입니다 (예 : "TitleContainsAsterisk"). 그런 다음 쿼리를 변경하여 해당 필드에 'true'또는 '1'이 포함 된 결과를 필터링 할 수 있습니다.

EDIT (고급 데이터베이스 크롤러 용) 동적 필드 추가를위한 구성 및 코드 예제.

<dynamicFields hint="raw:AddDynamicFields"> 
    <dynamicField type="MyNameSpace.TitleContainsAsterisk,MyBinary" 
     name="TitleContainsAsterisk" storageType="YES" indexType="TOKENIZED" vectorType="NO" boost="1f" /> 
</dynamicFields> 

/// <summary> 
/// Field Configuration (for the indexer) to index the if there is an asterisk in the title 
/// </summary> 
public class TitleContainsAsterisk: BaseDynamicField { 
    public override string ResolveValue(Item item) { 
     string myTitleField = "My Title Field"; 
     bool containsAsterisk = item.Fields[myTitleField].Value.Contains("*"); 
     return containsAsterisk ? "1" : "0"; 
    } 
} 
+0

제이, Sitecore 6.5에서 인덱싱을 구현 했습니까? –

+0

개인적으로 6.5 색인 생성을위한 코드 또는 구성을 작성하지는 않았지만 6.4에서 작성했습니다. 우리 팀은 6.5 색인 생성 작업을 얼마 동안하고 있습니다. –

+0

반가워요. 감사! –

1

당신이 Linq에 사용하기 만족하면이 같은으로 foreach 루프를 대체 할 수 있습니다 : 여기

var db = Sitecore.Context.Database; 

items = result 
     .Where(r => !r.Title.StartsWith("*")) 
     .Select(r => db.GetItem(new Sitecore.Data.ItemUri(r.Url).ToDataUri())) 
     .ToList(); 
+0

이 코드에서 SearchResult i를 어디에 사용합니까? –

+0

변수'result'는 당신의 예제에서 같은 변수를 참조합니다 :'SearchResultCollection result' –

관련 문제