예제 #1
0
  public QsolParser(QsolConfiguration config, boolean inherit) {
    if (inherit) {
      this.dateFields.addAll(config.dateFields);
      this.findReplace.putAll(config.findReplace);
      this.findReplaceRegEx.addAll(config.findReplaceRegEx);
      this.buildQueryVisitor.setDateParser(config.dateParser);
      this.setParagraphMarker(config.paragraphMarker);
      this.setSentenceMarker(config.sentenceMarker);
      this.setFieldBreakMarker(config.fieldBreakMarker);
      this.buildQueryVisitor.addFieldMappings(config.fieldMapping);
      if (config.zeroPadFields != null) {
        preProcessVisitor.setZeroPadFields(config.zeroPadFields);
      }
    }

    this.opsList.addAll(config.opsList);
    this.orderOfOpsMap.putAll(config.orderOfOpsMap);
  }
예제 #2
0
 /**
  * Set the default space ' ' operator to be an | (OR) instead of & (AND).
  *
  * @since 1.0
  */
 public void setOrAsDefaultOp() {
   preProcessVisitor.setOrAsDefaultOp();
 }
예제 #3
0
  /**
   * Converts Qsol query syntax into a Lucene Query object.
   *
   * @param field default search field
   * @param query Qsol syntax query
   * @param analyzer lucene analyzer to use on terms
   * @return
   * @throws QsolSyntaxException
   * @throws EmptyQueryException
   * @since 1.0
   */
  public Query parse(String field, String query, Analyzer analyzer)
      throws QsolSyntaxException, EmptyQueryException {
    Node root = null;
    // System.out.println("query:" + query);
    preProcessVisitor.setAnalyzer(analyzer);

    buildQueryVisitor.setOrderOfOps(opsList);

    preProcessVisitor.setDateFields(dateFields);
    buildQueryVisitor.setDateFields(dateFields);

    // Two passes over the tree--the first handles the default space
    // operator,
    // performs find/replace expansion, and preps the suggested search if
    // enabled.
    // The second builds the lucene query from the Qsol syntax parse tree.

    QueryParser parser = new QueryParser(new StringReader(query));

    if (useHide) {
      parser.setHideOps(hideOr, hideAnd, hideAndNot, hideProximity);
    }

    parser.setOrderOfOps(orderOfOpsMap);
    assert (parser != null);
    // build parse tree
    try {
      root = parser.Search();
    } catch (com.mhs.qsol.queryparser.ParseException e) {
      throw new QsolParseException(e);
      //        e.printStackTrace();
      //        query = escape(query).toString();
      //        System.out.println("new query:" + query);
      //        return parse(field, query, analyzer);
    }

    // run over parse tree

    // this could be done more efficiently I'm sure
    preProcessVisitor.setFindReplace(findReplace);
    preProcessVisitor.setFindReplaceRegEx(findReplaceRegEx);

    String processedQuery = root.accept(preProcessVisitor, null);

    try {
      parser = new QueryParser(new StringReader(processedQuery));

      parser.setOrderOfOps(orderOfOpsMap);
      // buildQueryVisitor.setQsolParser(parser);
      // build 2nd parse tree from the pre-processed query
      root = parser.Search();
    } catch (Exception e) {
      throw new QsolSyntaxException(e);
    }

    buildQueryVisitor.setAnalyzer(analyzer);
    buildQueryVisitor.setField(field);

    // run over parse tree
    Query luceneQuery = root.accept(buildQueryVisitor, null);

    if (luceneQuery == null) {
      throw new EmptyQueryException("Expanded query is empty");
    }

    return luceneQuery;
  }