Я новичок в 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 для каждого клиента, и что наше приложение предоставляет базовые вещи через общий интерфейс, чтобы разделить задачи.