SOLR, применение функций к параметрам в запросах - PullRequest
0 голосов
/ 18 сентября 2018

Я новичок в SOLR, и в настоящее время я работаю с версией 7.4, и мне нужна ваша помощь для решения следующей проблемы. Со стандартными встроенными парсерами запросов SOLR, есть ли возможность использовать пользовательские функции для параметров, как в следующем примере?

Поле 1: КустоФункция («Блабла»)

Цель состоит в том, чтобы использовать ту же функцию при загрузке field1, а затем применить некоторый запрос с этой же функцией, примененной к параметрам.

Ниже приведен более конкретный пример:

Идея состоит в том, чтобы отфильтровать результат с помощью функции, используемой при загрузке

В моем примере я хотел бы сравнить поля, которые заполнены во время загрузки, используя встроенную функцию:

Вот мой загрузчик, определенный в db-data-config.xml:

<entity name="suspect" query="select UID,                                        
                            trim(FIELD1) AS FIELD1,…,                                    
                            trim (FIELD1) AS FIELD1C    
                            trim(FIELD1) AS FIELD1C _D1,
                            trim(FIELD1) AS FIELD1C_D234, ..
            from myview"  
transformer=
"ch.eri.thirdparty.solr.handler.dataimport.ReadFileTransformer">
        <field column="UID" name="id" />
        <field column=" FIELD1" name="field1" encoder=”C1”/>
        <field column=" FIELD1C" name="field1c" encoder=”C1”/>
<field column=" FIELD1D_D1" name=" field1c_digit1"/>
        <field column=" FIELD1C_D234" name=" field1c_digit234"/>

Теперь во время загрузки заполнения PHN_D1 и PH_D123 с моим настроенным ch.eri.thirdparty.solr.handler.dataimport.ReadFileTransformer, как показано ниже:

@Override
public Object transformRow(Map<String, Object> row, Context context) {
    List<Map<String, String>> fields = context.getAllEntityFields();
    //Map<String,Object> mem = new HashMap<String,Object>();

    for (Map<String, String> field : fields) {
        // Check if this field has readFile="true" specified in the data-config.xml
        String encoder = field.get("encoder");
        String columnName = field.get(DataImporter.COLUMN);
        //if(mem.containsKey(columnName))
        //   row.put(columnName,mem.get(columnName));

        if(encoder!=null) {

            columnName = field.get(DataImporter.COLUMN);

            Object toEncode= row.get(columnName); //0000
            if(toEncode!=null && toEncode instanceof String) {
              try {//need to work on toENcode
                Encoder codec = EncoderHelper.getEncoder(encoder);
                String code =String.valueOf(codec.encode(toEncode));
                row.put(columnName, code);
                if (encoder.equals("C1")) {
                   if(code.length()==4) {
                     String prefix = code.substring(0,1);
                     String suffix =  code.substring(1);
                     //override
                     row.put(columnName + "_D1", prefix);
                     row.put(columnName + "_D234", suffix);
                   }
                   else {
                     //override
                     row.put(columnName + "_D1", "X");
                     row.put(columnName + "_D234", "XXX");
                   }

                }

              }catch (Throwable t){
                LOGGER.error("Error while reading file!!! ",t);
              }
            }
            else {
              row.put(columnName, "NULL");
            }
          }
        }
    return row;
}

Теперь, когда я запрашиваю результаты, я хотел бы применить функцию к моим параметрам и использовать встроенную функцию в SOLR и не использовать ее из моего клиента.

Как пример:

field1, field1c,field1c_digit1,field1c_digit123 
TOTO,   T300   ,             T,          300
COCO,   C200   ,             C,          200    
RIRI,   R600   ,             R,          600    

В идеале я хотел бы протестировать следующий параметр TOXOLH, шифрование этого параметра дает T240 (Soundex) и будет делать что-то вроде этого:

Substing(Encode(TOXOL),0,1) == field1c_digit1 AND 
abs(Integer.valueOf(substing(Encode(TOXOL),1,3))- field1c_digit123) <70

ТОТО должно быть результатом.

Моя точка зрения заключается в том, чтобы использовать функции в запросах, потому что я не догадываюсь, что наши клиенты хотят делать и какие правила они хотят реализовать (у каждого могут быть свои «странные» правила, созданные внутри их СО, то есть в этом В случае использования у них есть некоторые правила для первой цифры и некоторая дельта для третьей последней цифры). Я думал, что было бы проще делегировать все это индивидуальной реализации SOLR для каждого клиента, и что наше приложение предоставляет базовые вещи через общий интерфейс, чтобы разделить задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...