Cómo implementar la búsqueda con múltiples filtros usando lucene.net
Soy nuevo en lucene.net. Quiero implementar la funcionalidad de búsqueda en una base de datos de clientes. Tengo el siguiente escenario:
Los usuarios buscarán clientes en función de la ciudad seleccionada actualmente.Si el usuario desea buscar clientes en otra ciudad, debe cambiar la ciudad y realizar la búsqueda nuevamente.Para refinar los resultados de búsqueda, necesitamos proporcionar filtros en Áreas (múltiples), Pincode, etc. En otras palabras, necesito las consultas de lucene equivalentes a las siguientes consultas 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')
A continuación se muestra el código que he implementado para proporcionar búsqueda con ciudad como filtro:
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;
}
}
}
Ahora tengo que proporcionar más filtros en Area, Pincode, etc., en los que Area es múltiple. Intenté BooleanQuery como a continuación:
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[]
Si realizamos la misma operación con un área única, entonces está funcionando bien.
He intentado con ChainedFilter como a continuación, lo que no parece satisfacer el requisito. El siguiente código realiza u opera en ciudades y áreas. Pero el requisito es realizar una operación O entre las áreas provistas en la ciudad dada.
var f = new ChainedFilter(new Filter[] { cityFilter, areasFilter });
¿Alguien puede sugerirme cómo lograr esto en lucene.net? Su ayuda será apreciada