Elastic Search ttl (время жизни) в файле динамического сопоставления Java - Spring эластичный поиск данных

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

@Document(indexName = "test", type = "test", shards = 1, replicas = 0)
public class ElasticSearchIndexObject {

    private @Id
    @Indexed
    String id;

    private @Indexed("name")
    String name;
}

Мы используем планировщик, который запускается каждые 60 минут, чтобы получать данные из БД и добавлять их в индекс.

Connection conn = dataSource.getConnection();

            stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
            stmt.setFetchSize(FETCH_SIZE);

            rs =  stmt.executeQuery(ESEARCH_QUERY);

            int i=1;
            while (rs.next()) {
                ElasticSearchIndexObject indexObj = new ElasticSearchIndexObject();
                indexObj.setName(rs.getString("name"));
                indexObj.setId(rs.getString("id"));

                indexObjects.add(indexObj);

                i=i+1;
            }

            elasticSearchObjectIndexRepository.save(indexObjects);
            indexObjects.clear();

        }

Этот планировщик запускается каждые 60 минут и добавляет/обновляет индекс.

Добавить — если идентификатора нет в индексе. Обновить — если идентификатор уже есть в индексе.

Проблема с удаленными записями в базе данных. Эти записи не удаляются из индекса и становятся потерянными записями.

Я наткнулся на свойство «ttl» и искал способ добавить его в индекс, чтобы потерянные записи удалялись по истечении времени ttl.

Если ttl не добавляется к каждому индексу, должен ли он быть на общем уровне для всех документов? Если да, должен ли я установить это для каждого запуска расписания?

Спасибо,


person user1578872    schedule 21.08.2015    source источник


Ответы (2)


Убедитесь, что для вашего типа индекса уже настроено сопоставление "_ttl" : { "enabled" : true }. Затем передайте значение _ttl для вашего документа в _source. В вашем POJO добавьте это поле:

@JsonInclude(value=Include.NON_EMPTY)  //to make it optional
@JsonProperty("_ttl")
private Long ttl;
person Felipe    schedule 22.04.2016

Согласно этой открытой проблеме, похоже, что поле _ttl в настоящее время не поддерживается Spring Эластичный поиск данных.

Другой способ сделать это - «мягко удалить» записи из вашей базы данных, установив флаг (т.е. новый логический столбец). Флаг будет истинным, когда запись активна, и ложным, когда запись будет удалена. Таким образом, когда ваш процесс импорта будет запущен, вы получите все записи и, основываясь на этом флаге, узнаете, что вам нужно удалить документы из Elasticsearch.

person Val    schedule 21.08.2015
comment
Спасибо за ваше предложение. Обработка на уровне БД не вариант. - person user1578872; 21.08.2015