Example usage for org.apache.lucene.search BooleanQuery BooleanQuery

List of usage examples for org.apache.lucene.search BooleanQuery BooleanQuery

Introduction

In this page you can find the example usage for org.apache.lucene.search BooleanQuery BooleanQuery.

Prototype

BooleanQuery

Source Link

Usage

From source file:com.vmware.dcp.services.common.LuceneBlobIndexService.java

License:Open Source License

private void applyBlobRetentionPolicy(Query linkQuery, long updateTime) throws IOException {
    IndexWriter wr = this.writer;
    if (wr == null) {
        return;//from  www. j av  a 2  s  . c  o m
    }

    if (!this.indexOptions.contains(BlobIndexOption.SINGLE_USE_KEYS)) {
        return;
    }

    BooleanQuery bq = new BooleanQuery();
    bq.add(linkQuery, Occur.MUST);
    NumericRangeQuery<Long> timeQuery = NumericRangeQuery.newLongRange(URI_PARAM_NAME_UPDATE_TIME, null,
            updateTime, false, true);
    bq.add(timeQuery, Occur.MUST);
    wr.deleteDocuments(linkQuery);
    this.indexUpdateTimeMicros = Utils.getNowMicrosUtc();
}

From source file:com.vmware.dcp.services.common.LuceneDocumentIndexService.java

License:Open Source License

/**
 * Augment the query argument with the resource group query specified
 * by the operation's authorization context.
 *
 * If the operation was executed by the system user, the query argument
 * is returned unmodified.//from w ww  . ja v a 2s . com
 *
 * If no query needs to be executed return null
 *
 * @return Augmented query.
 */
private Query updateQuery(Operation op, Query tq) {
    Query rq = null;
    AuthorizationContext ctx = op.getAuthorizationContext();

    // Allow operation if isAuthorizationEnabled is set to false
    if (!this.getHost().isAuthorizationEnabled()) {
        return tq;
    }

    if (ctx == null) {
        // Don't allow operation if no authorization context and auth is enabled
        return null;
    }

    // Allow unconditionally if this is the system user
    if (ctx.isSystemUser()) {
        return tq;
    }

    // If the resource query in the authorization context is unspecified,
    // use a Lucene query that doesn't return any documents so that every
    // result will be empty.
    if (ctx.getResourceQuery() == null) {
        rq = new MatchNoDocsQuery();
    } else {
        rq = LuceneQueryConverter.convertToLuceneQuery(ctx.getResourceQuery());
    }

    BooleanQuery bq = new BooleanQuery();
    bq.add(rq, Occur.FILTER);
    bq.add(tq, Occur.FILTER);
    return bq;
}

From source file:com.vmware.dcp.services.common.LuceneDocumentIndexService.java

License:Open Source License

/**
 * Deletes all indexed documents with range of deleteCount,indexed with the specified self link
 *
 * @throws Throwable/*from  w w  w . ja v  a2  s .co m*/
 */
private void deleteDocumentsFromIndex(Operation delete, String link, SelfLinkInfo info, long versionsToKeep)
        throws Throwable {
    IndexWriter wr = this.writer;
    if (wr == null) {
        delete.fail(new CancellationException());
        return;
    }

    Query linkQuery = new TermQuery(new Term(ServiceDocument.FIELD_NAME_SELF_LINK, link));

    IndexSearcher s = updateSearcher(link, Integer.MAX_VALUE, wr);
    if (s == null) {
        delete.fail(new CancellationException());
        return;
    }

    TopDocs results;

    results = s.search(linkQuery, Integer.MAX_VALUE, this.versionSort, false, false);
    if (results == null) {
        return;
    }

    ScoreDoc[] hits = results.scoreDocs;

    if (hits == null || hits.length == 0) {
        return;
    }

    Document hitDoc = s.doc(hits[0].doc);

    if (versionsToKeep == 0) {
        // we are asked to delete everything, no need to sort or query
        this.selfLinks.remove(link);
        wr.deleteDocuments(linkQuery);
        this.indexUpdateTimeMicros = Utils.getNowMicrosUtc();
        delete.complete();
        return;
    }

    if (hits.length < versionsToKeep) {
        return;
    }

    BooleanQuery bq = new BooleanQuery();
    // grab the document at the tail of the results, and use it to form a new query
    // that will delete all documents from that document up to the version at the
    // retention
    // limit
    hitDoc = s.doc(hits[hits.length - 1].doc);
    long versionLowerBound = Long.parseLong(hitDoc.get(ServiceDocument.FIELD_NAME_VERSION));
    hitDoc = s.doc(hits[(int) versionsToKeep - 1].doc);
    long versionUpperBound = Long.parseLong(hitDoc.get(ServiceDocument.FIELD_NAME_VERSION));

    NumericRangeQuery<Long> versionQuery = NumericRangeQuery.newLongRange(ServiceDocument.FIELD_NAME_VERSION,
            versionLowerBound, versionUpperBound, true, true);

    bq.add(versionQuery, Occur.MUST);
    bq.add(linkQuery, Occur.MUST);
    results = s.search(bq, Integer.MAX_VALUE);
    long now = Utils.getNowMicrosUtc();
    logInfo("trimming index for %s from %d to %d, query returned %d", link, hits.length, versionsToKeep,
            results.totalHits);
    wr.deleteDocuments(bq);
    if (info != null) {
        info.updateMicros = now;
    }
    this.indexUpdateTimeMicros = now;
    delete.complete();
}

From source file:com.vmware.dcp.services.common.LuceneQueryConverter.java

License:Open Source License

static Query convertToLuceneBooleanQuery(QueryTask.Query query) {
    BooleanQuery parentQuery = new BooleanQuery();

    // Recursively build the boolean query. We allow arbitrary nesting and grouping.
    for (QueryTask.Query q : query.booleanClauses) {
        buildBooleanQuery(parentQuery, q);
    }/*w w  w  . jav  a 2s  . c  o m*/
    return parentQuery;
}

From source file:com.xpn.xwiki.plugin.lucene.GlobalIndexUpdater.java

License:Open Source License

private void deleteDocFromIndex(Document doc) throws Exception {
    BooleanQuery bq = new BooleanQuery();
    Query q1 = queryParser.parse("hostname:" + doc.get("hostname"));
    bq.add(q1, BooleanClause.Occur.MUST);
    TermQuery q2 = new TermQuery(new Term("_docid", doc.get("_docid")));
    bq.add(q2, BooleanClause.Occur.MUST);

    Hits hits = getHits(bq);//from  w  w  w. j  a v  a2s.c  o  m

    if (hits.length() > 0) {
        try {
            deleteFromIndex(hits.id(0));
        } catch (Exception e) {
        }
    }
}

From source file:com.xpn.xwiki.plugin.lucene.IndexRebuilder.java

License:Open Source License

public boolean isIndexed(DocumentReference documentReference, String version, String language,
        Searcher searcher) {//from   w  w w.  j  a v  a2s  .  c  om
    boolean exists = false;

    BooleanQuery query = new BooleanQuery();

    query.add(new TermQuery(new Term(IndexFields.DOCUMENT_NAME, documentReference.getName().toLowerCase())),
            BooleanClause.Occur.MUST);
    query.add(
            new TermQuery(new Term(IndexFields.DOCUMENT_SPACE,
                    documentReference.getLastSpaceReference().getName().toLowerCase())),
            BooleanClause.Occur.MUST);
    query.add(new TermQuery(
            new Term(IndexFields.DOCUMENT_WIKI, documentReference.getWikiReference().getName().toLowerCase())),
            BooleanClause.Occur.MUST);

    if (version != null) {
        query.add(new TermQuery(new Term(IndexFields.DOCUMENT_VERSION, version)), BooleanClause.Occur.MUST);
    }

    if (language != null) {
        query.add(new TermQuery(
                new Term(IndexFields.DOCUMENT_LANGUAGE, StringUtils.isEmpty(language) ? "default" : language)),
                BooleanClause.Occur.MUST);
    }

    try {
        TopDocs topDocs = searcher.search(query, 1);

        exists = topDocs.totalHits == 1;
    } catch (IOException e) {
        LOG.error("Faild to search for page [" + documentReference + "] in Lucene index", e);
    }

    return exists;
}

From source file:com.xpn.xwiki.plugin.lucene.internal.IndexRebuilder.java

License:Open Source License

public boolean isIndexed(DocumentReference documentReference, String version, String language,
        IndexSearcher searcher) {/*  w  ww.  j a  v a  2  s  . c om*/
    boolean exists = false;

    BooleanQuery query = new BooleanQuery();

    query.add(new TermQuery(new Term(IndexFields.DOCUMENT_NAME, documentReference.getName().toLowerCase())),
            BooleanClause.Occur.MUST);
    query.add(
            new TermQuery(new Term(IndexFields.DOCUMENT_SPACE,
                    documentReference.getLastSpaceReference().getName().toLowerCase())),
            BooleanClause.Occur.MUST);
    query.add(new TermQuery(
            new Term(IndexFields.DOCUMENT_WIKI, documentReference.getWikiReference().getName().toLowerCase())),
            BooleanClause.Occur.MUST);

    if (version != null) {
        query.add(new TermQuery(new Term(IndexFields.DOCUMENT_VERSION, version)), BooleanClause.Occur.MUST);
    }

    if (language != null) {
        query.add(new TermQuery(
                new Term(IndexFields.DOCUMENT_LANGUAGE, StringUtils.isEmpty(language) ? "default" : language)),
                BooleanClause.Occur.MUST);
    }

    try {
        TopDocs topDocs = searcher.search(query, 1);

        exists = topDocs.totalHits == 1;
    } catch (IOException e) {
        LOGGER.error("Faild to search for page [{}] in Lucene index", documentReference, e);
    }

    return exists;
}

From source file:com.xpn.xwiki.plugin.lucene.LucenePlugin.java

License:Open Source License

/**
 * @param query//from  w ww. ja  va2 s . c  o  m
 * @param virtualWikiNames comma separated list of virtual wiki names
 * @param languages comma separated list of language codes to search in, may be null to search
 *            all languages
 */
private Query buildQuery(String query, String virtualWikiNames, String languages) throws ParseException {
    // build a query like this: <user query string> AND <wikiNamesQuery> AND
    // <languageQuery>
    BooleanQuery bQuery = new BooleanQuery();
    Query parsedQuery = null;

    // for object search
    if (query.startsWith("PROP ")) {
        String property = query.substring(0, query.indexOf(":"));
        query = query.substring(query.indexOf(":") + 1, query.length());
        QueryParser qp = new QueryParser(property, analyzer);
        parsedQuery = qp.parse(query);
        bQuery.add(parsedQuery, BooleanClause.Occur.MUST);
    } else if (query.startsWith("MULTI ")) {
        // for fulltext search
        List<String> fieldList = IndexUpdater.fields;
        String[] fields = fieldList.toArray(new String[fieldList.size()]);
        BooleanClause.Occur[] flags = new BooleanClause.Occur[fields.length];
        for (int i = 0; i < flags.length; i++) {
            flags[i] = BooleanClause.Occur.SHOULD;
        }
        parsedQuery = MultiFieldQueryParser.parse(query, fields, flags, analyzer);
        bQuery.add(parsedQuery, BooleanClause.Occur.MUST);
    } else {
        QueryParser qp = new QueryParser("ft", analyzer);
        parsedQuery = qp.parse(query);
        bQuery.add(parsedQuery, BooleanClause.Occur.MUST);
    }

    if (virtualWikiNames != null && virtualWikiNames.length() > 0) {
        bQuery.add(buildOredTermQuery(virtualWikiNames, IndexFields.DOCUMENT_WIKI), BooleanClause.Occur.MUST);
    }
    if (languages != null && languages.length() > 0) {
        bQuery.add(buildOredTermQuery(languages, IndexFields.DOCUMENT_LANGUAGE), BooleanClause.Occur.SHOULD);
    }

    return bQuery;
}

From source file:com.xpn.xwiki.plugin.lucene.LucenePlugin.java

License:Open Source License

/**
 * @param values comma separated list of values to look for
 * @return A query returning documents matching one of the given values in the given field
 *//*ww w  .j a v a 2 s . c om*/
private Query buildOredTermQuery(final String values, final String fieldname) {
    String[] valueArray = values.split("\\,");
    if (valueArray.length > 1) {
        // build a query like this: <valueArray[0]> OR <valueArray[1]> OR ...
        BooleanQuery orQuery = new BooleanQuery();
        for (int i = 0; i < valueArray.length; i++) {
            orQuery.add(new TermQuery(new Term(fieldname, valueArray[i].trim())), BooleanClause.Occur.SHOULD);
        }
        return orQuery;
    }

    // exactly one value, no OR'ed Terms necessary
    return new TermQuery(new Term(fieldname, valueArray[0]));
}

From source file:com.Yasna.forum.database.DbQuery.java

License:Open Source License

/**
 * Execute the query and store the results in the results array.
 *///from   ww w  .  jav a2 s.co  m
private void executeQuery() {
    try {
        Searcher searcher = getSearcher();
        if (searcher == null) {
            //Searcher can be null if the index doesn't exist.
            results = new int[0];
            return;
        }

        org.apache.lucene.search.Query bodyQuery = QueryParser.parse(queryString, "body", analyzer);

        org.apache.lucene.search.Query subjectQuery = QueryParser.parse(queryString, "subject", analyzer);

        String forumID = Integer.toString(forum.getID());

        BooleanQuery comboQuery = new BooleanQuery();
        comboQuery.add(subjectQuery, false, false);
        comboQuery.add(bodyQuery, false, false);

        MultiFilter multiFilter = new MultiFilter(3);

        //Forum filter
        multiFilter.add(new FieldFilter("forumID", forumID));

        //Date filter
        if (beforeDate != null || afterDate != null) {
            if (beforeDate != null && afterDate != null) {
                multiFilter.add(new DateFilter("creationDate", beforeDate, afterDate));
            } else if (beforeDate == null) {
                multiFilter.add(DateFilter.After("creationDate", afterDate));
            } else {
                multiFilter.add(DateFilter.Before("creationDate", beforeDate));
            }
        }

        //User filter
        if (user != null) {
            String userID = Integer.toString(user.getID());
            multiFilter.add(new FieldFilter("userID", userID));
        }

        //Thread filter
        if (thread != null) {
            String threadID = Integer.toString(thread.getID());
            multiFilter.add(new FieldFilter("threadID", threadID));
        }

        Hits hits = searcher.search(comboQuery, multiFilter);
        //Don't return more search results than the maximum number allowed.
        int numResults = hits.length() < MAX_RESULTS_SIZE ? hits.length() : MAX_RESULTS_SIZE;
        int[] messages = new int[numResults];
        for (int i = 0; i < numResults; i++) {
            messages[i] = Integer.parseInt(((Document) hits.doc(i)).get("messageID"));
        }
        results = messages;
    } catch (Exception e) {
        e.printStackTrace();
        results = new int[0];
    }
}