Статьи

Реализация собственного LuceneQParserPlugin для Solr

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