/** * Copyright 2011 Molindo GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package at.molindo.elastic.compass; import org.compass.core.Compass; import org.compass.core.CompassHits; import org.compass.core.CompassQuery; import org.compass.core.CompassQueryFilter; import org.compass.core.CompassSession; import org.compass.core.Resource; import org.compass.core.engine.SearchEngineException; import org.compass.core.engine.SearchEngineQuery; import org.compass.core.engine.SearchEngineQueryFilter; import org.compass.core.impl.DefaultCompassHits; import org.compass.core.impl.DefaultCompassQuery; import org.compass.core.impl.DefaultCompassQueryFilter; import org.compass.core.spi.InternalCompass; import org.compass.core.spi.InternalCompassQuery; import org.compass.core.spi.InternalCompassSession; import at.molindo.elastic.filter.Filter; import at.molindo.elastic.query.Query; import at.molindo.elastic.term.TermFreqVector; /** * Allows to create Compass related objects based on external (internally no supported by Compass) * Lucene objects. * * @author kimchy */ public abstract class ElasticHelper { /** * Creates a new {@link CompassQuery} based on a Lucene {@link Query}. * * <p>Allows to create {@link CompassQuery} based on external Lucene {@link Query} that is not supported * by one of Compass query builders. * * @param compass Compass instance * @param query The lucene query to wrap * @return A compass query wrapping the lucene query */ public static CompassQuery createCompassQuery(Compass compass, Query query) { InternalCompass internalCompass = (InternalCompass) compass; SearchEngineQuery searchEngineQuery = new ElasticSearchEngineQuery((ElasticSearchEngineFactory) internalCompass.getSearchEngineFactory(), query); return new DefaultCompassQuery(searchEngineQuery, internalCompass); } /** * Creates a new {@link CompassQuery} based on a Lucene {@link Query}. * * <p>Allows to create {@link CompassQuery} based on external Lucene {@link Query} that is not supported * by one of Compass query builders. * * @param session Compass session * @param query The lucene query to wrap * @return A compass query wrapping the lucene query */ public static CompassQuery createCompassQuery(CompassSession session, Query query) { InternalCompassSession internalCompassSession = (InternalCompassSession) session; SearchEngineQuery searchEngineQuery = new ElasticSearchEngineQuery((ElasticSearchEngineFactory) internalCompassSession.getCompass().getSearchEngineFactory(), query); InternalCompassQuery compassQuery = new DefaultCompassQuery(searchEngineQuery, internalCompassSession.getCompass()); compassQuery.attach(session); return compassQuery; } /** * Returns the underlying {@link LuceneSearchEngineQuery} of the given {@link CompassQuery}. * <p/> * Can be used for example to add custom Sorting using * {@link LuceneSearchEngineQuery#addSort(org.apache.lucene.search.SortField)}, or get the actual lucene query * using {@link org.compass.core.lucene.engine.LuceneSearchEngineQuery#getQuery()}. * * @param query The compass query to extract the lucene search engine query from * @return The lucene search engine query extracted from the compass query */ public static ElasticSearchEngineQuery getElasticSearchEngineQuery(CompassQuery query) { return (ElasticSearchEngineQuery) ((DefaultCompassQuery) query).getSearchEngineQuery(); } /** * Creates a new {@link CompassQueryFilter} based on a Lucene {@link Filter}. * <p/> * Allows to create {@link CompassQueryFilter} based on external Lucene {@link Filter} that is not supported * by one fo Comapss query filter builders. * * @param session Comapss session * @param filter The lucene filter to wrap * @return A compass query filter wrapping lucene query. */ public static CompassQueryFilter createCompassQueryFilter(CompassSession session, Filter filter) { SearchEngineQueryFilter searchEngineQueryFilter = new ElasticSearchEngineQueryFilter(filter); return new DefaultCompassQueryFilter(searchEngineQueryFilter); } /** * Returns the underlying {@link ElasticSearchEngineQueryFilter} of the given {@link CompassQueryFilter}. * <p/> * Can be used to get the actual Lucene {@link Filter} using * {@link org.compass.core.lucene.engine.ElasticSearchEngineQueryFilter#getFilter()}. * * @param filter The compass query filter to extract the lucene search engine query filter from * @return The lucene search engine query filter extracted from the compass query filter */ public static ElasticSearchEngineQueryFilter getElasticSearchEngineQueryFilter(CompassQueryFilter filter) { return (ElasticSearchEngineQueryFilter) ((DefaultCompassQueryFilter) filter).getFilter(); } /** * Returns the underlying {@link ElasticSearchEngineHits} of the given {@link CompassHits}. * <p/> * Used mainly to access the actual Lucene {@link org.apache.lucene.search.Hits}, or get * Lucene {@link org.apache.lucene.search.Explanation}. */ public static ElasticSearchEngineHits getElasticSearchEngineHits(CompassHits hits) { return (ElasticSearchEngineHits) ((DefaultCompassHits) hits).getSearchEngineHits(); } /** * Returns the given search engine "internals" used for search. For Lucene, returns * {@link LuceneSearchEngineInternalSearch} which allows to access Lucene * {@link org.apache.lucene.index.IndexReader} and {@link org.apache.lucene.search.Searcher}. * <p/> * The search intenrals will be ones that are executed against the whole index. In order to search on * specific aliases or sub indexes, please use {@link #getLuceneInternalSearch(org.compass.core.CompassSession,String[],String[])} . * * @param session A compass session within a transaction * @return Lucene search "internals" */ public static ElasticSearchEngineInternalSearch getElasticInternalSearch(CompassSession session) { return getElasticInternalSearch(session, null); } /** * Returns the given search engine "internals" used for search. For Lucene, returns * {@link LuceneSearchEngineInternalSearch} which allows to access Lucene * {@link org.apache.lucene.index.IndexReader} and {@link org.apache.lucene.search.Searcher}. * <p/> * The search can be narrowed down to specific sub indexes or aliases. A <code>null</code> value * means all the sub indexes/aliases. * * @param session A compass sessino within a transaction * @param subIndexes A set of sub indexes to narrow down the index scope * @param aliases A set of aliases to narrow down the index scope * @return Lucene search "internals" */ public static ElasticSearchEngineInternalSearch getElasticInternalSearch(CompassSession session, String[] aliases) { return (ElasticSearchEngineInternalSearch) ((InternalCompassSession) session).getSearchEngine().internalSearch(null, aliases); } /** * Returns all the values of for the given propery name. */ public static String[] findPropertyValues(CompassSession session, String propertyName) throws SearchEngineException { return getElasticInternalSearch(session).getClient().findPropertyValues(propertyName); } public static TermFreqVector getTermFreqVector(CompassSession session, Resource resource, String field) { resource = ((InternalCompassSession) session).getResourceByIdResourceNoCache(resource); return getElasticInternalSearch(session).getClient().getTermFreqVector(resource.getAlias(), ((ElasticResource)resource).getDocId(), field); } }