Best pracice on CB Lite index?

Just to be sure that I understand the way I should create the index. Say if I have a query like this:

/*
    SELECT max(length) longest,specieskey
    FROM data
    WHERE type = "Catch" and userkey='2124DEFEC111BA8FC1257ED20034B387' and length is valued
    GROUP BY specieskey
    ORDER BY longest DESC
*/
var _condition = Expression.Property(TYPE).EqualTo(Expression.String(typeof(Catch).Name)).And(_userCondition)
                    .And(Expression.Property(nameof(Catch.Length).ToLower()).NotNullOrMissing());
if (forAll)
{
    _condition = _condition.And(Expression.Property(nameof(Catch.Visibility).ToLower()).NotEqualTo(Expression.String(Catch.PRIVATE)));
}
using (var query = QueryBuilder.Select(
            SelectResult.Property(nameof(Catch.SpeciesKey).ToLower()),
            SelectResult.Expression(Function.Max(Expression.Property(nameof(Catch.Length).ToLower()))).As(nameof(BestCatch.Longest).ToLower())
        )
        .From(dbSource)
        .Where(_condition)
        .GroupBy(Expression.Property(nameof(Catch.SpeciesKey).ToLower()))
        .OrderBy(Ordering.Property(nameof(BestCatch.Longest).ToLower()).Descending()))
{

Should I then create an index on the fields in the Where clause? And in this case include the “extra” condition (visibility) that may be used?

Should the order of the fields be the same?

And if in this case I don’t have a condition for “visibility” should I then add the condition that the field should be e.g. in this case “not null or missing” - or doesn’t that make any difference?

Can/should I also create separate indexes for e.g. type="Catch" where “length” and “visibility” are fields - and for type="FishingTrip" where these fields do not exist? This is the way I do it on the server (N1QL)

Thanks in advance!

/John