Вложенные операторы запрета / запроса в поисковых запросах Lucene - PullRequest
3 голосов
/ 12 мая 2009

Я использую Lucene для Java, и мне нужно выяснить, что делает движок, когда я выполняю некоторые непонятные запросы. Возьмите следующий запрос:

+(foo -bar)

Если я использую QueryParser для разбора ввода, я получаю объект BooleanQuery, который выглядит следующим образом:

org.apache.lucene.search.BooleanQuery:
    org.apache.lucene.search.BooleanClause(required=true, prohibited=false):
        org.apache.lucene.search.BooleanQuery:
            org.apache.lucene.search.BooleanClause(required=false, prohibited=false):
                org.apache.lucene.search.TermQuery: foo
            org.apache.lucene.search.BooleanClause(required=false, prohibited=true):
                org.apache.lucene.search.TermQuery: bar

Что ищет Lucene? Это документы, которые ДОЛЖНЫ содержать «foo», но НЕ МОГУТ содержать «bar»? Что делать, если я ищу:

-(foo +bar)

Являются ли те документы, которые НЕ МОГУТ содержать 'foo' и НЕ МОГУТ содержать 'bar'? Или, возможно, те, которые НЕ МОГУТ содержать 'foo', но ДОЛЖНЫ содержать 'bar'?

Если это поможет, вот что я использовал для просмотра результатов QueryParser:

QueryParser parser = new QueryParser("contents", new StandardAnalyzer());
Query query = parser.parse(text);
debug(query, 0);

public static void debug(Object o, int depth) {
    for(int i=0; i<depth; i++) System.out.print("\t");
    System.out.print(o.getClass().getName());

    if(o instanceof BooleanQuery) {
        System.out.println(":");
        for(BooleanClause clause : ((BooleanQuery)o).getClauses()) {
            debug(clause, depth + 1);
        }
    } else if(o instanceof BooleanClause) {
        BooleanClause clause = (BooleanClause)o;
        System.out.println("(required=" + clause.isRequired() + ", prohibited=" + clause.isProhibited() + "):");
        debug(clause.getQuery(), depth + 1);
    } else if(o instanceof TermQuery) {
        TermQuery term = (TermQuery)o;
        System.out.println(": " + term.getTerm().text());
    } else {
        throw new IllegalArgumentException("Unknown object type");
    }
}

Ответы [ 2 ]

1 голос
/ 13 мая 2009

По умолчанию Lucene предполагает наличие отношения OR между терминами, поэтому первый запрос эквивалентен

+(foo OR -bar)

, который будет соответствовать документам, которые содержат (в поле по умолчанию) "foo" или не содержат "bar"

Во втором запросе «+» делает обязательным «bar», что делает необязательный «foo» избыточным, поэтому его можно уменьшить до «-bar», который соответствует всем документам, которые не содержат «bar»

0 голосов
/ 13 мая 2009

Люк http://www.getopt.org/luke/ очень полезно понять, что делают запросы

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