2014-11-10 5 views
0

Umbraco.Tags 유형의 필드가있는 umbraco doctype이 있습니다. ...Umbraco - 조사를 사용하여 Umbraco.Tags를 검색하십시오.

어떤 아이디어 0 나는 값이 내부 topicTags하다는 사실을 알고

var searchEngine = ExamineManager.Instance.SearchProviderCollection["ExternalSearcher"]; 
      var searchCriteria = searchEngine.CreateSearchCriteria(BooleanOperation.Or); 

      var query = searchCriteria.Field("title", searchTerm) 
      .Or().Field("topicTags", searchTerm).Compile(); 
var results = searchEngine.Search(query); 

을하지만 결과 :

이 같은 필드를 검색 할 검사 사용하십니까?

업데이트 : Umbraco.Tags 데이터 유형에 tag1, tag2, tag3과 같이 공백이 없으므로 tag1이 색인에 없기 때문에 결과를 찾을 수없는 이유가 나타납니다. 검색해야합니다. "tag1, tag2, tag3"에 대한 조회수를 얻으십시오.

Examine 인덱스 이벤트를 하이 잭 처리해야하고 데이터 인덱싱 방식을 변경해야하는 것처럼 보입니다.

이것은 umbraco 데이터 유형으로 제작되었으므로 확실히 검색 할 수있는 방법이 있습니다.

답변

1

예, 그렇다면 내가 0을 얻는 이유는 tag1, tag2, tag3과 같이 저장되었습니다. 공백이 없으므로 tag1, tag2, tag3은 히트가되지만 tag1은 그렇지 않습니다.

해결책은 umbraco 게시 이벤트에 연결하여 해당 필드의 색인이 생성되는 방식을 변경하는 것이 었습니다. 해결 방법 : 검색 쿼리를 만들 때

public class ExamineEvents : ApplicationStartupHandler 
{ 
public ExamineEvents() 
{ 
    ExamineManager.Instance.IndexProviderCollection["ExternalIndexer"].GatheringNodeData += 
     ExamineEvents_GatheringNodeData; 
} 


private void ExamineEvents_GatheringNodeData(object sender, IndexingNodeDataEventArgs e) 
{ 
       if (e.IndexType != IndexTypes.Content) return; 

    // Node picker values are stored as csv which will not be indexed properly 
    // We need to write the values back into the index without commas so they are indexed correctly 
    var fields = e.Fields; 
    var searchableFields = new Dictionary<string, string>(); 
    foreach (var field in fields) 
    { 
     switch (field.Key) 
     { 
      case "topicTags": 

       var searchableFieldKey = "topicTagsIndexed"; 
       var searchableFieldValue = field.Value.Replace(',', ' '); 
       if (!string.IsNullOrEmpty(searchableFieldValue)) 
       { 
        searchableFields.Add(searchableFieldKey, searchableFieldValue); 
       } 
       break; 
     } 
    } 

    foreach (var fld in searchableFields) 
    { 
     e.Fields.Add(fld.Key, fld.Value); 
    } 
} 

는 그런 다음 필드에서 검색은

이 다른 사람이 도움이
SearchCriteria.Field("pagetitle", searchTerm).Or().Field("topicTagsIndexed", searchTerm).Compile(); 

희망을 topicTagsIndexed.

2

모두 태그 값의 쉼표로 사용합니다. Lucene의 표준 분석기 (검사)는이를 하나의 값으로 처리합니다.

당신이 뭘 해야하는지 알 것 같습니다. 쉼표가 공백으로 대체되는 필드에 Examine 인덱서의 GatheringNodeData 이벤트를 사용해야합니다. 그러면 Lucene이 해당 속성을 올바르게 인덱싱합니다. GatheringNodeData 이벤트는 콘텐츠가 게시 될 때마다 콘텐츠가 색인에 삽입되기 전에 발생합니다.