Ищите Lucene. Net для имени поля, которое имеет значение (x или y или z) и более - PullRequest
0 голосов
/ 22 января 2020

У меня есть поле, которое является цифрой c. Может иметь несколько значений; 0,7,12,16,18,101 ++, но только ОДИН из этих значений на документ

Я хочу получить документы со значениями 7,12 и 16

Я пытался использовать BooleanQuery с условиями, которые у меня были не повезло с. Я полагаю, что это потому, что я не ищу строку.

Я попытался использовать NumericRangeFilter.NewIntRange( и установить минимальное и максимальное значение на фактическое значение, которое я заинтересован в получении.

У меня есть этот код:

public static Query AddRangeFilter(this Query query, string fieldName, IEnumerable<int> validAlternatives)
{
    if (!validAlternatives.Any())
        return query;

    foreach (var alternative in validAlternatives)
    {
        var filter = NumericRangeFilter.NewIntRange(fieldName, 1, alternative, alternative, true, true);
        query = new FilteredQuery(query, filter);
    }

    return query;
}

, который отлично работает, если я отправлю единственное число в списке. Но если я отправлю больше, это не сработает, естественно, потому что он ищет t.ex. документ со значениями 7 и 12, который не существует, поскольку все документы имеют только единственное число.

Как я могу выполнить этот поиск для 7 ИЛИ 12? Имейте в виду, что this Query query в AddRangeFilter уже содержит части запроса.

1 Ответ

0 голосов
/ 22 января 2020

Я нашел способ решить это. Это не идеально, и, вероятно, очень неэффективно, если у вас их больше.

public static Query AddRangeFilter(this Query query, string fieldName, IEnumerable<int> validAlternatives)
{
    if (!validAlternatives.Any())
        return query;

    var booleanQuery = new BooleanQuery { MinimumNumberShouldMatch = 1 };
    foreach (var alternative in validAlternatives)
    {
        var thing = NumericRangeFilter.NewIntRange(fieldName, 1, alternative, alternative, true, true);
        booleanQuery.Add(new FilteredQuery(query, thing), Occur.SHOULD);
    }

    return booleanQuery;
}

Если есть какие-то лучшие ответы, мне очень интересно их увидеть.

...