Lucene: логическое ИЛИ в MultiFieldQueryParser - PullRequest
1 голос
/ 11 января 2012

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

Кто-нибудь знает способ формирования многопользовательского запроса, включая логические И * и логические ИЛИ?

Спасибо, Рик

1 Ответ

0 голосов
/ 12 января 2012

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

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

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

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