2014-06-19 4 views
1

업데이트Sitecore 7 Linq에 분류 스타일의 쿼리

잘 내 구성, 난 sitecore하여 contentsearch 정의에서 defaultindexconfiguration를 사용하여 다시 바로 작동하지 복귀했다 밝혀졌습니다.

일단 내가 그렇게하면 모든 것이 마술처럼 작동합니다. 방금 템플릿 조건을 쿼리에 추가했는데 모두 좋았습니다.


2 일 동안 내 머리를 두드리는 소리가 들렸습니다.

시나리오 :

나는 나무/multilist의 항목에 태그 된 기사가있다.

특정 서식 파일 유형에 대해 내 사이트 전체를 살펴본 다음 일부 값 (이름, 설명, 경로, 태그)을 저장하도록 색인이 정의되어 있습니다. 이 인덱스는 작은 indexConfiguration을 사용합니다. 나는 인덱스가 너무 많아서 기본 인덱스 구성을 피하고 있습니다. 단지 슬림 한 결과 만 필요합니다.

<myConfiguration type="Sitecore.ContentSearch.LuceneProvider.LuceneSearchConfiguration, Sitecore.ContentSearch.LuceneProvider"> 
    <defaultIndexConfiguration type="Sitecore.ContentSearch.LuceneProvider.LuceneIndexConfiguration, Sitecore.ContentSearch.LuceneProvider"> 
     <indexAllFields>true</indexAllFields> 
     <Analyzer ref="contentSearch/configuration/defaultIndexConfiguration/analyzer" /> 
     <fieldMap type="Sitecore.ContentSearch.FieldMap, Sitecore.ContentSearch"> 
      <fieldNames hint="raw:AddFieldByFieldName"> 
       <field fieldName="Article Tags" storageType="yes" indexType="tokenized" vectorType="no" boost="1f" type="System.String" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" /> 
       <field fieldName="Teaser Title" storageType="yes" indexType="tokenized" vectorType="no" boost="1f" type="System.String" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" /> 
       <field fieldName="Teaser Description" storageType="yes" indexType="tokenized" vectorType="no" boost="1f" type="System.String" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" /> 
       <field fieldName="Article Date" storageType="yes" indexType="tokenized" vectorType="no" boost="1f" type="System.DateTime" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" /> 
       <field fieldName="Views" storageType="yes" indexType="tokenized" vectorType="no" boost="1f" type="System.Int32" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" /> 
       <field fieldName="__Workflow state" storageType="yes" indexType="untokenized" vectorType="no" boost="1f" type="System.String" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" /> 
      </fieldNames> 
     </fieldMap> 
     <fields hint="raw:AddComputedIndexField"> 
      <field fieldName="isfinal" storageType="yes" indexType="tokenized">Core.Search.ComputedWorkflowState, Core</field> 
      <field fieldName="Teaser Image" storageType="yes" indexType="tokenized">Core.Search.ComputedTeaserImage, Core</field> 
      <field fieldName="Article Url" storageType="yes" indexType="tokenized">Core.Search.ComputeUrl, Core</field> 
     </fields> 
     <include hint="list:IncludeTemplate"> 
      <articlePage>{28432890-0F71-4E2F-8577-7848F90FCBCC}</articlePage> 
     </include> 
    </defaultIndexConfiguration> 
</myConfiguration> 

루크를 사용하여 색인을 보면 태그가 올바르게 색인 된 것을 볼 수 있습니다. 각 태그는 문서에서 고유 한 행을가집니다.

SearchResultItem을 확장하는 클래스 (ArticleItem)를 만든 다음 적절한 속성을 decoration로 구현했습니다.

[IndexField("article_tags")] 
public List<ID> tags{get;set;} 

이제 sitecore linq 및 조건부 작성기를 사용하여 쿼리를 작성하려고합니다. 내가 그 자체로 context.GetQueryable()를 호출 할 때

using (var context = ContentSearchManager.GetIndex(indexName).CreateSearchContext()) 
{ 
    IQueryable<ArticleItem> query = context.GetQueryable<ArticleItem>(); 

    var predicate = PredicateBuilder.True<ArticleItem>(); 

    foreach (var id in tags) 
    { 
     var tempTerm = id; 
     predicate = predicate.Or(p => p.Tags.Contains(id)); 
    } 

    var results = context.GetQueryable<ArticleItem>().Where(predicate).GetResults(); 

    if (results != null) 
    { 
     if (results.Hits.Any()) 
     { 
      return results.Hits.Select(x => x.Document); 
     } 
    } 
} 

, 그 결과를 반복, 태그는 모든 존재, 확실히 일치있다.

내가 잘못 설정 했습니까? 추가 쿼리와 검색 테스트

* 자세한 내용은

: 항목이 문자가 포함 된 GUID로 확실히있다 (결과를 반환 나던 p.Tags.Contains ("3") 3.

루크를 통해 볼 때 문서 태그

내 termcount은 0입니다. 계산 필드에 필드를 돌려

내 검색 결과는 이제 (값 대신 토큰 화되는 전체 문자열로 저장되어 있지만) 노력하고 있습니다 기간 카운트가 표시됩니다.

답변

0

술어를 단순화하여 태그 중 하나를 점검하면 결과가 있습니까?

var results = context.GetQueryable<ArticleItem>().Where(p=>p.Tags.Contains(tags[0])).GetResults(); 

이렇게하면 귀하의 조건부 건물이 문제인지 식별하는 데 도움이됩니다.

그래도 작동하지 않는다면 전달되는 'tags'컬렉션의 값이 해당 객체에 저장된 값과 동일한 지 확인 했습니까? 콜렉션의 값이 오브젝트에로드 된 값과 일치하지 않기 때문에 'Contains'점검이 실패 할 수 있습니다.

디버깅하는 또 다른 방법은 쿼리 할 수있는 곳에서 'Where'절을 제거하고 전체 모음의 결과를 얻는 것입니다. 일단 모든 문서를 선택하고 모든 항목의 전체 목록이 있으면 태그 모음을 사용하여 항목 목록을 필터링하는 Where 절을 만들 수 있습니까?

이 방법도 효과가 없다면 '태그'입력 목록이나 Where 절 자체에 문제가 있음을 확인하는 것일 수 있습니다.

+0

제이의 조언 주셔서 감사합니다. 문자 3 (guid에 char 3이있는 여러 개의 태그가 있음)을 사용하고 반환 유형을 문자열로 변경하여 테스트했습니다. query.Where (i => i [ "article_tags"]. 포함 ("3")); 아무 것도 반환하지 않습니다. 결과 자체를 보면 완벽하게 모든 값을 얻을 수 있습니다. – munsense

0

확인해야 할 몇 가지 사항이 있다고 생각합니다. 색인 생성/크롤링 문제가 아니라는 것을 알 수 있도록 귀하의 태그 입력란이 검색 색인에 채워지고 있다고 언급하셨습니다.

먼저 Sitecore 검색 로그에서 검색 쿼리의 형식을 결정할 수 있도록하십시오. 당신은 당신의 검색 필드를 정의 :

<field fieldName="Article Tags" storageType="yes" indexType="tokenized" vectorType="no" boost="1f" type="System.String" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider" /> 

하지만 당신은 모델에 필드를 정의 :

[IndexField("article_tags")] 
그것은 단지 sitecore에서 필드 이름 불일치 "articles_taqs에서 검색되는 수

"그러나 색인에는"기사 태그 "로 저장되어 있습니다. 내가 이것을 조롱했을 때 Sitecore가 밑줄 문자를 보내고있었습니다.

확인할 사항은 GUID 형식입니다. .Contains (ID)를 사용하면 대시 또는 중괄호없이 소문자 GUID를 검색합니다. LUKE를 사용하여 항목이 색인에 저장되는 방식을 살펴본 다음 Sitecore가 Sitecore 검색 로그에서 Sitecore가 검색하는 방식과 비교하십시오.

+0

루크에서 내가 알아 낸 것은 개요 탭에서 "기간"이 0 이었다는 것입니다. 뭐라구? 덧붙여 말하자면, 사용자 정의 구성에서 정의한 모든 필드는 문서 당 볼 때 여러 항목이 있어도 "용어 개수"가 0입니다. guid의 모든 사례를 시도해 보았습니다. 단축, 하단 사례, 단축 하단 사례 및 아무 것도 반환되지 않았습니다. – munsense

0
이에 '태그'속성을 변경

:

[IndexField("article_tags"), TypeConverter(typeof(IndexFieldEnumerableConverter))] 
public virtual System.Collections.Generic.IEnumerable<ID> tags{ get; set; } 

나는이 문제를 해결할 수 있다고 생각.