Как программно добавить новый Lookup в DefaultGazetteer

Я хочу программно добавить новый Lookup в загруженный DefaultGazetteer.

Если я добавлю эту строку через файл, она отлично работает

Любая помощь будет очень приветствоваться. Спасибо

String test="hello@code=555.5@code_asociated_description=World@code1=@code2=@code3=@code4=@code5=@code6=@code7=";
gazetter.add(test, new Lookup("glossary.lst", "test", "test", "en"));
theList.add(new GazetteerNode(test, "@"));

person Valijon    schedule 01.06.2015    source источник


Ответы (1)


Это добавит только поиск:

    Lookup l = new Lookup("glossary.lst", "major", "minor", "en", "AnnotType");
    l.features = new HashMap<>();
    l.features.put("someFeatureName", "some value");
    gazetter.add("string to be found", l);

Это обновит линейное определение (файлы .def и .lst):

    LinearDefinition ld = gazetter.getLinearDefinition();

    //add .lst record
    LinearNode ln = new LinearNode("glossary.lst", "minor", "major", "en", "AnnotType");
    ld.add(ln);

    //add Lookup record
    Map<String, Object> features = new HashMap<>();
    features.put("someFeatureName", "some value");
    GazetteerNode gn = new GazetteerNode("string to be found", features);
    gn.setSeparator("@");
    GazetteerList theList = ld.getListsByNode().get(ln);
    theList.add(gn);

    //save updated files 
    theList.store();
    ld.store();

    //optionally re-init the gazetteer to make changes to work 
    gazetter.reInit();

Если конфигурация вашего географического справочника непротиворечива (в основном разделитель), то

theList.store(); ld.store(); gazetter.reInit();

загрузит обновленную конфигурацию. Вам не обязательно комбинировать второй подход с первым. Но поскольку операции store() и reInit() очень затратны по сравнению с добавлением поиска, я не рекомендую вызывать их часто. Я бы предпочел какую-то комбинацию (как вы упомянули в комментариях) или выполнить только добавление поиска, если вам не нужны файлы .def и .lst (возможно, вы уже как-то/где-то сохраняете свои поиски ).

Удаление поисковых запросов

Поиск только:

//This will remove all Lookups for given string
gazetteer.remove("string to be found");

//This will remove a specific Lookup only
//The method is not included in the Gazetteer interface
((DefaultGazetteer) gazetter).removeLookup("string to be found", l);

только линейное определение:

theList.remove(gn);
person dedek    schedule 01.06.2015
comment
Спасибо. Вы действительно помогли мне. Только поиск работал у меня так, как я и ожидал. Второй добавляет в список, но не загружает его (нужно совместить динамическое добавление и обновление lst). - person Valijon; 01.06.2015
comment
Как я могу удалить добавленный Lookup? - person Valijon; 02.06.2015
comment
@Valijon - см. мой обновленный ответ (добавлены некоторые комментарии о необходимости объединить оба и удаление поиска). - person dedek; 03.06.2015
comment
Спасибо. Но он по-прежнему не удаляет поиск. Есть что-то странное: когда я добавляю новый Lookup через 1-й метод, он не отображается в listsByNode экземпляра справочника (режим отладки). Может ли это быть причиной того, чтобы не удалять Lookup? - person Valijon; 03.06.2015
comment
@Valijon - см. мой ответ на ваш новый вопрос: stackoverflow.com/a/30623100/1857897 1-й метод не изменит линейное определение. - person dedek; 03.06.2015