Всякий раз, когда вам нужно реализовать анализатор запросов в 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 черепки.
