package org.genedb.crawl.elasticsearch.plugin; import java.io.IOException; import org.apache.lucene.index.Term; import org.apache.lucene.search.Query; import org.apache.lucene.search.regex.JakartaRegexpCapabilities; import org.apache.lucene.search.regex.JavaUtilRegexCapabilities; import org.apache.lucene.search.regex.RegexQuery; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.AbstractIndexComponent; import org.elasticsearch.index.Index; import org.elasticsearch.index.query.QueryParsingException; import org.elasticsearch.index.query.QueryParseContext; import org.elasticsearch.index.query.QueryParser; public class RegexQueryParser extends AbstractIndexComponent implements QueryParser { @Inject protected RegexQueryParser(Index index, Settings indexSettings) { super(index, indexSettings); } private String[] names = new String[] { "regex" }; @Override public String[] names() { return names; } @Override public Query parse(QueryParseContext parseContext) throws IOException, QueryParsingException { XContentParser parser = parseContext.parser(); XContentParser.Token token = parser.nextToken(); assert token == XContentParser.Token.FIELD_NAME; String fieldName = parser.currentName(); String value = null; float boost = 1.0f; token = parser.nextToken(); if (token == XContentParser.Token.START_OBJECT) { String currentFieldName = null; while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { currentFieldName = parser.currentName(); } else { if ("term".equals(currentFieldName)) { value = parser.text(); } else if ("value".equals(currentFieldName)) { value = parser.text(); } else if ("boost".equals(currentFieldName)) { boost = parser.floatValue(); } } } parser.nextToken(); } else { value = parser.text(); // move to the next token parser.nextToken(); } if (value == null) { throw new QueryParsingException(index, "No value specified for regex query"); } RegexQuery query = new RegexQuery(new Term(fieldName, value)); //JakartaRegexpCapabilities capabilities = new JakartaRegexpCapabilities(); JavaUtilRegexCapabilities capabilites = new JavaUtilRegexCapabilities( JavaUtilRegexCapabilities.FLAG_CASE_INSENSITIVE + JavaUtilRegexCapabilities.FLAG_DOTALL); query.setRegexImplementation(capabilites); query.setBoost(boost); logger.info(fieldName + ":" + value); logger.info("???"); logger.info(query.getRegexImplementation().getClass().toString()); logger.info("___"); logger.info("terms number : " + query.getTotalNumberOfTerms()); logger.info("rewrite method : " + query.getRewriteMethod()); return query; } }