2014-01-15 3 views
1

특정 용어로 문서를 검색하는 데 어려움이 있습니다. 매번 나는 제로 결과를 얻습니다. 내가 고객을 검색하려고하면 내가 쿼리 문자열 필터탄성 검색을 위해 NEST 클라이언트를 사용하여 검색어로 검색

var queryByQueryString = _elasticClient.Search<SampleCustomer>(s => 
      s.From(0).Size(10).Type("SampleCustomers") 
      .Query(q => q.QueryString(qs => qs.Query("Smith").OnField("surname")))); 

를 사용하여 스미스의 첫 번째 이름을 가진 고객을 조회 할 수 있지만이 인덱스를 사용하여

var customers = new List<SampleCustomer>(); 
customers.Add(new SampleCustomer(){id=1,firstname="John", surname="Smith", country = "UK", sex = "Male", age=30}); 
customers.Add(new SampleCustomer(){id=2,firstname="Steve", surname="Jones", country ="UK", sex = "Male", age=22}); 
customers.Add(new SampleCustomer(){id=3,firstname="Kate", surname="Smith", country ="UK", sex = "Female", age=50}); 
customers.Add(new SampleCustomer(){id=4,firstname="Mark", surname="Jones", country ="USA", sex = "Male", age=45}); 
customers.Add(new SampleCustomer(){id=5,firstname="Emma", surname="Jonson", country ="USA", sex = "Female", age=25}); 
customers.Add(new SampleCustomer(){id=6,firstname="Tom", surname="Jones", country ="France", sex = "Male", age=30}); 
customers.Add(new SampleCustomer(){id=7,firstname="Liz", surname="Web", country ="France", sex = "Female", age=45}); 

foreach (var customer in customers) 
{ 
    _elasticClient.DeleteById("sample", "SampleCustomers",customer.id); 
    _elasticClient.Index(customer, "sample", "SampleCustomers" , customer.id); 
} 

: 여기

코드 예제 Filer라는 용어를 사용하면 결과가 0이됩니다.

var queryByTerm = _elasticClient.Search<SampleCustomer>(s => 
      s.From(0).Size(10).Type("SampleCustomers") 
      .Query(q => q.Term(p => p.surname, "Smith"))); 

무엇이 잘못 되었습니까? 위의 예제에서 성명이 정확히 "Smith"와 같고 누군가가 "Smith Jones"와 같은 이중 성 (double-barreled) 성을 가진 경우 결과에 나타나지 않을 것이라고 내 쿼리가 결과를 반환하도록하고 싶습니다.

답변

5

지도를 보지 않고서는 확실히 알기는 어렵지만 문제는 대소 문자를 구분할 수 있습니다. "surname" 필드의 기본값이 standard analyzer 인 경우 (매핑에 지정하지 않은 경우) 토큰은 소문자로 수정됩니다. 따라서 "smith" 토큰이 있지만 "Smith"은 없습니다. 쿼리 문자열 쿼리를 사용하면 쿼리 텍스트가 분석되고 (사용자가 제공하지 않는 한 standard 분석기 사용) 검색 텍스트가 토큰과 일치하는 "smith"으로 수정됩니다. 그러나 term filter은 분석을하지 않으며 필터 텍스트 "Smith"은 어떤 토큰과도 일치하지 않으므로 결과가 반환되지 않습니다.

이 실제로 문제의 경우,이 반환해야 결과 : 또는

var queryByTerm = _elasticClient.Search<SampleCustomer>(s => 
      s.From(0).Size(10).Type("SampleCustomers") 
      .Query(q => q.Term(p => p.surname, "smith"))); 

, 당신은 (재 색인이 필요합니다) 당신의 매핑에 "index": "not_analyzed""surname" 필드를 설정, 등의 뜻을 토큰 수 소문자가 아니며 "Smith" 텍스트의 용어 필터가 일치합니다.

+0

네, 소문자가 작동했습니다. 나는 그것을 스미스와 함께 일할 수 없다. Not_analysed 특성을 Sample 고객 클래스의 성 속성에 추가했지만 아무것도 변경하지 않았습니다. 예 : [ElasticProperty (Index = FieldIndexOption.not_analyzed)] public string surname {get; 세트; } – Steve

+0

새 매핑으로 다시 색인을 생성 했습니까? 그게 효과가 있니? 매핑을 게시 할 수 있습니까? 매핑을 보지 않고 무엇이 잘못되었는지를 아는 것은 어렵습니다. Nest에 익숙하지 않지만 http : // [endpoint]/[index_name]/_mapping을 사용하여 매핑을 얻을 수 있습니다. –

관련 문제