List of usage examples for org.apache.lucene.search SynonymQuery SynonymQuery
@Deprecated
public SynonymQuery(Term... terms)
From source file:org.codelibs.elasticsearch.index.query.SimpleQueryParser.java
License:Apache License
/** * Analyze the given string using its analyzer, constructing either a * {@code PrefixQuery} or a {@code BooleanQuery} made up * of {@code TermQuery}s and {@code PrefixQuery}s *///from ww w . j av a 2 s .c o m private Query newPossiblyAnalyzedQuery(String field, String termStr) { List<List<BytesRef>> tlist = new ArrayList<>(); // get Analyzer from superclass and tokenize the term try (TokenStream source = getAnalyzer().tokenStream(field, termStr)) { source.reset(); List<BytesRef> currentPos = new ArrayList<>(); CharTermAttribute termAtt = source.addAttribute(CharTermAttribute.class); PositionIncrementAttribute posAtt = source.addAttribute(PositionIncrementAttribute.class); try { boolean hasMoreTokens = source.incrementToken(); while (hasMoreTokens) { if (currentPos.isEmpty() == false && posAtt.getPositionIncrement() > 0) { tlist.add(currentPos); currentPos = new ArrayList<>(); } final BytesRef term = getAnalyzer().normalize(field, termAtt.toString()); currentPos.add(term); hasMoreTokens = source.incrementToken(); } if (currentPos.isEmpty() == false) { tlist.add(currentPos); } } catch (IOException e) { // ignore // TODO: we should not ignore the exception and return a prefix query with the original term ? } } catch (IOException e) { // Bail on any exceptions, going with a regular prefix query return new PrefixQuery(new Term(field, termStr)); } if (tlist.size() == 0) { return null; } if (tlist.size() == 1 && tlist.get(0).size() == 1) { return new PrefixQuery(new Term(field, tlist.get(0).get(0))); } // build a boolean query with prefix on the last position only. BooleanQuery.Builder builder = new BooleanQuery.Builder(); for (int pos = 0; pos < tlist.size(); pos++) { List<BytesRef> plist = tlist.get(pos); boolean isLastPos = (pos == tlist.size() - 1); Query posQuery; if (plist.size() == 1) { if (isLastPos) { posQuery = new PrefixQuery(new Term(field, plist.get(0))); } else { posQuery = newTermQuery(new Term(field, plist.get(0))); } } else if (isLastPos == false) { // build a synonym query for terms in the same position. Term[] terms = new Term[plist.size()]; for (int i = 0; i < plist.size(); i++) { terms[i] = new Term(field, plist.get(i)); } posQuery = new SynonymQuery(terms); } else { BooleanQuery.Builder innerBuilder = new BooleanQuery.Builder(); for (BytesRef token : plist) { innerBuilder.add( new BooleanClause(new PrefixQuery(new Term(field, token)), BooleanClause.Occur.SHOULD)); } posQuery = innerBuilder.setDisableCoord(true).build(); } builder.add(new BooleanClause(posQuery, getDefaultOperator())); } return builder.build(); }
From source file:org.codelibs.elasticsearch.index.search.MatchQuery.java
License:Apache License
protected Query blendTermsQuery(Term[] terms, MappedFieldType fieldType) { return new SynonymQuery(terms); }
From source file:org.elasticsearch.index.search.QueryStringQueryParser.java
License:Apache License
private Query getPossiblyAnalyzedPrefixQuery(String field, String termStr) throws ParseException { if (analyzeWildcard == false) { return super.getPrefixQuery(field, termStr); }/*from www .ja va 2 s .c om*/ List<List<String>> tlist; // get Analyzer from superclass and tokenize the term TokenStream source = null; try { try { source = getAnalyzer().tokenStream(field, termStr); source.reset(); } catch (IOException e) { return super.getPrefixQuery(field, termStr); } tlist = new ArrayList<>(); List<String> currentPos = new ArrayList<>(); CharTermAttribute termAtt = source.addAttribute(CharTermAttribute.class); PositionIncrementAttribute posAtt = source.addAttribute(PositionIncrementAttribute.class); while (true) { try { if (!source.incrementToken()) break; } catch (IOException e) { break; } if (currentPos.isEmpty() == false && posAtt.getPositionIncrement() > 0) { tlist.add(currentPos); currentPos = new ArrayList<>(); } currentPos.add(termAtt.toString()); } if (currentPos.isEmpty() == false) { tlist.add(currentPos); } } finally { if (source != null) { IOUtils.closeWhileHandlingException(source); } } if (tlist.size() == 0) { return new MatchNoDocsQuery("analysis was empty for " + field + ":" + termStr); } if (tlist.size() == 1 && tlist.get(0).size() == 1) { return super.getPrefixQuery(field, tlist.get(0).get(0)); } // build a boolean query with prefix on the last position only. List<BooleanClause> clauses = new ArrayList<>(); for (int pos = 0; pos < tlist.size(); pos++) { List<String> plist = tlist.get(pos); boolean isLastPos = (pos == tlist.size() - 1); Query posQuery; if (plist.size() == 1) { if (isLastPos) { posQuery = super.getPrefixQuery(field, plist.get(0)); } else { posQuery = newTermQuery(new Term(field, plist.get(0))); } } else if (isLastPos == false) { // build a synonym query for terms in the same position. Term[] terms = new Term[plist.size()]; for (int i = 0; i < plist.size(); i++) { terms[i] = new Term(field, plist.get(i)); } posQuery = new SynonymQuery(terms); } else { List<BooleanClause> innerClauses = new ArrayList<>(); for (String token : plist) { innerClauses .add(new BooleanClause(super.getPrefixQuery(field, token), BooleanClause.Occur.SHOULD)); } posQuery = getBooleanQuery(innerClauses); } clauses.add(new BooleanClause(posQuery, getDefaultOperator() == Operator.AND ? BooleanClause.Occur.MUST : BooleanClause.Occur.SHOULD)); } return getBooleanQuery(clauses); }
From source file:org.elasticsearch.index.search.SimpleQueryStringQueryParser.java
License:Apache License
/** * Analyze the given string using its analyzer, constructing either a * {@code PrefixQuery} or a {@code BooleanQuery} made up * of {@code TermQuery}s and {@code PrefixQuery}s *//* w w w .j a v a 2 s .co m*/ private Query newPossiblyAnalyzedQuery(String field, String termStr, Analyzer analyzer) { List<List<BytesRef>> tlist = new ArrayList<>(); try (TokenStream source = analyzer.tokenStream(field, termStr)) { source.reset(); List<BytesRef> currentPos = new ArrayList<>(); CharTermAttribute termAtt = source.addAttribute(CharTermAttribute.class); PositionIncrementAttribute posAtt = source.addAttribute(PositionIncrementAttribute.class); try { boolean hasMoreTokens = source.incrementToken(); while (hasMoreTokens) { if (currentPos.isEmpty() == false && posAtt.getPositionIncrement() > 0) { tlist.add(currentPos); currentPos = new ArrayList<>(); } final BytesRef term = analyzer.normalize(field, termAtt.toString()); currentPos.add(term); hasMoreTokens = source.incrementToken(); } if (currentPos.isEmpty() == false) { tlist.add(currentPos); } } catch (IOException e) { // ignore // TODO: we should not ignore the exception and return a prefix query with the original term ? } } catch (IOException e) { // Bail on any exceptions, going with a regular prefix query return new PrefixQuery(new Term(field, termStr)); } if (tlist.size() == 0) { return null; } if (tlist.size() == 1 && tlist.get(0).size() == 1) { return new PrefixQuery(new Term(field, tlist.get(0).get(0))); } // build a boolean query with prefix on the last position only. BooleanQuery.Builder builder = new BooleanQuery.Builder(); for (int pos = 0; pos < tlist.size(); pos++) { List<BytesRef> plist = tlist.get(pos); boolean isLastPos = (pos == tlist.size() - 1); Query posQuery; if (plist.size() == 1) { if (isLastPos) { posQuery = new PrefixQuery(new Term(field, plist.get(0))); } else { posQuery = newTermQuery(new Term(field, plist.get(0))); } } else if (isLastPos == false) { // build a synonym query for terms in the same position. Term[] terms = new Term[plist.size()]; for (int i = 0; i < plist.size(); i++) { terms[i] = new Term(field, plist.get(i)); } posQuery = new SynonymQuery(terms); } else { BooleanQuery.Builder innerBuilder = new BooleanQuery.Builder(); for (BytesRef token : plist) { innerBuilder.add( new BooleanClause(new PrefixQuery(new Term(field, token)), BooleanClause.Occur.SHOULD)); } posQuery = innerBuilder.build(); } builder.add(new BooleanClause(posQuery, getDefaultOperator())); } return builder.build(); }