2015-01-07 1 views
0

NEST에서 가능한 한 다중 필드 속성의 하위 필드를 검색하도록 Elastic을 실행하는 것이 가장 좋습니다. 가능하면 쿼리의 필드 이름을 하드 코딩하지 않아도됩니다.NEST의 인덱스 속성 하위 필드를 처리하는 가장 좋은 방법은 무엇입니까?

일부 설명 ...

우리는 사용자가없이 검색 할 가능성이 있음을 우리는 가끔 문자, 구두점 및 공백을 숫자의 다소 복잡한 문자열이 될 수 있습니다 알고있는 일부 필드와 POCO 비즈니스 오브젝트를 장식 및 종종 상당히 부분적인 방식으로.

예를 들어, 항목 코드는 "X123.45-10"과 같을 수 있지만 사용자는 "4510 '이 종료되었음을 기억할 수 있습니다. 이를 찾기 위해 우리는 즉, 비 알파 문자 및없이 ngrammed 여러 필드 각각 다르게 분석을 가지고 문자열 속성 인덱스 생성 한 : 우리에게 인덱스 속성을 제공

client.CreateIndex(Elasticsearchindex, c => c 
    .Analysis(a => a.Analyzers(az1 => az1.Add("ngram_analyzer", ngramAnalyser))) 
    .Analysis(a => a.Analyzers(az1 => az1.Add("compressedNgramAnalyser", compressedNgramAnalyser))) 
    .AddMapping<ItemBo>(m => m.MapFromAttributes() 
    .Properties(props => props 
     .MultiField(s => s 
     .Name(p => p.ItemCode) 
     .Fields(pprops => pprops 
      .String(ps => ps.Name(p => p.ItemCode).Index(FieldIndexOption.Analyzed).Analyzer("default")) 
      .String(ps => ps.Name("ngram").Index(FieldIndexOption.Analyzed).IndexAnalyzer("ngram_analyzer")) 
      .String(ps => ps.Name("compressedNgram").Index(FieldIndexOption.Analyzed).IndexAnalyzer("compressedNgramAnalyser")) 
     ) 
    ) 
    ) 
) 
); 

을 ...

"itemCode": { 
    "type": "string", 
    "fields": { 
    "ngram": { 
     "type": "string", 
     "index_analyzer": "ngram_analyzer" 
    }, 
    "compressedNgram": { 
     "type": "string", 
     "index_analyzer": "compressedNgramAnalyser" 
    } 
    } 
}, 

는 원래 우리는 ... 우리가 쿼리의 속성을 포함하는 경우, 서브 필드가 일치하는 것이라고

sd.Query(q => q.QueryString(qs => qs 
    .Query(findText) 
    .OnFields(f => f.Description, f => f.ItemCode))); 
을 가정했다 ... 그러나 그것은 스와 보이지 않습니다 b- 필드, 원본. 우리가 서브 필드를 일치 시키려면

, 우리는

sd.Query(q => q.QueryString(qs => qs 
    .Query(findText) 
    .OnFields(new[] {"description", "itemCode.*"})) 

내가 여기 트릭을 실종 ... 입력 된 POCO에서 갈고리가 풀리다 및 참조 명시 적으로 인덱스 필드에 와일드 카드를해야 할 것 같다? NEST 쿼리에서 인덱스 속성 하위 필드를 처리하는 더 좋은 방법이 있습니까?

답변

1

메인 필드에서의 검색은 자동으로 서브 필드로 확장되지 않습니다. 이미 발견 한 것처럼 점 표기법을 사용하여 액세스해야합니다 (itemCode.ngram, itemCode.compressedNgram 등 ...).

.OnFields(x => x.ItemCode.Suffix("*")) 

직렬화 itemCode.*로 변환합니다 :

NEST이있는 동안은 여전히 ​​Suffix() 확장 메서드를 통해 표현식을 사용하여 처리하는 영리한 방법을 제공합니다.

+0

감사합니다. Greg. 나는 내 자신의 질문에 대답하기 위해 다시 로그인했고 당신은 나를 때렸다. 이 .Suffix() 확장은 속성 이름을 하드 코딩하는 것을 피할 수 있고 비슷하게 처리 된 코드에 대한 몇 가지 규칙 기반 필드 이름을 가질 수 있기 때문에 우리의 요구에 아주 좋습니다. –