Elasti c Поиск клиента NEST raw + пользовательский запрос - PullRequest
0 голосов
/ 21 февраля 2020

Я использую NEST-клиент для запросов ES, но теперь у меня есть конкретная c ситуация - я пытаюсь запросить прокси к ES, но с заданным c запросом, применяемым по умолчанию:

public IEnumerable<TDocument> Search<TDocument>(string indexName, string query, string sort, int page, int pageSize) where TDocument : class
{
    var search = new SearchRequest(indexName)
    {
        From = page,
        Size = pageSize,
        Query = new RawQuery(query),
    };


    var response = this.client.Search<TDocument>(search);

    return response.Documents;
}

Приведенный выше код просто передает запрос в ES, но что, если мне нужно применить фильтр c, который должен всегда применяться вместе с пропущенным запросом?

Так, например, я бы хотел Active поле должно быть true по умолчанию. Как я могу объединить этот необработанный запрос с определенным c и всегда применяемым фильтром (без объединения строк для формулирования объединенных вызовов ES API, если это возможно).

1 Ответ

1 голос
/ 22 февраля 2020

Предполагая, что query правильно сформирован JSON, что соответствует DSL запроса, вы можете десериализовать его в экземпляр QueryContainer и объединить его с другими запросами. Например,

var client = new ElasticClient();

string query = @"{
  ""multi_match"": {
    ""query"": ""hello world"",
    ""fields"": [
      ""description^2.2"",
      ""myOtherField^0.3""
    ]
  }
}";

QueryContainer queryContainer = null;

using (var stream = client.ConnectionSettings.MemoryStreamFactory.Create(Encoding.UTF8.GetBytes(query)))
{
    queryContainer = client.RequestResponseSerializer.Deserialize<QueryContainer>(stream);
}

queryContainer = queryContainer && +new TermQuery
{
    Field = "another_field",
    Value = "term"
};

var searchResponse = client.Search<TDocument>(s => s.Query(q => queryContainer));

, что приведет к следующему запросу (при условии, что индекс по умолчанию равен _all)

POST http://localhost:9200/_all/_search?pretty=true&typed_keys=true 
{
  "query": {
    "bool": {
      "filter": [{
        "term": {
          "another_field": {
            "value": "term"
          }
        }
      }],
      "must": [{
        "multi_match": {
          "fields": ["description^2.2", "myOtherField^0.3"],
          "query": "hello world"
        }
      }]
    }
  }
}
...