Всякий раз, когда вам нужно реализовать анализатор запросов в Solr, вы начинаете с подкласса LuceneQParserPlugin:
public class MyGroundShakingQueryParser extends LuceneQParserPlugin { public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {} }
Таким образом, вы будете повторно использовать подчеркивающую функциональность и парсер LuceneQParserPlugin. Грамматика синтаксического анализатора определяется в файле QueryParser.jj внутри дерева исходного кода Lucene / Solr.
В QueryParser.jj используется грамматика
BNF . Инструмент
JavaCC реализует синтаксический анализ таких грамматик и производит код Java для вас. Полученный код фактически является синтаксическим анализатором со встроенной проверкой и т. Д.
В Solr есть собственная версия LuceneQParserPlugin: она называется QParserPlugin, и фактически она в значительной степени реализует почти такую же функциональность, что и ее аналог.
Могут быть варианты использования для
настройки грамматики разбора lucene (хранится в QueryParser.jj). После настройки (давайте переименуем файл jj в GroundShakingQueryParser.jj), мы вызываем инструмент javacc, и он создает GroundShakingQueryParser.java и дополнительные классы. Чтобы подключить его к Solr, нам нужно сделать несколько вещей. Окончательное взаимодействие между классами показано на диаграмме классов:
Идя снизу вверх:
1. Вы реализуете свою собственную логику в GroundShakingQueryParser.jj, которая создает GroundShakingQueryParser.java. Убедитесь, что класс расширяет SolrQueryParserBase.
2. Чтобы связать это с Solr, нам нужно расширить класс GroundShakingQueryParser в классе GroundShakingSolrQueryParser.
/** * Solr's default query parser, a schema-driven superset of the classic lucene query parser. * It extends the query parser class with modified grammar stored in GroundShakingQueryParser.jj. */ public class GroundShakingSolrQueryParser extends GroundShakingQueryParser { public GroundShakingSolrQueryParser(QParser parser, String defaultField) { super(parser.getReq().getCore().getSolrConfig().luceneMatchVersion, defaultField, parser); } }
3. Экземпляр GroundShakingSolrQueryParser приобретается в классе GroundShakingLuceneQParser.
class GroundShakingLuceneQParser extends QParser { GroundShakingSolrQueryParser lparser; public GroundShakingLuceneQParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) { super(qstr, localParams, params, req); } @Override public Query parse() throws SyntaxError { String qstr = getString(); if (qstr == null || qstr.length()==0) return null; String defaultField = getParam(CommonParams.DF); if (defaultField==null) { defaultField = getReq().getSchema().getDefaultSearchFieldName(); } lparser = new GroundShakingSolrQueryParser(this, defaultField); lparser.setDefaultOperator (GroundShakingQueryParsing.getQueryParserDefaultOperator(getReq().getSchema(), getParam(QueryParsing.OP))); return lparser.parse(qstr); } @Override public String[] getDefaultHighlightFields() { return lparser == null ? new String[]{} : new String[]{lparser.getDefaultField()}; } }
4. GroundShakingLuceneQParser подключен к GroundShakingQParserPlugin, который расширяет вышеупомянутый QParserPlugin.
public class GroundShakingQParserPlugin extends QParserPlugin { public static String NAME = "lucene"; @Override public void init(NamedList args) { } @Override public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) { return new GroundShakingLuceneQParser(qstr, localParams, params, req); } }
5. Теперь у нас есть собственный GroundShakingLuceneQParser, который можно напрямую расширить в нашем MyGroundShakingQueryParser!
public class MyGroundShakingQueryParser extends GroundShakingLuceneQParserPlugin { public QParser createParser(String qstr, SolrParams localParams, SolrParams params, SolrQueryRequest req) {} }
Чтобы зарегистрировать MyGroundShakingQueryParser в solr, вам нужно добавить следующую строку в solrconfig.xml:
<queryparser class = «com.groundshaking.MyGroundShakingQueryParser» name = «groundhakingqparser» />
Чтобы использовать его, просто укажите имя в defType = groundhaking в качестве параметра запроса к Solr.
Кстати, одним из удобств этой реализации является то, что мы можем развернуть вышеупомянутые классы в jar-каталоге в директории lib ядра solr. То есть мы не должны перестроить SOLR исходного кода и дело с развертыванием некоторой «пользовательской» SOLR черепки.