У меня есть база данных с 10 полями, и мне нужно создать запрос, похожий на следующий псевдокод:
theQuery = ((field1 == A) &&
(field2 == B) &&
(field3 == C) &&
(field4 == D) &&
(field5 == E) &&
(field6 == F) &&
(field7 == G) &&
((field8 == H) || (field9 == H) || (field10 == H)))
То есть мне нужны поля 1-7, чтобы определенно содержатьсоответствующая поставляемая переменная и Мне нужна переменная H, чтобы определенно появлялось хотя бы в одном из полей 8-10.
Я пытался использовать MultiFieldQueryParser, но проблема, с которой я столкнулся, заключается в том, что поставляемые BooleanClauses должны быть MUST_NOT и SHOULD, и мы можем установить оператор по умолчанию для MultiFieldQueryParser как И или ИЛИ.
Когда я пытаюсь использовать AND и устанавливать поля 1-7 с MUST и поля 8-10 с SHOULD, анализатор запросов в основном игнорирует поля 8-10 и возвращает мне все, что содержит указанные данные в полях 1-7.
Я еще не пытался установить для оператора по умолчанию значение ИЛИ, потому что я предполагаю, что запрос вернет результаты, которые содержат одну или несколько предоставленных переменных в полях 1-10.
Для тех, кто хочет видеть код, мой код выглядит следующим образом:
ArrayList queries = new ArrayList();
ArrayList fields = new ArrayList();
ArrayList flags = new ArrayList();
if(varA != null && !varA.equals(""))
{
queries.Add(varA);
fields.Add("field1");
flags.Add(BooleanClause.Occur.Must);
}
//... The same for 2-7
if(varH != null && !varH.equals(""))
{
queries.Add(varA);
queries.Add(varA);
queries.Add(varA);
fields.Add("field8");
fields.Add("field9");
fields.Add("field10");
flags.Add(BooleanClause.Occur.Should);
flags.Add(BooleanClause.Occur.Should);
flags.Add(BooleanClause.Occur.Should);
}
Query q = MultiFieldQueryParser.parse(VERSION.LUCENE_34,
queries.toArray(),
fields.toArray(),
flags.toArray(),
theAnalyzer);
Очевидно, что это несколько упрощается, поскольку ArrayLists не возвращают мне аккуратно массивы Strings и BooleanClause.Occurs, но вы получаетеidea.
Кто-нибудь знает способ формирования многопользовательского запроса, включая логические И * и логические ИЛИ?
Спасибо, Рик