List of usage examples for org.apache.lucene.queryparser.complexPhrase ComplexPhraseQueryParser ComplexPhraseQueryParser
public ComplexPhraseQueryParser(String f, Analyzer a)
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]; } }