Example usage for org.apache.lucene.queryparser.complexPhrase ComplexPhraseQueryParser ComplexPhraseQueryParser

List of usage examples for org.apache.lucene.queryparser.complexPhrase ComplexPhraseQueryParser ComplexPhraseQueryParser

Introduction

In this page you can find the example usage for org.apache.lucene.queryparser.complexPhrase ComplexPhraseQueryParser ComplexPhraseQueryParser.

Prototype

public ComplexPhraseQueryParser(String f, Analyzer a) 

Source Link

Usage

From source file:org.apache.jena.query.text.TextIndexLucene.java

License:Apache License

private QueryParser getQueryParser(Analyzer analyzer) {
    switch (queryParserType) {
    case "QueryParser":
        return new QueryParser(docDef.getPrimaryField(), analyzer);
    case "AnalyzingQueryParser":
        return new AnalyzingQueryParser(docDef.getPrimaryField(), analyzer);
    case "ComplexPhraseQueryParser":
        return new ComplexPhraseQueryParser(docDef.getPrimaryField(), analyzer);
    default:/*from   w  ww  .  ja v  a2 s . com*/
        log.warn("Unknown query parser type '" + queryParserType + "'. Defaulting to standard QueryParser");
        return new QueryParser(docDef.getPrimaryField(), analyzer);
    }
}

From source file:org.apache.solr.search.ComplexPhraseQParserPlugin.java

License:Apache License

@Override
public Query parse() throws SyntaxError {
    String qstr = getString();//from www  .j  av  a 2 s  .  c om

    String defaultField = getParam(CommonParams.DF);
    if (defaultField == null) {
        defaultField = getReq().getSchema().getDefaultSearchFieldName();
    }

    lparser = new ComplexPhraseQueryParser(defaultField, getReq().getSchema().getQueryAnalyzer());

    if (localParams != null)
        inOrder = localParams.getBool("inOrder", inOrder);

    lparser.setInOrder(inOrder);

    QueryParser.Operator defaultOperator = QueryParsing.getQueryParserDefaultOperator(getReq().getSchema(),
            getParam(QueryParsing.OP));

    if (QueryParser.Operator.AND.equals(defaultOperator))
        lparser.setDefaultOperator(org.apache.lucene.queryparser.classic.QueryParser.Operator.AND);
    else
        lparser.setDefaultOperator(org.apache.lucene.queryparser.classic.QueryParser.Operator.OR);

    try {
        return lparser.parse(qstr);
    } catch (ParseException pe) {
        throw new SyntaxError(pe);
    }
}

From source file:org.niord.core.aton.AtonService.java

License:Apache License

/**
 * Performs a Hibernate Search on the AtoN tag values
 * @param value the search string//from   w  w w . j a  va 2  s .  c o  m
 * @return the IDs of the AtoN nodes that matches the search criteria
 */
private List<Integer> searchAtonTagKeys(String value) {

    value = normalize(value);

    FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);

    // Create a query parser with "or" operator as the default
    QueryParser parser = new ComplexPhraseQueryParser("tags.v", new StandardAnalyzer());
    parser.setDefaultOperator(QueryParser.OR_OPERATOR);
    parser.setAllowLeadingWildcard(true); // NB: Expensive!
    org.apache.lucene.search.Query query;
    try {
        query = parser.parse(value);
    } catch (ParseException e) {
        // Make the client suffer
        query = new MatchNoDocsQuery();
    }

    // wrap Lucene query in a javax.persistence.Query
    FullTextQuery persistenceQuery = fullTextEntityManager.createFullTextQuery(query, AtonNode.class);

    // execute search
    @SuppressWarnings("unchecked")
    List<AtonNode> an = (List<AtonNode>) persistenceQuery.getResultList();

    // Returns the ID's of the AtoN nodes
    return an.stream().map(BaseEntity::getId).collect(Collectors.toList());
}

From source file:org.niord.core.LuceneTest.java

License:Apache License

@Test
public void testLucene() throws IOException, ParseException {

    // Something seems to have change in Lucene. In earlier versions (e.g. 4.6), you could
    // use the StandardAnalyzer and quoted phrase searches including stop words (e.g. "the")
    // would still work. See example below:
    // However, in the current version of Lucene, I can only get this scenario to work with
    // SimpleAnalyzer for the QueryParser :-(

    Directory directory = new RAMDirectory();
    Analyzer analyzer = new StandardAnalyzer();
    IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
    iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
    IndexWriter writer = new IndexWriter(directory, iwc);

    Document doc = new Document();

    FieldType ft = new FieldType();
    ft.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS);
    ft.setTokenized(true);/*  w w w .  j ava  2 s . co m*/
    ft.setStoreTermVectors(true);
    ft.setStoreTermVectorPositions(true);
    ft.freeze();

    doc.add(new Field("message", "The quick brown fox jumps over the lazy dog", ft));
    writer.addDocument(doc);
    writer.close();

    IndexReader reader = DirectoryReader.open(directory);
    assertEquals(1, reader.numDocs());

    analyzer = new SimpleAnalyzer();
    QueryParser parser = new ComplexPhraseQueryParser("message", analyzer);
    parser.setDefaultOperator(QueryParser.OR_OPERATOR);
    parser.setAllowLeadingWildcard(true); // NB: Expensive!
    Query query = parser.parse("\"over the lazy\" +quick -goat bro*");

    IndexSearcher searcher = new IndexSearcher(reader);
    TopDocs results = searcher.search(query, 10000);

    assertEquals(1, results.scoreDocs.length);

    reader.close();
}

From source file:org.niord.core.message.MessageLuceneIndex.java

License:Apache License

/**
 * Performs a search in the index and returns the ids of matching messages
 *
 * @param freeTextSearch the search string
 * @param language the language to search
 * @param maxHits the max number of hits to return
 * @return the matching ids//from w  ww .j  a  va 2s .  co m
 */
public List<Long> searchIndex(String freeTextSearch, String language, int maxHits)
        throws IOException, ParseException {

    Query query;
    if (StringUtils.isNotBlank(freeTextSearch)) {
        // Normalize query text
        freeTextSearch = LuceneUtils.normalizeQuery(freeTextSearch);
        String field = searchField(language);

        // Create a query parser with "or" operator as the default
        QueryParser parser = new ComplexPhraseQueryParser(field, getAnalyzer());
        parser.setDefaultOperator(QueryParser.OR_OPERATOR);
        parser.setAllowLeadingWildcard(true); // NB: Expensive!
        query = parser.parse(freeTextSearch);

    } else {
        query = new MatchAllDocsQuery();
    }

    // Perform the search and collect the ids
    IndexSearcher searcher = new IndexSearcher(getIndexReader());
    TopDocs results = searcher.search(query, maxHits);

    List<Long> ids = new ArrayList<>();
    for (ScoreDoc hit : results.scoreDocs) {
        Document d = searcher.doc(hit.doc);
        ids.add(Long.valueOf(d.get(LUCENE_ID_FIELD)));
    }
    return ids;
}

From source file:org.quelea.services.lucene.BibleSearchIndex.java

License:Open Source License

/**
 * Search for bible chapters that match the given filter.
 *
 * @param queryString the query string to filter.
 * @param type ignored - may be null./*from w  ww . j  a  v a 2s  . c  o  m*/
 * @return a list of all bible chapters that match the given filter.
 */
@Override
public BibleChapter[] filter(String queryString, FilterType type) {
    String sanctifyQueryString = SearchIndexUtils.makeLuceneQuery(queryString);
    if (chapters.isEmpty() || sanctifyQueryString.isEmpty()) {
        return chapters.values().toArray(new BibleChapter[chapters.size()]);
    }
    List<BibleChapter> ret;
    try (DirectoryReader dr = DirectoryReader.open(index)) {
        IndexSearcher searcher = new IndexSearcher(dr);
        BooleanQuery.setMaxClauseCount(Integer.MAX_VALUE);
        Query q = new ComplexPhraseQueryParser("text", analyzer).parse(sanctifyQueryString);
        TopScoreDocCollector collector = TopScoreDocCollector.create(10000, 10000);
        searcher.search(q, collector);
        ScoreDoc[] hits = collector.topDocs().scoreDocs;
        ret = new ArrayList<>();
        for (int i = 0; i < hits.length; ++i) {
            int docId = hits[i].doc;
            Document d = searcher.doc(docId);
            BibleChapter chapter = chapters.get(Integer.parseInt(d.get("number")));
            ret.add(chapter);
        }
        return ret.toArray(new BibleChapter[ret.size()]);
    } catch (ParseException | IOException ex) {
        LOGGER.log(Level.WARNING, "Invalid query string: " + sanctifyQueryString, ex);
        return new BibleChapter[0];
    }
}

From source file:org.quelea.services.lucene.SongSearchIndex.java

License:Open Source License

/**
 * Search for songs that match the given filter.
 *
 * @param queryString the query to use to search.
 * @param type TITLE or BODY, depending on what to search in. BODY is
 * equivalent to the lyrics, TITLE the title.
 * @return an array of songs that match the filter.
 *//*  w w w .j a va  2s.com*/
@Override
public synchronized SongDisplayable[] filter(String queryString, FilterType type) {
    String sanctifyQueryString = SearchIndexUtils.makeLuceneQuery(queryString);
    if (songs.isEmpty() || sanctifyQueryString.trim().isEmpty()) {
        return songs.values().toArray(new SongDisplayable[songs.size()]);
    }
    String typeStr;
    if (type == FilterType.BODY) {
        typeStr = "lyrics";
    } else if (type == FilterType.TITLE) {
        typeStr = "title";
    } else if (type == FilterType.AUTHOR) {
        typeStr = "author";
    } else {
        LOGGER.log(Level.SEVERE, "Unknown type: {0}", type);
        return new SongDisplayable[0];
    }
    List<SongDisplayable> ret;
    try (DirectoryReader dr = DirectoryReader.open(index)) {
        IndexSearcher searcher = new IndexSearcher(dr);
        Query q = new ComplexPhraseQueryParser(typeStr, analyzer).parse(sanctifyQueryString);
        TopScoreDocCollector collector = TopScoreDocCollector.create(1000, 10000);
        searcher.search(q, collector);
        ScoreDoc[] hits = collector.topDocs().scoreDocs;
        ret = new ArrayList<>();
        for (int i = 0; i < hits.length; ++i) {
            int docId = hits[i].doc;
            Document d = searcher.doc(docId);
            final Long songNumber = Long.parseLong(d.get("number"));
            SongDisplayable song = songs.get(songNumber);
            ret.add(song);
        }
        if (type == FilterType.BODY) {
            for (SongDisplayable song : filter(queryString, FilterType.TITLE)) {
                ret.remove(song);
            }
        }
        return ret.toArray(new SongDisplayable[ret.size()]);
    } catch (ClosedByInterruptException | ThreadInterruptedException ex) {
        //Ignore, thread is being shut down by other character being typed
        return new SongDisplayable[0];
    } catch (ParseException | IOException ex) {
        LOGGER.log(Level.WARNING, "Invalid query string: " + sanctifyQueryString, ex);
        return new SongDisplayable[0];
    }
}