SOLR,将函数应用于查询中的参数

时间:2018-09-18 08:20:51

标签: solr

我是SOLR的新手,目前正在使用7.4版,需要您的帮助来解决以下问题。 使用标准的嵌入式SOLR查询的解析器,是否可以在参数上使用自定义函数,如以下示例所示?

字段1:CustomeFunction(“ Blabla”)

目标是在loadfield1时使用相同的函数,然后使用对该参数应用相同的函数进行查询。

以下是根据要求提供的更具体的示例:

想法是通过加载时使用的函数过滤结果

在我的示例中,我想比较使用嵌入式功能在加载时填充的字段:

这是我在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"/>

现在在使用我自定义的ch.eri.thirdparty.solr.handler.dataimport.ReadFileTransformer加载填充PHN_D1和PH_D123时,如下所示:

@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

TOTO应该是结果。

我的观点是在查询中使用函数是因为我猜不到我们的客户想要做什么以及他们想要实现哪些规则(每个人可能都有自己的“奇怪”规则,这些规则是由他们的CO内部制定的,即用例中,他们在第一个数字上有一些规则,在最后三个数字上有一些增量)。我认为将所有这些委托给每个客户的SOLR的自定义实现会更容易,并且我们的应用程序通过通用接口提供基本功能,从而使您不必担心。

0 个答案:

没有答案