2014-01-13 2 views
3

지금까지이 문제에 대해 몇 시간을 보냈지 만 지금까지는 아무런 운이 없었습니다. 커뮤니티에 도움을 청하십시오.Sitecore 7 필터에 숫자 POCO 속성이있는 ContentSearch API/조건이 작동하지 않습니다.

ProPrice이라는 필드가있는 Product이라는 데이터 템플릿이 있는데이 템플릿을 기반으로 한 일부 콘텐츠는 <indexAllFields>true</indexAllFields> 구성을 사용하여 모든 필드의 색인을 생성 할 수 있도록 설정했습니다. 색인을 다시 작성하면 Lucene에 저장된 용어와 함께 색인 필드 (proprice)가 올바르게 표시됩니다 (누가를 사용하여 검증 됨).

이제 Sitecore 7 ContentSearch API를 사용하여 Lucene 색인에서 콘텐츠를 가져옵니다. 그리고이를 위해, 나는 POCO 엔티티가 SearchResultItem에서 상속하는 Product라고 만든, 또한 아래와 같이 가격에 속성을 추가 한 :

다음 LINQ 쿼리는 데이터를 반환하지 않습니다 그러나

[IndexField("proprice")] 
public double Price { get; set; } 

var products = context.GetQueryable<Product>().Where(p => p.Price == 4.0).ToList(); 

Sitecore 검색 로그를 보면 Lucene이 번역 된 쿼리는 -proprice:[4 TO 4]입니다. 그리고이 쿼리를 Luke의 인덱스에 대해 직접 실행하면 데이터가 반환됩니다. 나는 p.Price >= 1.0과 같은 다른 조건으로 이것을 시도했지만 아무 것도 효과가 없었다. 흥미로운 점은 - 조건을 제거하고 모든 레코드를 가져올 때 Product 엔터티의 Price 속성에 올바른 Double 값 (4.0)이 채워진다는 것입니다. 다음과 같이 내가 약간 쿼리를 변경하는 경우

는하지만, 그것은 올바른 데이터를 반환

var products = context.GetQueryable<Product>().Where(p => p["proprice"] == "4").ToList(); 

는 그래서 조건이 숫자 값에있을 때, 그것은 작동하지 않는 것 같습니다. 불행히도 숫자 범위를 기준으로 필터링해야하므로 위의 방법으로는 효과적이지 않습니다. ContentSearch API를 피하고 Lucene 공급자를 사용하여 Lucene 쿼리를 직접 실행할 수는 있지만 나중에 다른 검색 공급자 (예 : Solr)로 전환 할 수 없습니다. 또는 다른 방법으로 모든 데이터를 가져 와서 코드에 필터를 적용 할 수 있습니다.

이 문제를 해결하는 데 도움을 주셔서 감사합니다. PS : 몇몇 다른 점 : 1) 나는 한 줄의 텍스트, 정수로 데이터 템플릿에 "ProPrice"의 필드 형식을 시도했다가 두 번 - 아무도 2) 기본 루씬 분석기를 사용하고 일하지 - Lucene.Net.Analysis.Standard.StandardAnalyzer

답변

2

I 필드에 추가하는 형식 변환기 속성이 필요하다고 생각합니다. 내 프로젝트에 이런 짓을 한 숫자에 대한 필터링은 잘 작동했습니다

그래서에 속성을 변경 :

[IndexField("proprice")] 
[TypeConverter(typeof(IndexFieldNumberValueConverter))] 
public double Price { get; set; } 

그리고 당신은 필터링 할 수 있어야한다.

+0

감사 리처드! 위의 아메드의 제안과 함께 작업했습니다. – Jinto

+0

'Sitecore.ContentSearch.LuceneProvider.dll'을 추가하십시오 – Dann

3
당신은 다음과 같이 system.double하는 색인 ​​필드 유형을 매핑 할 필요가

(유형 = "System.Double"주의) :

<field fieldName="proprice"  storageType="YES" indexType="TOKENIZED" vectorType="NO" boost="1f" type="System.Double" settingType="Sitecore.ContentSearch.LuceneProvider.LuceneSearchFieldConfiguration, Sitecore.ContentSearch.LuceneProvider"> 
       <analyzer type="[YOUR ANALYZER]" /> 
</field> 
+0

감사합니다 Ahmed !! 그것은 Richard의 제안과 함께 아래에서 일했습니다. 나는 두 가지 옵션을 함께 시도하지 않았기 때문에 작동하지 않았다. – Jinto

+3

이것은 [TypeConverter] 속성을 추가하지 않고도 sitecore 지원 정수, 문자열, double 등의 형식을 사용하지 않고 나를 위해 일했습니다. –

+0

TypeConverter를 사용할 필요없이이 기능을 사용할 수있었습니다 (필자는 System.Int32를 사용했습니다). 나는 또한 색인을 재구성했지만, 그것이 필요한지 나는 모른다. –