Как реализовать поиск с несколькими фильтрами, используя lucene.net

Я новичок в lucene.net. Я хочу реализовать функцию поиска в клиентской базе данных. У меня есть следующий сценарий:

Пользователи будут искать клиентов в зависимости от выбранного города.Если пользователь хочет найти клиентов в другом городе, он должен сменить город и снова выполнить поиск.

Чтобы уточнить результаты поиска, нам нужно предоставить фильтры по областям (множественные), пин-код и т. Д. Другими словами, мне нужны эквивалентные запросы lucene для следующих запросов sql:

SELECT * FROM CLIENTS
     WHERE CITY = N'City1'
     AND (Area like N'%area1%' OR Area like N'%area2%')
SELECT * FROM CILENTS
    WHERE CITY IN ('MUMBAI', 'DELHI')
    AND CLIENTTYPE IN ('GOLD', 'SILVER')

Ниже приведен код, который я реализовал, чтобы обеспечить поиск по городу в качестве фильтра:

private static IEnumerable<ClientSearchIndexItemDto> _search(string searchQuery, string city, string searchField = "")
{
    // validation
    if (string.IsNullOrEmpty(searchQuery.Replace("*", "").Replace("?", "")))
        return new List<ClientSearchIndexItemDto>();

    // set up Lucene searcher
    using (var searcher = new IndexSearcher(_directory, false))
    {
        var hits_limit = 1000;
        var analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);

        // search by single field
        if (!string.IsNullOrEmpty(searchField))
        {
            var parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, searchField, analyzer);
            var query = parseQuery(searchQuery, parser);
            var hits = searcher.Search(query, hits_limit).ScoreDocs;
            var results = _mapLuceneToDataList(hits, searcher);
            analyzer.Close();
            searcher.Dispose();
            return results;
        }
        else // search by multiple fields (ordered by RELEVANCE)
        {
            var parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30, new[]
            {
                "ClientId",
                "ClientName",
                "ClientTypeNames",
                "CountryName",
                "StateName",
                "DistrictName",
                "City",
                "Area",
                "Street",
                "Pincode",
                "ContactNumber",
                "DateModified"
            }, analyzer);
            var query = parseQuery(searchQuery, parser);
            var f = new FieldCacheTermsFilter("City",new[] { city });
            var hits = searcher.Search(query, f, hits_limit, Sort.RELEVANCE).ScoreDocs;
            var results = _mapLuceneToDataList(hits, searcher);
            analyzer.Close();
            searcher.Dispose();
            return results;
        }
    }
}

Теперь я должен предоставить больше фильтров для Area, Pincode и т. Д., В которых Area несколько. Я пробовал BooleanQuery, как показано ниже:

var cityFilter = new TermQuery(new Term("City", city));
var areasFilter = new FieldCacheTermsFilter("Area",areas); -- where type of areas is string[]

BooleanQuery filterQuery = new BooleanQuery();
filterQuery.Add(cityFilter, Occur.MUST);
filterQuery.Add(areasFilter, Occur.MUST); -- here filterQuery.Add not have an overloaded method which accepts string[]

Если мы выполняем ту же операцию с одной областью, то она работает нормально.

Я пробовал с ChainedFilter, как показано ниже, который, кажется, не удовлетворяет требованию. Приведенный ниже код выполняет или операцию по городу и районам. Но необходимо выполнить операцию ИЛИ между районами, указанными в данном городе.

var f = new ChainedFilter(new Filter[] { cityFilter, areasFilter });

Кто-нибудь может подсказать мне, как этого добиться в lucene.net? Ваша помощь будет оценена.

Ответы на вопрос(2)

Ваш ответ на вопрос