У меня есть база данных с 10 полей, и мне нужно построить запрос, который выглядит как следующий код псевдо:Lucene: Логическое ИЛИ в MultiFieldQueryParser
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 и СЛЕДУЕТ, и мы можем установить оператор MultiFieldQueryParser по умолчанию как AND, так и OR.
Когда я пытаюсь использовать И и устанавливать поля 1-7 с ДОЛЖНЫМИ и полями 8-10 с СЛЕДУЕТ, анализатор запросов в основном игнорирует поля 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 не аккуратно вернуть мне массивы строк и BooleanClause.Occurs, но вы получите идея.
Кто-нибудь знает способ формирования многопоточного запроса, включая как логические ИО , так и булевых ORs?
Спасибо, Rik
Вопрос не то, что я не знаю, как сформировать общий запрос, проблема заключается в том, как делать логическое ИЛИ, в отличие от логического И. Недопустимая нотация, которую вы используете выше, аналогична логическому И, но нотация СЛЕДУЕТ не обязательно аналогична логическому ИЛИ. – RikSaunderson
@RikSaunderson: ДОЛЖЕН не эквивалентен И, а также не ДОЛЖЕН эквивалентно ИЛИ. Однако у них есть равная выразительная сила. Ваш запрос - просто '+ field1: A ... + field7: G + (field8: H field9: I ...)'. – Xodarap