2012-01-11 2 views
1

У меня есть база данных с 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

ответ

0

Я не очень понимаю вашу запись, так что трудно выяснить, в чем проблема. Но просто использовать стандартные запросы:

BooleanQuery topQuery = new BooleanQuery(); 
topQuery.add(new TermQuery(...), BooleanClause.Occur.Must); 
etc. 

Или просто сделать это в тексте, и пусть анализатор разобрать его для вас: +field1:A +field2:B ...

+0

Вопрос не то, что я не знаю, как сформировать общий запрос, проблема заключается в том, как делать логическое ИЛИ, в отличие от логического И. Недопустимая нотация, которую вы используете выше, аналогична логическому И, но нотация СЛЕДУЕТ не обязательно аналогична логическому ИЛИ. – RikSaunderson

+1

@RikSaunderson: ДОЛЖЕН не эквивалентен И, а также не ДОЛЖЕН эквивалентно ИЛИ. Однако у них есть равная выразительная сила. Ваш запрос - просто '+ field1: A ... + field7: G + (field8: H field9: I ...)'. – Xodarap

Смежные вопросы