2016-07-31 4 views
0

그래서 탄성 검색 NEST 주요 MultiMatch 쿼리 후에 다른 필터를 적용,이 내 쿼리입니다. 범위 필터 (가격), 필터 결과 세트 (field1 = "Audi"및 field2 = "Sale Car"). 나는 그런 것을하려고 노력했다 :

.Query(q => 
        q.MultiMatch(m => m 
        .Fields(fs => fs 
         Field(p => p.Field1) 
          .Field(p => p.Field2) 
          .Field(p => p.Field3) 
          .Field(p => p.Field4) 
          .Field(p => p.Field5) 
          .Field(p => p.Field6) 
        ) 
        .Operator(Operator.And) 
        .Query(pattern))) 
.Query(q=>q.Range(ra=>ra.Field(ff=>ff.SalePrice).GreaterThan(1000)))); 

그러나 이것은 효과가 없다. 나는 가격이 1000보다 큰 색인의 모든 결과를 찾았지만 검색된 결과 만 필요합니다. 누구든지 나를 도울 수 있을까?

+2

는'multi_match'과'range' 쿼리를 모두 결합하는'bool' 쿼리를 사용하여 같은 쿼리 JSON 지금 보이는 net-api/2.x/bool-queries.html –

답변

1

할 수 있습니다 use a bool query to combine queries 및 NEST는 QueryContainer의 (루트 쿼리 유형)를 결합하는 연산자를 오버로딩하여 작업 할이 약간 쉬워집니다. 여기 NEST 2.x를위한 예입니다 이것은 salePrice 이상 1000 우리 돈부터 가지고있는 multi_match 쿼리 또한에 일치되는 문서를 찾을 수

{ 
    "size": 20, 
    "sort": [ 
    { 
     "_score": { 
     "order": "desc" 
     } 
    } 
    ], 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "multi_match": { 
      "query": "match query", 
      "operator": "and", 
      "fields": [ 
       "field1", 
       "field2", 
       "field3", 
       "field4", 
       "field5", 
       "field6" 
      ] 
      } 
     }, 
     { 
      "range": { 
      "salePrice": { 
       "gt": 1000.0 
      } 
      } 
     } 
     ] 
    } 
    } 
} 

를 산출

void Main() 
{ 
    var connectionPool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); 
    var settings = new ConnectionSettings(connectionPool); 

    var client = new ElasticClient(settings); 

    var itemsPerPage = 20; 
    var pattern = "match query"; 

    client.Search<SearchItem>(x => x 
     .Sort(so => so 
      .Descending("_score") 
     ) 
     .Size(itemsPerPage) 
     .Query(q => q 
      .MultiMatch(m => m 
       .Fields(fs => fs 
        .Field(p => p.Field1) 
        .Field(p => p.Field2) 
        .Field(p => p.Field3) 
        .Field(p => p.Field4) 
        .Field(p => p.Field5) 
        .Field(p => p.Field6) 
       ) 
       .Operator(Operator.And) 
       .Query(pattern) 
      ) && q 
      .Range(ra => ra 
       .Field(ff=>ff.SalePrice) 
       .GreaterThan(1000) 
      ) 
     ) 
    ); 
} 

public class SearchItem 
{ 
    public int SalePrice { get; set; } 

    public string Field1 { get; set; } 

    public string Field2 { get; set; } 

    public string Field3 { get; set; } 

    public string Field4 { get; set; } 

    public string Field5 { get; set; } 

    public string Field6 { get; set; } 
} 

범위 쿼리에 대해 계산 된 점수가 필요하지 않습니다 (문서에 salePrice이 1000 이상이거나없는 경우). 범위 쿼리는 필터 컨텍스트에서 실행할 수 있습니다. 범위 질의 + 단항 연산자를 약간 추가 정제 버전

client.Search<SearchItem>(x => x 
    .Sort(so => so 
     .Descending("_score") 
    ) 
    .Size(itemsPerPage) 
    .Query(q => q 
     .MultiMatch(m => m 
      .Fields(fs => fs 
       .Field(p => p.Field1) 
       .Field(p => p.Field2) 
       .Field(p => p.Field3) 
       .Field(p => p.Field4) 
       .Field(p => p.Field5) 
       .Field(p => p.Field6) 
      ) 
      .Operator(Operator.And) 
      .Query(pattern) 
     ) && +q 
     .Range(ra => ra 
      .Field(ff=>ff.SalePrice) 
      .GreaterThan(1000) 
     ) 
    ) 
); 

은 불리언 질의 필터의 속기이다. https://www.elastic.co/guide/en/elasticsearch/client/ -

{ 
    "size": 20, 
    "sort": [ 
    { 
     "_score": { 
     "order": "desc" 
     } 
    } 
    ], 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "multi_match": { 
      "query": "match query", 
      "operator": "and", 
      "fields": [ 
       "field1", 
       "field2", 
       "field3", 
       "field4", 
       "field5", 
       "field6" 
      ] 
      } 
     } 
     ], 
     "filter": [ 
     { 
      "range": { 
      "salePrice": { 
       "gt": 1000.0 
      } 
      } 
     } 
     ] 
    } 
    } 
}